Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.03.07;
Скачать: CL | DM;

Вниз

Принадлежность точки отрезку   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.012 c
1-1238605534
dests
2009-04-01 21:05
2010.03.07
Пропало окно с ошибками в интерфейсе Delphi


15-1261447784
xayam
2009-12-22 05:09
2010.03.07
Проект Россия 3


3-1235981052
Sergey2
2009-03-02 11:04
2010.03.07
Связать 2 таблицы


2-1262457629
Lordalexander
2010-01-02 21:40
2010.03.07
Окна


15-1261258220
Юрий
2009-12-20 00:30
2010.03.07
С днем рождения ! 20 декабря 2009 воскресенье