Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];

Вниз

геометрия   Найти похожие ветки 

 
~Aid~   (2006-10-22 19:45) [0]

даны четыре точки типа TPoint
подскажите какой алгоритм использовать чтобы определить, является ли фигура построенная на этих 4 точках квадратом?


 
Eraser ©   (2006-10-22 19:47) [1]

> [0] ~Aid~   (22.10.06 19:45)

длины всех линий должны быть равны, и хотя бы один угол должен равняться 90 гр.


 
~Aid~   (2006-10-22 19:52) [2]

а можно готовым алгоритмом?описанным на Delphi


 
Eraser ©   (2006-10-22 19:54) [3]

> [2] ~Aid~   (22.10.06 19:52)

у меня нету.
алгоритм я уже сказал, а как его реализовать - см. справочник математики, раздел про вектора.


 
~Aid~   (2006-10-22 19:59) [4]

найдите в неем ошибку

function square(a,b,c,d:Tpoint):boolean;
begin
if ((rs(a,c)=rs(b,d)) and (rs(a,b)=rs(c,d)) and (rs(a,d)=rs(b,c)) and (abs(sl(a,b,c,d))<pogr))
  or (abs(sl(a,d,b,c))<pogr) or (abs(sl(a,c,b,d))<pogr) then square:=true
 else square:=false;
end;

где function rs(a,b:TPoint):double;
begin
  rs:=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
end;

function sl(a,b,c,d:Tpoint):double;
begin
sl:=(b.x-a.x)*(c.x-d.x)+(b.y-a.y)*(c.y-d.y);
end;


 
guav ©   (2006-10-22 19:59) [5]

Самый понятный - это без углов, четыре стороны равны и две диагонали равны.
Самое быстрое думаю будет если при повороте на 90*  одного вектора стороны получаем другой и так для всех четырёх или то же самое для -90*.
Поворот на 90* newX := -Y; newY := X;


 
~Aid~   (2006-10-22 20:06) [6]

guav
поподробнее с повоотом?

учти что вся геометрия решается с определенной точностью


 
guav ©   (2006-10-22 20:09) [7]

Что-то вроде этого (не проверял, удивлюсь если работает).
function IsTurned90Degrees(const A, B, C: TPoint): Boolean;
begin
 Result := ((B.X - C.X) = -(B.Y - A.Y)) and
   ((B.Y - C.Y) = (B.X - A.X));
end;

function IsSquare(const A, B, C, D: TPoint): Boolean;
begin
 Result := (IsTurned90Degrees(A, B, C) and  IsTurned90Degrees(B, C, D))
   or (IsTurned90Degrees(C, B, A) and  IsTurned90Degrees(D, C, B));

end;



> учти что вся геометрия решается с определенной точностью

Т.е. приблизительно квадрат тоже должен быть квадратом ?


 
~Aid~   (2006-10-22 20:11) [8]

Т.е. приблизительно квадрат тоже должен быть квадратом ?

да.. то есть сам понимаешь округление. расстояния могут не быть равными а вектора при повороте не давать нужных векторов


 
Anatoly Podgoretsky ©   (2006-10-22 20:15) [9]

Математический сопроцессор имеет ограниченную точно, на что постоянно нарываются, как на садовые грабли. Поэтому квадрат в программирование всегда приблизителен, кроме редких случаев


 
guav ©   (2006-10-22 20:16) [10]

> [8] ~Aid~   (22.10.06 20:11)

Тогда

> ((rs(a,c)=rs(b,d)) and (rs(a,b)=rs(c,d)) and (rs(a,d)=rs(b,
> c))

здесь тоже нужно сравнивать учитывая эпсилон.

кстати, такой код не годился бы даже если требовалось бы определять только точные квадраты.


 
guav ©   (2006-10-22 20:18) [11]

> [9] Anatoly Podgoretsky ©   (22.10.06 20:15)

У меня точный, если конечно работает :-)


 
~Aid~   (2006-10-22 20:21) [12]

я знаю что мой не годится....
вот и ищу...

проверь свой плиз


 
guav ©   (2006-10-22 20:32) [13]

> [12] ~Aid~   (22.10.06 20:21)

Мой таки работает, но только для точных квадратов пиксель в пискель.
Ошибка у меня есть, что все вычитания в скобках должны быть наоборот, но она компенсирует сама себя.

У тя ошибка в том что ((rs(a,c)=rs(b,d))
надо ((rs(a,c)-rs(b,d)<pogr) . Может ещё где ошибки есть

Почитай http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374 .


 
~Aid~   (2006-10-22 20:40) [14]

guav да у тебя все работает все хорошо

спасибо большое что помог.


 
Kolan ©   (2006-10-22 21:08) [15]

> Самый понятный - это без углов, четыре стороны равны и две
> диагонали равны.

Сне вот этот метод понравился. Нужна функция:
function LineLength(Point1, Point2: TPoint): Double;
она просто расчитывает длинну линии от точки до точки.

А потом в нее подставляй и сё.
Квадрат такой:
Point1     Point2

Point3     Point4


четыре стороны равны:
LineLength(Point1, Point2) - LineLength(Point3, Point4) = Inaccuracy
LineLength(Point1, Point3) - LineLength(Point2, Point4) = Inaccuracy


Ну и так далее....


 
icWasya ©   (2006-10-23 09:28) [16]

и вместо углов можно проверять равентсво диагоналей


 
palva ©   (2006-10-23 09:57) [17]

В данной задаче для проверки равенства длин экономнее проверять равенство квадратов длин.
Интересно во сколько раз больше времени требуется сопроцессору для вычисления квадратного корня, чем для вычисления квадрата. Никто не в курсе? Может быть одно и то же время будет? Или сильно зависит от модели?


 
palva ©   (2006-10-23 10:18) [18]

Я померял у меня получилось 6016 для извлечения квадратов и 3266 для возведения в квадрат, т. е. раза в два.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.038 c
3-1157530066
DelphiLexx
2006-09-06 12:07
2006.11.05
OnSetText на Lookup поле - возникают проблемы


6-1146778260
Sergio77
2006-05-05 01:31
2006.11.05
данные от сервера INDY всем клиентам INDY


15-1160751654
oldman
2006-10-13 19:00
2006.11.05
Возвращаясь к теме ХР...


2-1161615466
abba
2006-10-23 18:57
2006.11.05
Посчитать число слов в строке?


1-1159148047
Lex_!
2006-09-25 05:34
2006.11.05
Перненос данных в Excel шаблон.





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