Как проверить пересекает ли линия picturebox ?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
u3er
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 04.05.2013 (Сб) 21:50

Как проверить пересекает ли линия picturebox ?

Сообщение u3er » 07.02.2022 (Пн) 23:15

Делаю игру проверка выстрелов попадания нужно проверить перекает ли нарисованная линия picturebox ?
У кого есть исходники спасибо.Нужно как на картинке но у меня нет такого исходника
Вложения
Безымянный.JPG
Безымянный.JPG (84.53 Кб) Просмотров: 1028

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как проверить пересекает ли линия picturebox ?

Сообщение Хакер » 08.02.2022 (Вт) 6:36

Господи, это же математика за 5—6 класс школы.

И что такое линия? Прямая (бесконечная), луч (имеет один конец) или отрезок (имеет 2 конца)?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Как проверить пересекает ли линия picturebox ?

Сообщение pronto » 08.02.2022 (Вт) 12:25

Здравствуйте!
Подсказка. Пересечение с прямоугольником сводится к пересечению с двумя его сторонами. Отрезок может пересекать две противолежащих или две прилежащих стороны прямоугольника.
Код: Выделить всё
' 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))
O, sancta simplicitas!

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Как проверить пересекает ли линия picturebox ?

Сообщение Mikle » 08.02.2022 (Вт) 14:14

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-угольник, в том числе невыпуклый.

u3er
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 04.05.2013 (Сб) 21:50

Re: Как проверить пересекает ли линия picturebox ?

Сообщение u3er » 08.02.2022 (Вт) 14:15

Хакер писал(а):Господи, это же математика за 5—6 класс школы.

И что такое линия? Прямая (бесконечная), луч (имеет один конец) или отрезок (имеет 2 конца)?

Спасибо за помощь ) математик )

u3er
Обычный пользователь
Обычный пользователь
 
Сообщения: 56
Зарегистрирован: 04.05.2013 (Сб) 21:50

Re: Как проверить пересекает ли линия picturebox ?

Сообщение u3er » 08.02.2022 (Вт) 14:26

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-угольник, в том числе невыпуклый.


Я нашел исходник вот http://vb-helper.com/howto_segments_intersect.html у меня неправильно проверяется как то но работает но неправильно нечетко определеяет пересечения не знаю как вершины проверять

Private Sub Command3_Click()
Me.Line (50, 100)-(100, 300)

If SegmentsIntersect(50, 100, 100, 300, Picture1.Left, Picture1.Top, Picture1.Width, Picture1.Height) Then
lblIntersects.Caption = "Intersect"
Else
lblIntersects.Caption = "Do not intersect"
End If
End Sub


Вот


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 35

    TopList