Главная страница
    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.47 MB
Время: 0.006 c
2-1261824983
Егорка
2009-12-26 13:56
2010.03.07
Таймер


15-1261061893
Kerk
2009-12-17 17:58
2010.03.07
Wasserman Daily


2-1262771765
webpauk
2010-01-06 12:56
2010.03.07
Буфер обмена


2-1262704720
ЭлЭрДжи
2010-01-05 18:18
2010.03.07
БД в Delphi (очень важная лаба, помогите пожалуйста)


1-1220526665
evgenij
2008-09-04 15:11
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский