Пересечение отрезка отрезка линии - PullRequest
9 голосов
/ 23 мая 2011

Я пытаюсь определить точку, в которой отрезок отрезка пересекает окружность.Например, учитывая любую точку между P0 и P3 (а также при условии, что вы знаете радиус), какой самый простой способ определить P3?

circle

Ответы [ 5 ]

17 голосов
/ 23 мая 2011

Вообще,

  • найти угол между P0 и P1
  • проведите линию под этим углом от P0 на расстоянии r, что даст вам P3

в псевдокоде,

theta = atan2(P1.y-P0.y, P1.x-P0.x)
P3.x = P0.x + r * cos(theta)
P3.y = P0.y + r * sin(theta)
8 голосов
/ 23 мая 2011

Из центра круга и радиуса вы можете написать уравнение, описывающее круг. Из двух точек P0 и P1 вы можете написать уравнение, описывающее линию.

Итак, у вас есть 2 уравнения с 2 неизвестными, которые вы можете решить путем подстановки.

Пусть (x0, y0) = координаты точки P0

А (x1, y1) = координаты точки P1

А r = радиус круга.

Уравнение для круга:

(x-x0)^2 + (y-y0)^2 = r^2

Уравнение для линии:

(y-y0) = M(x-x0)  // where M = (y1-y0)/(x1-x0)

Включение второго уравнения в первое дает:

(x-x0)^2*(1 + M^2) = r^2

x - x0 = r/sqrt(1+M^2)

Точно так же вы можете найти, что

y - y0 = r/sqrt(1+1/M^2)

Точка (x, y) - это точка пересечения линии и круга, (x, y) - ваш ответ.

P3 = (x0 + r/sqrt(1+M^2), y0 + r/sqrt(1+1/M^2))
5 голосов
/ 22 февраля 2012

Перейти на этот код .. это сэкономит время

private boolean circleLineIntersect(float x1, float y1, float x2, float y2, float cx, float cy, float cr ) {
      float dx = x2 - x1;
      float dy = y2 - y1;
      float a = dx * dx + dy * dy;
      float b = 2 * (dx * (x1 - cx) + dy * (y1 - cy));
      float c = cx * cx + cy * cy;
      c += x1 * x1 + y1 * y1;
      c -= 2 * (cx * x1 + cy * y1);
      c -= cr * cr;
      float bb4ac = b * b - 4 * a * c;

      if(bb4ac<0){
          return false;    // No collision
      }else{
          return true;      //Collision
      }
    }
5 голосов
/ 23 мая 2011

У вас есть система уравнений. Круг определяется: x^2 + y^2 = r^2. Строка определяется как y = y0 + [(y1 - y0) / (x1 - x0)]·(x - x0). Подставив второе в первое, вы получите x^2 + (y0 + [(y1 - y0) / (x1 - x0)]·(x - x0))^2 = r^2. Решите это, и вы получите 0-2 значения для х. Вставьте их обратно в любое уравнение, чтобы получить значения для y.

1 голос
/ 24 июня 2017

КОД MATLAB

function [flag] = circleLineSegmentIntersection2 (Ax, Ay, Bx, By, Cx, Cy, R)

% A и B - две конечные точки отрезка, а C - центр окружность,% R - радиус окружности. Эта функция вычислить ближайшая точка от фронта C к сегменту%, если расстояние до ближайшая точка> R возврат 0 или 1

Dx = Bx-Ax;
Dy = By-Ay;

LAB = (Dx^2 + Dy^2);
t = ((Cx - Ax) * Dx + (Cy - Ay) * Dy) / LAB;

if t > 1
    t=1;
elseif t<0
    t=0;
end;


nearestX = Ax + t * Dx;
nearestY = Ay + t * Dy;

dist = sqrt( (nearestX-Cx)^2 + (nearestY-Cy)^2 );

if (dist > R )
 flag=0;
else
 flag=1;
end

конец

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...