forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Помогите проверить точку на принадлежность отрезку (http://forum.boolean.name/showthread.php?t=5303)

ABTOMAT 15.12.2007 01:14

Просьба затестить проверку точки на принадлежность отрезку
 
Мотематего.rar

В общем, пишу функцию, которая бы проверяла, принадлежит ли данная точка данному отрезку. Вроде, выходит, но иногда точки рассчитываются неверно (отрезок вертикален, горизонтален). Я даже собственную функцию написал, которая рисует линию, но с моим алгоритмом, чтобы понять, какие именно точки она пропускает/ставит лишние вопрос: если кто сталкивался с такой проблемой, как мне решить траблу с вертикальной линией? (с остальным тоже желательно, но не настолько важно)
В архиве исходники, где буквально каждая строка комментирована :)
WASD - двигать левый конец
Мышкой двигать точку. Если попадёшь на белый пиксель, то один, а если не попадёшь - то ноль. :)

moka 15.12.2007 11:43

Re: Помогите проверить точку на принадлежность отрезку
 
Ну я уже предлогал варриан:
Если сумма расстояний между A-C и B-C равна расстоянию между A-B то точка лежит на отрезке.

A и B - точки линии, С - точка проверки.

ABTOMAT 15.12.2007 12:37

Re: Помогите проверить точку на принадлежность отрезку
 
как решить проблему с вертикальной линией? Обычная y=k*x+b тут уже не работает. В принципе, можно руками пофиксить этот косяк:
Если начальная Х и конечная Х равны (т.е. отрезок вертикален)
то вычисляем х не по стандартному X = (Y-B)/K а просто Х всегда равен одному и тому же значению на протяженмм всего отрезка.

Есть ли другие варианты решения проблемы с вертикальной линией?

moka 15.12.2007 12:39

Re: Помогите проверить точку на принадлежность отрезку
 
ABTOMAT, мой варриант идёт КО ВСЕМ случаям, и не влияет на градус повёрнутости. Расстояние меж точек узнаёться по формуле теоремы пифогора.

ABTOMAT 15.12.2007 13:00

Re: Помогите проверить точку на принадлежность отрезку
 
MoKa, я ж те уже говорил вчера: у тебя три вычисления квадратного корня, который на блитзе не то чтобы даёт мега-производительность.
Ну и линию таким способом не построишь!
(Хотя я линию делал чтобы увидеть, какие точки, как считает прога, принадлежат линии)

moka 15.12.2007 13:05

Re: Помогите проверить точку на принадлежность отрезку
 
ABTOMAT, для построении линии, нада узнавать вектор смещения и длину, делать цикл на длину, и рисовать пиксель в позиции текущяя_длина*вектор_смещения. Всё просто.

ABTOMAT 15.12.2007 14:59

Re: Помогите проверить точку на принадлежность отрезку
 
Мотематего.rar

Исправил :-)
Теперь:
1. Нету глюков если линия вертикальна (не рисуется)
2. Нету глюков если линия почти горизонтальна (появляются посторонние точки)

Просьба затестить! (Извиняюсь, что нужно попадать единственным пикселем по тонкой линии, буду делать курсор, который опишу как два пересекающихся отрезка (крестик))

MoKa
, ну я ж уже говорил что этот способ не хочу юзать...

johnk 15.12.2007 15:25

Re: Помогите проверить точку на принадлежность отрезку
 
Молодец! Везде верно определяется.

ABTOMAT 15.12.2007 16:08

Re: Помогите проверить точку на принадлежность отрезку
 
Начну щас делать функцию проверки двух отрезков на пересечение

jimon 15.12.2007 21:09

Re: Помогите проверить точку на принадлежность отрезку
 
что мешает заюзать готовый велосипед ?

ABTOMAT 16.12.2007 00:40

Re: Помогите проверить точку на принадлежность отрезку
 
Цитата:

Сообщение от jimon
что мешает заюзать готовый велосипед ?

Что ты имеешь ввиду под готовым велосипедом?

jimon 16.12.2007 09:02

Re: Помогите проверить точку на принадлежность отрезку
 
формул и методов для данных нужд уже придумали тысячи
почему бы не использовать готовые ?

ABTOMAT 16.12.2007 13:24

Re: Помогите проверить точку на принадлежность отрезку
 
jimon, ну дык вроде y=kx+b не я и выдумывал...

HolyDel 16.12.2007 13:45

Re: Помогите проверить точку на принадлежность отрезку
 
ABTOMAT, y=kx+b - ето уравнение линии, а не отрезка.
определить пересечение линий намного проще чем пересечение отрезков - линии пересекаются если они не паралельны (т.е. |k1|<>|k2|).
с отрезками - ищи точки пересечения и проверяй их на принадлежность к отрезкам. (хотя, думаю есть масса более простых и производительных способов).
Jimon+1. Изобретать лисапеды - неблагодарное занятие, хотя мозги конечно тренируются, что есть гуд.

