javascript — ломаная линия пересечения (не замкнутая, но может быть) и луч JS или переполнение стека

Я искал здесь и в 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)
Но здесь это луч, также один пересечение, а не два как это в случае линии

0

Решение

Суть проблемы — это функция, которая дает два сегмента (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, вы находитесь в «крайних» случаях (например, частично перекрывающиеся сегменты, сегмент, касающийся другого, вырожденные сегменты с началом = конец и т. д.), и вам следует сначала решить, что вы хотите сделать в этих случаях.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]