2017-01-31 2 views
0

В настоящее время я работаю над raycaster, но у меня есть одна проблема. Все настроено, теперь мне просто нужна небольшая математическая помощь, чтобы ответить на следующие вопросы, и я не мог найти простого объяснения, и мы еще не изучили такой продвинутый векторный материал в школе.Простое объяснение о проверке того, пересекается ли отрезок линии с сферой или кубом

1] У меня есть линия, идущая от, позволяет сказать, (0,0,0) до (50,50,50) теперь, как я могу узнать, если его пересекается со сферой, например, (м = (10, 10, 5), r = 5)? Да, я искал по всему интернету, но НИЧЕГО объясняется в векторах, но поскольку они не совпадают с строками, идущими от A до B, я никогда не нашел ничего полезного.

2] Я имею ту же линию сверху, но на этот раз я хочу, чтобы проверить, если она пересекается с кубом, т = (25,30,50), он имеет sidelenght 5 единиц. Как и прежде, пожалуйста, держите свое объяснение как можно более простым, я, кстати, работаю с Java.

+0

Если вы идете в coursera, есть бесплатные курсы по линейной алгебре. – CraigR8806

+1

google для бесконечного расстояния до точки, если он меньше или равен, чем 'r' вы попадаете в сферу ... или решаете:' p = p0 + (p1-p0) * t AND (px-sx)^2 + (py-sy)^2 + (pz-sz)^2 <= r^2' где 'p0, p1' - ваши точки линии,' sx, sy, sz' - ваш центр сферы и 'r' его радиус. Параметр 't' является параметром. 'p = (p.x, p.y, p.z)' находится в строке с параметром 't' – Spektre

+0

Каков параметр t, используемый для? –

ответ

1

1) Сфера: Идея состоит в том, чтобы найти расстояние от центра сферы до линии. Если оно больше, чем радиус -> снаружи, наоборот - внутри (и если равна -> на поверхности)

Уравнение линии, которая проходит через 2 точки А, В представляет собой

x = A.x + (B.x - A.x)*t 
y = A.y + (B.y - A.y)*t 
z = A.z + (B.z - A.z)*t 

расстояние от точки М до точки в линии АВ:

d(t) = Math.sqrt((x - M.x) * (x - M.x) + (y - M.y) * (y - M.y) + (z - M.z) * (z - M.z)) 

расстояние от точки М на линии АВ является самой короткой д (т)

Если мы устанавливаем

g(t) = (x - M.x) * (x - M.x) + (y - M.y) * (y - M.y) + (z - M.z) * (z - M.z) 

Мы будем иметь

d(t) = Math.sqrt(g(t)) 

Чтобы найти min(d(t)), мы попытаемся найти min(g(t)) вместо (так как функция производной будет проще).И найти min(g(t)), решить уравнение derivative(g(t)) = 0

Вы найдете

t = ((B.x - A.x)*(M.x - A.x) + (B.y - A.y)*(M.y - A.y) + 
(B.z - A.z)*(M.z - A.z))/((B.x - A.x)*(B.x - A.x) + (B.y - A.y)*(B.y - A.y) + (B.z - A.z)*(B.z - A.z)) 

Тогда вы можете найти d (или d * d)

2) Куб: Идея заключается в том, чтобы найти пересечение линии (AB) с каждой стороны куба и посмотреть, не имеет ли по крайней мере 1 стороны внутри квадрата

Вы ничего не говорите о том, имеет ли куб стороны параллельно w й координаты осей, но мы будем использовать этот случай (самый простой :))

уравнение прямой АВ такая же, как и в 1)

x = A.x + (B.x - A.x)*t 
y = A.y + (B.y - A.y)*t 
z = A.z + (B.z - A.z)*t 

Уравнения всех 8 сторон являются: (в вашем примере, д = 5)

X = M.x - d 
X = M.x + d 
Y = M.y - d 
Y = M.y + d 
Z = M.z - d 
Z = M.z + d 

Вы должны найти пересечение между AB с каждой стороны куба Например, АВ с Х = Мх -d

решить систему е quations:

x = A.x + (B.x - A.x)*t 
y = A.y + (B.y - A.y)*t 
z = A.z + (B.z - A.z)*t 
x = M.x - d 

Вы найдете:

x = M.x -d 
t = (M.x -d - A.x)/(B.x - A.x) .. then find y, z 

точка (х, у, г) находится внутри боковой X = Mx -d куба, если

M.y - d <= y <= M.y + d (and similar for z) 

И сделать то же самое для других сторон.

ПРИМЕЧАНИЕ: Если вы хотите проверить, является ли отрезок [AB] пересекается (достигает) сфера/куб, вам нужно проверить еще одно условия: Пересечение в сегменте [AB]

min(A.x, B.x) <= x <= max(A.x, B.x) 
min(A.y, B.y) <= y <= max(A.y, B.y) 
.. 

Надеюсь, он может вам помочь!

+0

Спасибо, очень за этот комментарий! –

+0

И да, это помогло мне: D –

+0

Могу ли я спросить, что «когда d = mininum (d (t))» означает? –

Смежные вопросы