Пересечение курсора с отрезком

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

Пересечение курсора с отрезком

Сообщение SergT » 10.07.2008 (Чт) 9:37

Доброе время суток всем участникам форума.
На PictureBox нарисованы Line (отрезки под разными углами).
Как определить, что курсор мыши пересекает конкретный отрезок?
Нужно, что бы при наведении курсора на конкретную Line, последняя изменила бы цвет. Если это невозможно, подскажите,пожалуйста, иное решение. Может быть это будет не Line, а что-то похожее.
Очень нужно! Заранее благодарен за любую помощь, идею или пример!
Л. Толстой, «зачем обдумывать обдуманное, бери готовое и иди дальше, в этом сила человечества»
"Всё в наших руках, поэтому их нельзя опускать" (Коко Шанель)

HKEY_SUPER_MASHINE
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 78
Зарегистрирован: 02.07.2008 (Ср) 12:17
Откуда: Тольятти, школа, случайно

Сообщение HKEY_SUPER_MASHINE » 10.07.2008 (Чт) 10:33

Сама линия никаких событий не имеет.
Но можно под этой линией нарисовать массив обьектов Image (если линия нарисована под углом), или один обьект параллельно линии (если линия горизонтальная или вертикальная).
Затем используй событие MouseMove Imageили массива обьектов.

К пояснению прилагаю проект, где на примере показано, где и как изменяется цвет линии
Вложения
Изменение цвета линии при наведении-образец.zip
Пример к описанию
(1.45 Кб) Скачиваний: 52
Последний раз редактировалось HKEY_SUPER_MASHINE 10.07.2008 (Чт) 10:46, всего редактировалось 1 раз.
Чипсы оставляют неприятный осадок в желудке
Их состав оставляет неприятный осадок в душе

SergT
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 237
Зарегистрирован: 22.06.2005 (Ср) 21:50
Откуда: Москва

Сообщение SergT » 10.07.2008 (Чт) 10:39

HKEY_SUPER_MASHINE писал(а):Сама линия никаких событий не имеет.
...

Собствено, в этом то и есть загвоздка :cry:

HKEY_SUPER_MASHINE писал(а):
Образец выложу через минуту.

Очень жду :D
Л. Толстой, «зачем обдумывать обдуманное, бери готовое и иди дальше, в этом сила человечества»
"Всё в наших руках, поэтому их нельзя опускать" (Коко Шанель)

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 10.07.2008 (Чт) 10:42

SergT
Линии нарисованы или это объекты Line? если именно нарисованы (а не накиданы в дизайнере), то просто отлавливай Mouse_Move на боксе и по координатам смотри, что подсвечивать. А вообще исходников графических редакторов (в том числе и векторных) на форуме - пруд-пруди...
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

HKEY_SUPER_MASHINE
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 78
Зарегистрирован: 02.07.2008 (Ср) 12:17
Откуда: Тольятти, школа, случайно

Сообщение HKEY_SUPER_MASHINE » 10.07.2008 (Чт) 10:50

Проект выложил. Смотри выше.
Чипсы оставляют неприятный осадок в желудке
Их состав оставляет неприятный осадок в душе

SergT
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 237
Зарегистрирован: 22.06.2005 (Ср) 21:50
Откуда: Москва

Сообщение SergT » 10.07.2008 (Чт) 10:55

Денис писал(а): А вообще исходников графических редакторов (в том числе и векторных) на форуме - пруд-пруди...

Что-то не обнаружил "пруд-пруди" :?

А линии - рисую на PictureBox мышкой и добавляю как новый объект Line
Л. Толстой, «зачем обдумывать обдуманное, бери готовое и иди дальше, в этом сила человечества»
"Всё в наших руках, поэтому их нельзя опускать" (Коко Шанель)

SergT
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 237
Зарегистрирован: 22.06.2005 (Ср) 21:50
Откуда: Москва

Сообщение SergT » 10.07.2008 (Чт) 11:23

HKEY_SUPER_MASHINE писал(а):Проект выложил. Смотри выше.

Спасибо. Как вариант. А имидж наклонить не реально?
Дело в том, что линии рисуются и добавляются (Line1(i))
Линий не может быть более 3-х сотен, однако...
Последний раз редактировалось SergT 10.07.2008 (Чт) 21:20, всего редактировалось 1 раз.
Л. Толстой, «зачем обдумывать обдуманное, бери готовое и иди дальше, в этом сила человечества»
"Всё в наших руках, поэтому их нельзя опускать" (Коко Шанель)

SergT
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 237
Зарегистрирован: 22.06.2005 (Ср) 21:50
Откуда: Москва

Сообщение SergT » 10.07.2008 (Чт) 11:55

Посмотрел проект vector_graphic от Хакера. Наверное попытаюсь пойти таким путем.
Последний раз редактировалось SergT 10.07.2008 (Чт) 21:21, всего редактировалось 1 раз.
Л. Толстой, «зачем обдумывать обдуманное, бери готовое и иди дальше, в этом сила человечества»
"Всё в наших руках, поэтому их нельзя опускать" (Коко Шанель)

Zenitchik
Постоялец
Постоялец
 
Сообщения: 369
Зарегистрирован: 21.12.2006 (Чт) 14:48

Сообщение Zenitchik » 10.07.2008 (Чт) 12:36

Я решал эту задачу через расчет расстояний до линий.


Линии у меня звали linA(index)
При клике достаточно близко от линии вызывается событие LinkClick (если и нажатие и отпускание кнопки мыши происходит вблизи одной той же линии).



Код: Выделить всё

Public Event LinkClick(ByVal Index As Integer)
Private m_CurLink As Integer

Private Sub UserControl_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim i As Integer, m As Single, j As Integer, m1 As Single
    m = 120: m1 = 120
    For i = 1 To linA.UBound
        With linA(i)
            If .Y1 = .Y2 And (.X1 - X) * (X - .X2) >= 0 Then
                m1 = Abs(.Y1 - Y)
            ElseIf (.X1 - X) * (X - .X2) >= 0 And (.Y1 - Y) * (Y - .Y2) >= 0 Then
                m1 = Abs((X - .X1) * (.Y2 - .Y1) + (Y - .Y1) * (.X1 - .X2)) / Sqr((.X2 - .X1) ^ 2 + (.Y2 - .Y1) ^ 2)
            End If
            If m1 < m Then
                m = m1: j = i
            End If
        End With
    Next i
    If j > 0 Then m_CurLink = j
End Sub

Private Sub UserControl_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim b As Boolean, i As Integer
    For i = 1 To linA.UBound
        With linA(i)
            If .Y1 = .Y2 Then
                If (.X1 - X) * (X - .X2) >= 0 And Abs(.Y1 - Y) < 60 Then
                    b = True
                End If
            ElseIf (.X1 - X) * (X - .X2) >= 0 And (.Y1 - Y) * (Y - .Y2) >= 0 Then
                If Abs((X - .X1) * (.Y2 - .Y1) + (Y - .Y1) * (.X1 - .X2)) / Sqr((.X2 - .X1) ^ 2 + (.Y2 - .Y1) ^ 2) < 160 Then
                    b = True
                End If
            End If
        End With
    Next i
    UserControl.MousePointer = IIf(b, 2, 0)
End Sub

Private Sub UserControl_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    With linA(m_CurLink)
        If (.X1 - X) * (X - .X2) >= 0 And ((.Y1 - Y) * (Y - .Y2) >= 0 Or .Y1 = .Y2) Then
            RaiseEvent LineClick(m_CurLink)
        End If
    End With
End Sub


Принцип действия мат.аппарата я уже забыл (каюсь, не было тогда у меня привычки коментировать) - почерпнул в книге по аналитической геометрии.
Знание английского языка - затрудняет понимание кода

SergT
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 237
Зарегистрирован: 22.06.2005 (Ср) 21:50
Откуда: Москва

Сообщение SergT » 10.07.2008 (Чт) 21:13

Zenitchik писал(а):Принцип действия мат.аппарата я уже забыл (каюсь, не было тогда у меня привычки коментировать) - почерпнул в книге по аналитической геометрии.


Все равно, спасибо! Попробую!

Меня вот тоже дети пристыдили. Вспомнили про отношение катетов... :oops: В общем, взял тетрадку, карандашик и нарисовал. Потом репу почесал и ... Вот что получилось...
Вложения
CrossMouse.zip
Вот,что получилось. Может быть кому еще потребуется
(9.64 Кб) Скачиваний: 40
Л. Толстой, «зачем обдумывать обдуманное, бери готовое и иди дальше, в этом сила человечества»
"Всё в наших руках, поэтому их нельзя опускать" (Коко Шанель)

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

Сообщение pronto » 11.07.2008 (Пт) 3:43

Все-таки лучше вычислять расстояние от курсора до линии. После беглого тестирования обнаружилась некорректная обработка двух случаев.

Добавлено позже: а еще лучше подставлять координаты курсора в уравнение отрезка и проверять, если равенство выполняется, то курсор находится над линией
Вложения
cross.gif
(9.45 Кб) Скачиваний: 44
O, sancta simplicitas!

HKEY_SUPER_MASHINE
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 78
Зарегистрирован: 02.07.2008 (Ср) 12:17
Откуда: Тольятти, школа, случайно

Сообщение HKEY_SUPER_MASHINE » 11.07.2008 (Пт) 7:53

Денис писал(а):Линии нарисованы или это объекты Line?

Мой метод верен и для объекта, и для нарисованной методом Line линией.
Чипсы оставляют неприятный осадок в желудке
Их состав оставляет неприятный осадок в душе


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 45

    TopList