![]() |
|
|
![]()
|
|
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
У меня есть координаты двух точек. Между ними есть ребро. Как определить курсор (третья точка) лежит ли на этом ребре? Да и ещё что бы не точно на самом ребре (попасть курсором в тоненькую линию сложно) а в некоторой области ребра (недалеко от него)?
PS Координаты всех трех точек только целые значения. |
|||
|
||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 1 Всего: 37 |
A-------B------C
B лежит в области прямой AC, если|(AB {скалярно на} BC) рядом с 1.0.... |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Точно!
Добавлено @ 21:46 Ой! |
|||
|
||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 1 Всего: 37 |
Не понимаю почему -1... cos(0) = 1?(тока скалярное произведение надо поделить на произвадение длин)... а второе условие(попадание между A и C ) проверь так : |AB| < |AC|... (A-----C-----B) другой случай (B----A---C) не подойдет по cos, который будет в районе -1
|
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Хм, а если В---------------А? С---------В-----------А - условие |AB| < |AC| выполняется. первое тоже. Так не пойдёт
|
|||
|
||||
| Sartorius |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 1 Всего: 37 |
я же выше написал
Ну и хорошо , тебе же это расположение тоже подходит (C и A меняются местами а B по прежнему менжду ними на ребре) Это сообщение отредактировал(а) Sartorius - 28.11.2006, 22:55 |
||||
|
|||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 5 Всего: 99 |
Можно подойти к этой проблеме в 3d пространстве, а потом выкинуть лишнее вычисление.
Условия для это задачи будут вроже такими: 1. | AC x AB | <= Epsilon (этот как раз тот запас по расстоянии от отрезка) 2. AC * AB >= 0 Не проверял, но вроде так. Можно попробовать посчитать для нескольких случаев слепив векторы из координат точек и добавив z=0. По формулам можно будет понять, что останется от AC x AB... -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Мне нужно определить где С находится. На этом отрезке или нет? |
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 5 Всего: 99 |
Посмотри на этот рисунок (если я где-нибудь не прав - поправьте)...
Присоединённый файл ( Кол-во скачиваний: 18 )
otrezok.jpg 169,57 Kb-------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
cardinal, | AC x AB | - что это за произведение? И Что такое АС, АВ? Вектора? еz?
Это сообщение отредактировал(а) Elfet - 29.11.2006, 09:17 |
|||
|
||||
| cardinal |
|
|||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 5 Всего: 99 |
-------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Попробовал я с произведением - не совсем то что хотелось бы. Так как разная точность получается с разных концов ребра.
А как можно определить длину от точки до прямой? |
|||
|
||||
| kashka |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 117 Регистрация: 29.11.2004 Где: Wolfenbuettel, Ge rmany Репутация: нет Всего: 1 |
если точка лежит на прямой, ее можно представить как:
t*p1 + (1- t)p2 = p3, 0<=t<=1 находишь t, если 0<=t<=1, значит p3 лежит на отрезке прямой p1, p2 |
|||
|
||||
| sergejzr |
|
|||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 4 Всего: 360 |
Elfet, я бы на твоём месте просто проврял на принадлежность к прямой. А то, что мышью трудно попасть - почти решается тем, что просто изменишь курсор, когда мышь на отрезок наедет.
Добавлено @ 15:42 хотя самое простое - вырешать уравнение прямой, y=ax+b, и смотреть совпадения точки с y=ax+b+d где d в интервале -2 до 2. Уравнение прямой между (x1,y1) и (x2,y2) a=(y2-y1/x2-x1) b=y1-a*x1 => y=(y2-y1/x2-x1)*x+(y1-a*x1) Проверка, принадлежит ли точка к прямой: в функцию y=a*x+b подставляешь x точки. Если ответ совпадает с y точки, она на прямой По моему 4 или 5 класс средней школы... Добавлено @ 15:47 Да, если у тебя действительно отрезок (x1,y1) (x2,y2), а не прямая, просто дополнительно проверяй точку (x,y) на х<мах(х1,х2)&&х>min(х1,х2)&&y<max(y1,y2)&&y>min(y1,y2); |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
проверять точно нельзя, т.к. координаты курсора целые, а прямая (в аналитическом смысле) может проходить по нецелым координатам, так что равенство достигнуто не будет никогда, кроме того сравнивать действительные числа на точное равенство вообще не рекомендуется
ИМХО, из предложенных вариант со скалярным произведением наиболее прост ну, если нужно точно задавать допустимое расстояние, то нужно будет считать расстояние от курсора до прямой -------------------- qqq |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |