Главная страница
    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.48 MB
Время: 0.041 c
2-1161090702
varlam87
2006-10-17 17:11
2006.11.05
Как считать (записать) значение бита?


3-1157536802
Sanal23
2006-09-06 14:00
2006.11.05
Помогите разобраться?


15-1160985175
Kolan
2006-10-16 11:52
2006.11.05
Объект с разной ртруктурой..


1-1159230544
Lex_!
2006-09-26 04:29
2006.11.05
Расчет по формуле из БД


15-1161001717
Rwer
2006-10-16 16:28
2006.11.05
Самое эффективное решение





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