Главная страница
    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
15-1261435653
Piter
2009-12-22 01:47
2010.03.07
Отпуск с точки зрения ТК РФ


15-1261651233
ZeroDivide
2009-12-24 13:40
2010.03.07
Нужны WMR, отдам Яндекс.Деньги


15-1261522440
Германн
2009-12-23 01:54
2010.03.07
Static IP. Чем он(о) опасен?


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


1-1238692057
SergN
2009-04-02 21:07
2010.03.07
Как узнать каким приложением занят файл





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский