Предположим, мы дали следующее:
P1 = (px1, py1) ... line point 1
P2 = (px2, py2) ... line point 2
P1h = (px1, py1, 1) ... homogenous coordinates of line point 1
P2h = (px2, py2, 1) ... homogenous coordinates of line point 2
lh = P1h x P2h ... homogenous coordinates of line (computed with cross product)
v = (vx, vy) ... vector of ball movement
B1 = (bx1, by1) ... ball position 1
B2 = (bx2, by2) = B1 + v ... ball position 2
B1h = (bx1, by1, 1) ... homogenous coordinates of ball position 1
B2h = (bx2, by2, 1) ... homogenous coordinates of ball position 2
Затем мы можем определить, пересек ли шар линию, сравнивая знаки следующих скалярных произведений:
ball crossed line <==> sign(B1h*lh) != 0 and sign(B1h*lh) != sign(B2h*lh)
Чтобы отразить движение, вы можете вычислить зеркальные изображения B1m
и B2m
из B1
и B2
, соответственно, через линию.Тогда B2m
- это новая позиция шара, а vm = B2m - B1m
- это новое (зеркальное) направление движения шара.
Как вычислить зеркальное отображение точки P
по линии l
?Предположим, что
P = (px, py) ... point to be mirrored
Ph = (px, py, 1) ... homogenous coordinates of point to be mirrored
Также отметим, что (lh.x, lh.y)
является нормальным вектором линии l
.Теперь выполните следующие шаги для вычисления зеркального отображения Pm
из P
по l
:
|nl| = sqrt(lh.x^2+lh.y^2) ... length of normal vector
lh0 = lh / |nl| ... "normalized" homogenous line, i.e. HNF (Hesse normal form) of line
d = Ph*lh0 ... signed distance of P to l
lhP0 = lh0 + (0,0,d) ... HNF of line parallel to l running through Pm
mh0 = (lh0.y, -lh0.x, 0) ... HNF of line perpendicular to l (parallel to line
through P and Pm)
md = mh0*Ph ... signed distance of P to mh0
mhP0 = mh0 - (0,0,md) ... HNF of line through P and Pm
Pmh = lhP0 x mhP0 ... homogenous coordinates of mirrored point Pm