Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
11-1213003972
Kent
2008-06-09 13:32
2010.03.07
Как сохранить данные в dfm


2-1262610112
Sunktor
2010-01-04 16:01
2010.03.07
Нужно разделить главное окно на несколько функциональных частей


15-1261394309
Б
2009-12-21 14:18
2010.03.07
Стрелки в Word 2007.


2-1262761116
Igor2100
2010-01-06 09:58
2010.03.07
Потоки+dll


15-1261416148
@!!ex
2009-12-21 20:22
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский