Я искал здесь и в Google, но я не нашел четкого объяснения, особенно в JS, это сложно.
Пусть var polyline — это двумерный массив значений x и y каждой точки полилинии.
var polyline = [[xa,ya],[xb,yb],....,[xn,yn]];
и var centerPt — это массив значений x и y случайно выбранной точки
Вот это было отредактировано:
var centerPt = [xctr,yctr];
//or
var centerPt = [[xctr,yctr]];
xctr ist not xc, то есть в полилинии массива
См рисунок 1 Пожалуйста.
и значения x, y многих точек, представленных также как двумерный массив
var edgePts = [[x1,y1],[x2,y2],...,[xmax,ymax]];
Пусть каждый луч начинается от центраPT до точки edgePts
//1st ray: from [xc,yc] to [x1,y1]
//2n ray: from [xc,yc] to [x2,y2]
// ...
// nth ray: from [xc,yc] to [xmax,ymax]
Я хотел бы получить идеи или ссылки для создания функции, например. intersectRayPoly(ray,polyline)
что дает точку пересечения х и у
Примечание: пожалуйста, без JQuery, чистый JS или простой C ++ в порядке
Заранее спасибо за каждую подсказку и извините за грамматические ошибки, мой английский не очень хорош 🙁
отредактированный:
Линия AB имеет уравнение y = mx +c
с m = (yB-yA)/(xB-xA)
Но здесь это луч, также один пересечение, а не два как это в случае линии
Суть проблемы — это функция, которая дает два сегмента (xa, ya)-(xb, yb)
а также (xc, yc)-(xd, yd)
возвращает пересечение, если оно есть.
Простой подход требует решения линейной системы двух уравнений с двумя неизвестными s
а также t
xa + s*(xb - xa) = xc + t*(xd - xc)
ya + s*(yb - ya) = yc + t*(yd - yc)
что в канонической форме
s*(xb - xa) + t*(xc - xd) = xc - xa
s*(yb - ya) + t*(yc - yd) = yc - ya
решение с правилом Крамера
delta = (xb-xa)*(yc-yd) - (yb-ya)*(xc-xd)
s = ((xc-xa)*(yc-yd) - (yc-ya)*(xc-xd)) / delta
t = ((xb-xa)*(yc-ya) - (yb-ya)*(xc-xa)) / delta
Если система не единственная (delta != 0
) и если оба s
а также t
между 0 и 1, то у вас есть правильная точка пересечения и координаты:
x = xa + s*(xb - xa)
y = ya + t*(yb - ya)
когда delta
0 или когда s
или же t
Если 0 или 1, вы находитесь в «крайних» случаях (например, частично перекрывающиеся сегменты, сегмент, касающийся другого, вырожденные сегменты с началом = конец и т. д.), и вам следует сначала решить, что вы хотите сделать в этих случаях.
Других решений пока нет …