ABTOMAT 16.12.2007 15:14

Re: Помогите проверить точку на принадлежность отрезку
 
Цитата:

Сообщение от HolyDel
ABTOMAT, y=kx+b - ето уравнение линии, а не отрезка.
определить пересечение линий намного проще чем пересечение отрезков - линии пересекаются если они не паралельны (т.е. |k1|<>|k2|).
с отрезками - ищи точки пересечения и проверяй их на принадлежность к отрезкам. (хотя, думаю есть масса более простых и производительных способов).
Jimon+1. Изобретать лисапеды - неблагодарное занятие, хотя мозги конечно тренируются, что есть гуд.


Я уже кстати сделал определение пересечения линий, сейчас делаю проверку на отрезки:
Если вычисленная точка пересечения принадлежит обоим отрезкам, то они пересекаются
Цитата:

(т.е. |k1|<>|k2|)
Только я не понял почему у тебя тут модуль :4to: По-моему, как раз без него надо
Цитата:

мозги конечно тренируются, что есть гуд.
Ну, хоть мозги потренирую :) а то они у меня в математике хреново шарят

HolyDel 16.12.2007 15:22

Re: Помогите проверить точку на принадлежность отрезку
 
угу. как раз без него надо.

moka 16.12.2007 19:47

Re: Помогите проверить точку на принадлежность отрезку
 
Дык, линии 180 и -180 паралельны, как и 90 и 270, как -90 и 270 :) или нет?
Вообще, как понял твоим методом, ты будешь перебирать каждый пиксель пока не совпадёт? Получаеться у тебя будет колличество вычеслений Длина_1_линии^Длина_2_линии - это убийственно ;)

Чтож, пока не буду лезть вперёд и подожду решения ;)

ABTOMAT 16.12.2007 20:22

Re: Помогите проверить точку на принадлежность отрезку
 
http://www.rapidshara.ru/19381

мысленно представь себе продолжение белой линии и поставь туда мышкою отрезок,
Но чтоб он не задевал белую линию
(при этом B1 = B2 = 0)
И оно сосчитает, что один, а должно ведь ноль

MoKa, бугага, конечно нет ;)

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

Вроде, просто, но, что-то не работает :(

Это единственный случай, когда моя ф-я даёт неверный результат:
когда два параллельных отрезка лежат на одной прямой.

В любом случае просьба затестить.

ABTOMAT 16.12.2007 22:40

Re: Помогите проверить точку на принадлежность отрезку
 
Математика.rar
Опа, исправил тот глюк. Теперь всё работает. просьба затестить :)
WASD - двигать левый конец отрезка, стрелки - двигать правый конец.

HolyDel 16.12.2007 23:53

Re: Помогите проверить точку на принадлежность отрезку
 
все работает!

CRASHER 22.12.2013 21:08

Ответ: Помогите проверить точку на принадлежность отрезку
 
не хочу изобретать велосипед, темболее что у моего что то "цепь слетает")) Где можно сие расчеты взять?)

ABTOMAT 23.12.2013 01:00

Ответ: Помогите проверить точку на принадлежность отрезку
 
Цитата:

Сообщение от CRASHER (Сообщение 271793)
не хочу изобретать велосипед, темболее что у моего что то "цепь слетает")) Где можно сие расчеты взять?)

Судя по тому, что пост был сделан в 2007 году и архив выложен на рапидшаре, взять уже никак.
По воспоминаниям, там сделано было MAXIMUM TUPO: вычислялось уравнение прямой y=ax+b по двум данным точкам-концам, далее подставлялся x из проверяемой точки в это уравнение и сверялся результат y точки с y вычисленным. Помимо этого, естественно, вначале проверялось, находится ли x между двумя концами, иначе дальше считать бессмысленно.

CRASHER 23.12.2013 01:18

Ответ: Помогите проверить точку на принадлежность отрезку
 
ABTOMAT, я в своем велосипеде так и делал, но у меня какой то баг вылазит. Прога сообщала что нашла прямую на которой лежит точка, хотя этой прямой нет. Так как по ресурсам у меня запас в моем случае, делаю через расстояния с помощью корней, и вот такой интерестной штуки, которая как то работает)

p1-p2- точки линии

p3-точка проверки

е=0.000000000001
S=(x2-x1)*(y3-y1)-(x3-x1)*(y2-y1);
if abs(S)<e точка на линии

ЗЫ: я видел дату)) просто это первая тема, которая выпала по запорсу о точке)) еслиб капнул еще глубже, может и откапал бы чего еще))


Часовой пояс GMT +4, время: 14:18.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot