![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Принадлежность точки отрезку [D7]
AntonioBanderas © (2010-01-02 23:19:00)Нашел в своем старом конспекте такую формулу, но видимо она не верна, подскажите что не так?
function CrossPoint(X1, Y1, X2, Y2, ClickX, ClickY: Integer): Boolean;
var
Z: Extended;
begin
Z := (X2-X1)/(ClickX-X1)-(Y2-Y1)/(ClickY-Y1);
if Z = 0 then
begin
Result := true;
Exit;
end;
Result := false;
end;
Демо (2010-01-04 06:00:00) [1]
if ABS(Z) < delta then
begin
if (ClickX >= min(X1,X2)) and (ClickX <= max(X1,X2)) then
if (ClickY >= min(Y1,Y2)) and (ClickY <= max(Y1,Y2)) then
begin
Result := true;
Exit;
end;
end;
1. Вот это я бы заменил на
Result := (ABS(Z)<delta) and
(ClickX>=min(X1,X2) and (ClickX<=max(X1,X2) and
(ClickY>=min(Y1,Y2) and (ClickY<=max(Y1,Y2);
А строкуResult := Falseубрал бы совсем.
2. Убрал бы try...except...end- здесь абсолютно ненужная конструкция.
3. delta перенёс бы в блок констант. Зачем лишнее присваивание?
AntonioBanderas (2010-01-03 22:50:00) [2]Cпасибо всем.
function CrossPoint(X1, Y1, X2, Y2, ClickX, ClickY: Integer): Boolean;
var
Z: Extended;
delta: Real;
begin
delta := 0.2;
try
if X1 = X2 then
Z := X1 - ClickX
else
if Y1 = Y2 then
Z := Y1 - ClickY
else
Z := (ClickX-X1)/(X2-X1) - (ClickY-Y1)/(Y2-Y1);
if ABS(Z) < delta then
begin
if (ClickX >= min(X1,X2)) and (ClickX <= max(X1,X2)) then
if (ClickY >= min(Y1,Y2)) and (ClickY <= max(Y1,Y2)) then
begin
Result := true;
Exit;
end;
end;
except on E: Exception do
end;
Result := false;
end;
Демо (2010-01-03 07:45:00) [3]
> Z: Extended;begin Z := (X2-X1)/(ClickX-X1)-(Y2-Y1)/(ClickY-
> Y1);
1. Поменяй числители и знаменатели местами.
2. Прямая состоит не только из точек с целочисленными координатами, поэтому см.
> Virgo_Style © (02.01.10 23:32) [1]
(2010-01-03 01:07:00) [4]Удалено модератором
Anatoly Podgoretsky (2010-01-03 00:14:00) [5]> AntonioBanderas (02.01.2010 23:45:02) [2]
Любое из выражений может быть равно нулю.
Дмитрий С (2010-01-03 00:13:00) [6]На ноль делишь, видимо.
Я бы сперва проверил принадлежит ли точка прямой в которой лежит отрезок по формуле:
(ClickX - x1) / (x2 - x1) = (ClickY - y1) / (y2 - y1)
Если принадлежит, проверил бы
(ClickX >= min(x1,x2))
and(ClickX <= max(x1,x2))
Случай когда x1=x2 или y1=y2 рассмотри сам
AntonioBanderas (2010-01-02 23:45:00) [7]
> abs(z)<delta
я четко бью.
А вот вопрос не правильно я задал, формула кажется правильная
А на строке:
Z := (X2-X1)/(ClickX-X1)-(Y2-Y1)/(ClickY-Y1);
вылетает: 'Invalid floating point operation'. Как можно это побороть?
обрезать Z до нужной точности
Virgo_Style (2010-01-02 23:32:00) [8]Лень вникать в формулу, но скорее всего ты просто не попадаешь в мышкой отрезок.
С той точностью, которую ты установил, я имею в виду.
Измени на if abs(z)<delta, где delta - какое-то небольшое число, подбираемое экспериментально. Если все равно не получится - то таки надо проверить формулу.