Главная страница
    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.46 MB
Время: 0.006 c
2-1262083308
citizen
2009-12-29 13:41
2010.03.07
Непрерывная слежка за событием


15-1261220394
@!!ex
2009-12-19 13:59
2010.03.07
Где прочитать отзывы про WiMax оборудование?


2-1262618923
Делфией
2010-01-04 18:28
2010.03.07
Не могу придумать как распознать в каком контроле вызван Аction


2-1262196060
Ivan
2009-12-30 21:01
2010.03.07
Вопрос по скроллингу


15-1261575599
Fscivi
2009-12-23 16:39
2010.03.07
delphi. opengl





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский