Как вы можете найти координаты между двумя заданными точками на прямой (JavaScript)? - PullRequest
0 голосов
/ 10 октября 2018

Я хочу получить все координаты x, y, z между двумя заданными точками по прямой линии.Я должен быть в состоянии сделать это в JavaScript, чтобы проверить, сталкивается ли снаряд в моей игре.

Так, например:

Точка 1: (0,0,0) Точка 2:(2,2,2) -> 0,0,0 - 1,1,1, 2,2,2

Правка, вот рабочий код для любого, кто потерян.

def ROUND(a):

return int(a + 0.5)

def drawDDA (x1, y1, z1, x2, y2, z2):

x,y,z = x1,y1,z1

length = (x2-x1) if (x2-x1) > (y2-y1) else (y2-y1) if (y2-y1) > (z2-z1) else (z2-z1)

dx = (x2-x1)/float(length)

dy = (y2-y1)/float(length)

dz = (z2-z1)/float(length)

print (ROUND(x),ROUND(y),ROUND(z))

for i in range(length):

    x += dx
    z += dz
    y += dy

    print(ROUND(x),ROUND(y),ROUND(z)) 

drawDDA (0,1,2,10,11,12)

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Спасибо за всю помощь, я смог решить эту проблему с помощью упомянутого алгоритма DDA.Я добавил версию Python в свой вопрос и обновлю ее до JavaScript, если кто-то еще захочет.

0 голосов
/ 10 октября 2018

Ваш текущий подход должен иметь дело с квадрантами в 2D и октантами в 3D, что является болью в заднице.если вместо этого вы используете DDA (что очень похоже), вы избавитесь от этого.Итак:

P(t) = P0 + t*(P1-P0)
t=<0.0,1.0

Это также называется Линейная интерполяция .Поскольку между двумя вашими конечными точками P0,P1 существует бесконечное количество точек P(t) Я предполагаю, что вам нужны только целые числа (представляющие PIXELS), поэтому вам нужно выбрать t с шагом в один пиксель и округлить или выровнять координаты P(t).Это просто:

dP = abs(P1-P0)
dt = 1.0/max(dP.x,dP.y,dP.z)

это называется растеризация линии и может также переноситься на целочисленную арифметику без необходимости использования чисел с плавающей запятой.Портированная версия выглядит следующим образом:

dP = abs(P1-P0)
T = max(dP.x,dP.y,dP.z)
t = {0,1,2,...,T}
P(t) = P0 + (P1-P0)*t/T

И даже это можно улучшить, заменив *t/T простым условным увеличением / уменьшением внутри цикла, например:

Для этого также существуют разные алгоритмы, такие как Bresenham, но DDA быстрее на современных архитектурах, а также намного проще и легко расширяется до любой размерности.

...