H>>Прямая задана двумя точками.
AJ>Пусть это точки (x1,y1) и (x2,y2). AJ>Уравнение прямой, проходящей через AJ>две заданные точки:
AJ> y — y1 x — x1 AJ> ------ = ------ AJ> y2- y1 x2- x1
AJ>Тогда подставляем проверяемую точку AJ>в уравнение вместо (x,y) и проверяем AJ>равенство. AJ>Если оно выполняется, значит точка AJ>лежит на прямой.
AJ>Алекс
Спасибо Алекс, только это принадлежность прямой вообще, а для отрезка надо проверить еще нахождение точки на отрезке используя координаты х крайних точек.
Еще раз спасибо. Игорь.
Re[3]: Как определить принадлежность точк отрезку прямой?
Здравствуйте Harry, вы писали:
H>Здравствуйте Alex Jenter, вы писали:
H>>>Прямая задана двумя точками.
AJ>>Пусть это точки (x1,y1) и (x2,y2). AJ>>Уравнение прямой, проходящей через AJ>>две заданные точки:
AJ>> y — y1 x — x1 AJ>> ------ = ------ AJ>> y2- y1 x2- x1
AJ>>Тогда подставляем проверяемую точку AJ>>в уравнение вместо (x,y) и проверяем AJ>>равенство. AJ>>Если оно выполняется, значит точка AJ>>лежит на прямой.
AJ>>Алекс
H>Спасибо Алекс, только это принадлежность прямой вообще, а для отрезка надо проверить еще нахождение точки на отрезке используя координаты х крайних точек.
H>Еще раз спасибо. Игорь.
После проверки на принадлежность прямой проверьте величину первой или второй составляющей уравнения. Если отношение (y-y1)/(y2-y1) или (x-x1)/(x2-x1) принадлежит [0...1], то точка находится на отрезке.(Это легко выводится из параметрического уравнения прямой)
Re[4]: Как определить принадлежность точк отрезку прямой?
Здравствуйте Барташевич Андрей Игоревич, вы писали:
БАИ>Здравствуйте Harry, вы писали:
H>>Здравствуйте Alex Jenter, вы писали:
H>>>>Прямая задана двумя точками.
AJ>>>Пусть это точки (x1,y1) и (x2,y2). AJ>>>Уравнение прямой, проходящей через AJ>>>две заданные точки:
[skip]
Помоему есть способ гораздо проще и изящнее: ;))
Если сумма расстояний от первой точки до искомой и от искомой точки до второй равна, с некоторой погрешностью, расстоянию от первой точки до второй, то искомая точка как раз и лежит между первой и второй... Расстояние между двумя точками считается как
SQRT(X2*X2+Y2*Y2)-SQRT(X1*X1+Y1*Y1)
Мы уже победили, просто это еще не так заметно...
Re[5]: Как определить принадлежность точк отрезку прямой?
M>Помоему есть способ гораздо проще и изящнее: ;)) M>Если сумма расстояний от первой точки до искомой и от искомой точки до второй равна, с некоторой погрешностью, расстоянию от первой точки до второй, то искомая точка как раз и лежит между первой и второй... Расстояние между двумя точками считается как M>SQRT(X2*X2+Y2*Y2)-SQRT(X1*X1+Y1*Y1)
способ действительно лучше так как в нём нет деления ато прямая у тебя вертикальная а ты делишь на x2-x1 :)
и на Pentiumax без лишних if-ов быстрее будет
Здравствуйте Merle, вы писали:
M>Помоему есть способ гораздо проще и изящнее: ;)) M>Если сумма расстояний от первой точки до искомой и от искомой точки до второй равна, с некоторой погрешностью, расстоянию от первой точки до второй, то искомая точка как раз и лежит между первой и второй... Расстояние между двумя точками считается как M>SQRT(X2*X2+Y2*Y2)-SQRT(X1*X1+Y1*Y1)
Проще — возможно (хотя сомнительно), и уж точно не изящнее. Заметим, что делить в первом способе совсем не обязательно. Все замечательно сводится к сложению, умножению и проверке знака. Это уж всяко точнее и проще, чем вычисление корня.
Re[6]: Как определить принадлежность точк отрезку прямой?
Здравствуйте Alex Ostapenko, Вы писали:
AO>Проще — возможно (хотя сомнительно), и уж точно не изящнее. Заметим, что делить в первом способе совсем не обязательно. Все замечательно сводится к сложению, умножению и проверке знака. Это уж всяко точнее и проще, чем вычисление корня.
Кстати нужно не забыть обработать корректно случаи вертикального или горизонтального отрезка, а то нехорошо может получится.
-------------------------------------------------------------------
Вызывает презедент к себе коров и говорит:
— Ну, что будем сдавать, молоко или мясо?
(с) Г. Явлинский TV6 — Герой дня (18.04.2002)
Re[5]: Как определить принадлежность точк отрезку прямой?
Здравствуйте Merle, Вы писали:
M>Если сумма расстояний от первой точки до искомой и от искомой точки до второй равна, с некоторой погрешностью, расстоянию от первой точки до второй, то искомая точка как раз и лежит между первой и второй... Расстояние между двумя точками считается как M>SQRT(X2*X2+Y2*Y2)-SQRT(X1*X1+Y1*Y1)
Ну-ну... Пусть (x1,y1)=(0,1), а (x2,y2)=(1,0). Подставляем в эту формулу и имеем:
sqrt(1*1+0*0)-sqrt(0*0+1*1) = 0
То есть эти две точки совпадают. :))
Правильная формула:
R = SQRT((x1-x2)^2 + (y1-y2)^2)
Стало быть, проверяем равенство R1+R2=R. Кстати, если возвести это равенство в квадрат, то можно избавиться от вычисления одного их трёх корней. А если возвести его в квадрат 2 раза, можно избавиться от всех остальных корней, но придётся наложить дополнительное условие:
4*r1*r2 = (r-r1-r2)^2, и при этом r-r1-r2>=0
Здесь r,r1,r2 имеют смысл R=sqrt(r), R1=sqrt(r1), R2=sqrt(r2). Так что если корни не нравятся, то нет проблем...
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re: Как определить принадлежность точк отрезку прямой?
Здравствуйте Harry, Вы писали:
H>Прямая задана двумя точками.
А можно уточнить, точку которую вы хотите проверить не являтся ли точкой пересечения двух отрезков (по уравнению прямых)? Если да, то достаточно просто проверить, попадает ли точка в описывающие прямоугольники двух отрезков (естественно увеличив их на некую величину точности).
С Уважением, Повшедный Андрей.
Re[6]: Как определить принадлежность точк отрезку прямой?
Уравнение прямой. Координаты X,Y — точка принадлежность
которой надо проверить.
Offset — величина допустимой погрешности
Y — Y1 X — X1
--------- = ----------
Y2 — Y1 X2 — X1
Private Function IsSegmentHasPoint( ByVal X As Single, ByVal Y As Single, _
ByVal X1 As Single, ByVal Y1 As Single, _
ByVal X2 As Single, ByVal Y2 As Single, _
ByVal Offset As Single ) As Boolean
Dim arg1 As Single, arg2 As Single
Dim bRes As Boolean, f As Boolean
f = False
'Horz-Line case
If X1 = X2 Then
f = True
arg1 = X1 — X
End If
'Vert-Line case
If Y1 = Y2 Then
f = True
arg1 = Y1 — Y
End If
If f = True Then
If Abs(arg1) > Offset Then
bRes = False
Else
bRes = True
End If
If Abs(arg1) > Offset Then
IsSegmentHasPoint = False
Exit Function
End If
'Segment Has Point
If X >= X1 And X <= X2 Then
IsSegmentHasPoint = True
Else
IsSegmentHasPoint = False
End If
End Function
-------------------------------------------------------------------
Вызывает презедент к себе коров и говорит:
— Ну, что будем сдавать, молоко или мясо?
(с) Г. Явлинский TV6 — Герой дня (18.04.2002)