2014-11-24 5 views
0

Я хотел бы найти способ узнать, нажимаю ли я на строке. У меня есть стандартный 2D-план с квадратом, например, и между ними. Я хотел бы обнаружить, когда я нажимаю на строку. Линия может быть горизонтальной, вертикальной или с углом. У меня есть эти данные на линии:Обнаружение щелкните по строке

-Starting координат (х, у)

-Ending координат (х, у)

-The положение мыши (х, у)

Я мог бы получить угол с tan(). Я нашел это решение, но я не могу добавить событие мыши: How to select a line

Спасибо.

+0

Еще не проверено, я не могу сказать, если это поможет. – ILoveWaffle

ответ

0

Позвольте S и E быть конечными точками сегмента и M мыши.

вектор, который соединяет M к точке SE задается MS+t.SE, где 0<t<1.

площади этот вектор, чтобы получить его (квадрат) длина: d²=SE²t²+2(SE.MS)t+MS²,

и найти положение минимума, t=-(SE.MS)/SE².

Если t<=0, кратчайшее расстояние до S, следовательно d²=MS².

Если t>=1, кратчайшее расстояние до E, следовательно d²=ME².

Else, кратчайшее расстояние до точки на сегменте и d²=MS²-(SE.MS)²/SE².

Нет необходимости принимать квадратный корень, потому что d<Tolerance эквивалентен d²<Tolerance².

+0

Я сделал что-то подобное. Возьмем x, y, x1, y2, x2, y2 - M.X, M.Y, S.X, S.Y., E.X, E.Y. (x - x1)/(x2 - x1) = (y - y1)/(y2 - y1) скажите мне, если я нажму на строку. Как я могу терпеть это? Это очень интересно. – ILoveWaffle

+0

Сравнение наклонов имеет два недостатка: 1. он работает для бесконечных линий, а не для сегментов линии. 2. пособие становится все больше и больше, когда вы отходите от P1. –

0

Посмотрите на этот ответ:

Shortest distance between a point and a line segment

Они вычислить кратчайшее расстояние от точки до отрезка.

Вычислив это значение, вы можете принять или отклонить событие щелчка мыши:

if (distanceToSegment(...) < threshold && mouseClicked()) { 
    // insert code here 
} 

порог будет зависеть от того, насколько точным вы хотите, чтобы пользователь.

+0

Если я возьму конечную точку моей линии и точку мыши, и это тот же угол, что и линия, значит ли это щелчок по строке? – ILoveWaffle

+0

Я думаю, что важно различать линию и сегмент. То, что вы говорите, верно для строки, но не для сегмента. Вы можете щелкнуть вне сегмента. Вам нужно будет проверить, что точка также находится в одном и том же интервале X – purpletentacle

+1

Теперь также имейте в виду, что разрешение может быть очень высоким, вы хотите дать пользователю некоторый запас за ошибку. Именно по этой причине расчет расстояния может быть удобным и приведет к гораздо более надежному подходу. – purpletentacle

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