Форум: "Начинающим";
Текущий архив: 2010.03.07;
Скачать: [xml.tar.bz2];
ВнизПринадлежность точки отрезку Найти похожие ветки
← →
AntonioBanderas (2010-01-02 23:19) [0]Нашел в своем старом конспекте такую формулу, но видимо она не верна, подскажите что не так?
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;
← →
Virgo_Style © (2010-01-02 23:32) [1]Лень вникать в формулу, но скорее всего ты просто не попадаешь в мышкой отрезок.
С той точностью, которую ты установил, я имею в виду.
Измени на if abs(z)<delta, где delta - какое-то небольшое число, подбираемое экспериментально. Если все равно не получится - то таки надо проверить формулу.
← →
AntonioBanderas (2010-01-02 23:45) [2]
> abs(z)<delta
я четко бью.
А вот вопрос не правильно я задал, формула кажется правильная
А на строке:
Z := (X2-X1)/(ClickX-X1)-(Y2-Y1)/(ClickY-Y1);
вылетает: "Invalid floating point operation". Как можно это побороть?
обрезать Z до нужной точности
← →
Дмитрий С © (2010-01-03 00:13) [3]На ноль делишь, видимо.
Я бы сперва проверил принадлежит ли точка прямой в которой лежит отрезок по формуле:
(ClickX - x1) / (x2 - x1) = (ClickY - y1) / (y2 - y1)
Если принадлежит, проверил бы
(ClickX >= min(x1,x2))
and(ClickX <= max(x1,x2))
Случай когда x1=x2 или y1=y2 рассмотри сам
← →
Anatoly Podgoretsky © (2010-01-03 00:14) [4]> AntonioBanderas (02.01.2010 23:45:02) [2]
Любое из выражений может быть равно нулю.
← →
имя (2010-01-03 01:07) [5]Удалено модератором
← →
Демо © (2010-01-03 07:45) [6]
> Z: Extended;begin Z := (X2-X1)/(ClickX-X1)-(Y2-Y1)/(ClickY-
> Y1);
1. Поменяй числители и знаменатели местами.
2. Прямая состоит не только из точек с целочисленными координатами, поэтому см.
> Virgo_Style © (02.01.10 23:32) [1]
← →
AntonioBanderas (2010-01-03 22:50) [7]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-04 06:00) [8]
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 перенёс бы в блок констант. Зачем лишнее присваивание?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.03.07;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c