Делаю игру проверка выстрелов попадания нужно проверить перекает ли нарисованная линия picturebox ?
У кого есть исходники спасибо.Нужно как на картинке но у меня нет такого исходника
' L1s.x - Х1 первого отрезка
' L1s.y - Y1 первого отрезка
' L1e.x - X2 первого отрезка
' L1e.y - Y2 первого отрезка
'
' L2s.x - Х1 второго отрезка
' L2s.y - Y1 второго отрезка
' L2e.x - X2 второго отрезка
' L2e.y - Y2 второго отрезка
ret.x = ((L1s.x - L1e.x) * (L2e.x * L2s.y - L2s.x * L2e.y) - (L2s.x - L2e.x) * (L1e.x * L1s.y - L1s.x * L1e.y)) / _
((L2s.x - L2e.x) * (L1e.y - L1s.y) - (L1s.x - L1e.x) * (L2e.y - L2s.y))
ret.y = ((L1e.y - L1s.y) * (L2e.x * L2s.y - L2s.x * L2e.y) - (L2e.y - L2s.y) * (L1e.x * L1s.y - L1s.x * L1e.y)) / _
((L2e.y - L2s.y) * (L1s.x - L1e.x) - (L1e.y - L1s.y) * (L2s.x - L2e.x))
pronto писал(а):Пересечение с прямоугольником сводится к пересечению с двумя его сторонами. Отрезок может пересекать две противолежащих или две прилежащих стороны прямоугольника.
Private Function TestCollision() As Boolean
Dim F As Boolean
Dim i As Long
Dim i1 As Long
For i = 0 To 3
i1 = (i + 1) And 3
F = F Or ((CCW(Subt(L(0), L(1)), Subt(P(i), L(0))) * CCW(Subt(L(0), L(1)), Subt(P(i1), L(0))) < 0) And _
(CCW(Subt(P(i), P(i1)), Subt(L(0), P(i))) * CCW(Subt(P(i), P(i1)), Subt(L(1), P(i))) < 0))
Next i
TestCollision = F
End Function
Private Function Subt(V1 As Vector, V2 As Vector) As Vector
Subt.X = V1.X - V2.X
Subt.Y = V1.Y - V2.Y
End Function
Private Function CCW(V1 As Vector, V2 As Vector) As Single
CCW = V1.X * V2.Y - V1.Y * V2.X
End Function
Хакер писал(а):Господи, это же математика за 5—6 класс школы.
И что такое линия? Прямая (бесконечная), луч (имеет один конец) или отрезок (имеет 2 конца)?
Mikle писал(а):pronto писал(а):Пересечение с прямоугольником сводится к пересечению с двумя его сторонами. Отрезок может пересекать две противолежащих или две прилежащих стороны прямоугольника.
На сколько понял, достаточно пересечения с одной стороной - одна из вершин отрезка может лежать внутри прямоугольника.
В твоём методе нужно учитывать возможность деления на 0.
Вот пересечение отрезка с прямоугольником:
- Код: Выделить всё
Private Function TestCollision() As Boolean
Dim F As Boolean
Dim i As Long
Dim i1 As Long
For i = 0 To 3
i1 = (i + 1) And 3
F = F Or ((CCW(Subt(L(0), L(1)), Subt(P(i), L(0))) * CCW(Subt(L(0), L(1)), Subt(P(i1), L(0))) < 0) And _
(CCW(Subt(P(i), P(i1)), Subt(L(0), P(i))) * CCW(Subt(P(i), P(i1)), Subt(L(1), P(i))) < 0))
Next i
TestCollision = F
End Function
Private Function Subt(V1 As Vector, V2 As Vector) As Vector
Subt.X = V1.X - V2.X
Subt.Y = V1.Y - V2.Y
End Function
Private Function CCW(V1 As Vector, V2 As Vector) As Single
CCW = V1.X * V2.Y - V1.Y * V2.X
End Function
L(0), L(1) - вектора, концы отрезка.
P(0), P(1), P(2), P(3) - вектора, вершины прямоугольника по порядку (не важно, по ч с, или против). Может быть любой N-угольник, в том числе невыпуклый.
Сейчас этот форум просматривают: AhrefsBot и гости: 63