Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:курсач / SquareFinder1
.txt unit SquareFinder;
interface
uses DynStruct;
function FindSquares( listRoot : pPointNode ) : pSquareNode; передаем ссылку на корень списка точек и возвращаем ссылку на квадрат.
implementation
const
eps = 0.001;
function vecLength( v : tPoint ) : real; значение длинны вектора между двумя точками. передает координаты вектора
begin
result := sqrt( v.X * v.X + v.Y * v.Y );
end;
function vecOrth( v1, v2 : tPoint ) : boolean;
begin
result := ( v1.X * v2.X + v1.Y * v2.Y ) = 0;
end;
function FindSquares( listRoot : pPointNode ) : pSquareNode;
var tz1, tz2, tz3, tz4 : pPointNode;
v1, v2, v3, v4 : tPoint;
v1l, v2l, v3l, v4l : real;
Squares : pSquareNode;
begin
Squares := InitSquareList;
tz1 := listRoot^.Next;
while tz1 <> nil do
begin
tz2 := listRoot^.Next;
while tz2 <> nil do
begin
v1.X := tz2^.Point.X - tz1^.Point.X;
v1.Y := tz2^.Point.Y - tz1^.Point.Y;
v1l := vecLength( v1 );
if ( v1l > eps ) then
begin
tz3 := listRoot^.Next;
while tz3 <> nil do
begin
v2.X := tz3^.Point.X - tz2^.Point.X;
v2.Y := tz3^.Point.Y - tz2^.Point.Y;
v2l := vecLength( v2 );
if ( vecOrth( v1, v2 ) ) and ( v1l - v2l <= eps ) then
begin
tz4 := listRoot^.Next;
while tz4 <> nil do
begin
v3.X := tz4^.Point.X - tz3^.Point.X;
v3.Y := tz4^.Point.Y - tz3^.Point.Y;
v3l := vecLength( v3 );
if ( vecOrth( v2, v3 ) ) and ( v2l - v3l <= eps ) then
begin
v4.X := tz4^.Point.X - tz1^.Point.X;
v4.Y := tz4^.Point.Y - tz1^.Point.Y;
v4l := vecLength( v4 );
if ( vecOrth( v3, v4 ) ) and ( v3l - v4l <= eps ) then
begin
AddSquareNode( Squares, tz1^.Point, tz2^.Point, tz3^.Point, tz4^.Point );
end;
end;
tz4 := tz4^.Next;
end;
end;
tz3 := tz3^.Next;
end;
end;
tz2 := tz2^.Next;
end;
tz1 := tz1^.Next;
end;
result := Squares;
end;
end.
interface
uses DynStruct;
function FindSquares( listRoot : pPointNode ) : pSquareNode; передаем ссылку на корень списка точек и возвращаем ссылку на квадрат.
implementation
const
eps = 0.001;
function vecLength( v : tPoint ) : real; значение длинны вектора между двумя точками. передает координаты вектора
begin
result := sqrt( v.X * v.X + v.Y * v.Y );
end;
function vecOrth( v1, v2 : tPoint ) : boolean;
begin
result := ( v1.X * v2.X + v1.Y * v2.Y ) = 0;
end;
function FindSquares( listRoot : pPointNode ) : pSquareNode;
var tz1, tz2, tz3, tz4 : pPointNode;
v1, v2, v3, v4 : tPoint;
v1l, v2l, v3l, v4l : real;
Squares : pSquareNode;
begin
Squares := InitSquareList;
tz1 := listRoot^.Next;
while tz1 <> nil do
begin
tz2 := listRoot^.Next;
while tz2 <> nil do
begin
v1.X := tz2^.Point.X - tz1^.Point.X;
v1.Y := tz2^.Point.Y - tz1^.Point.Y;
v1l := vecLength( v1 );
if ( v1l > eps ) then
begin
tz3 := listRoot^.Next;
while tz3 <> nil do
begin
v2.X := tz3^.Point.X - tz2^.Point.X;
v2.Y := tz3^.Point.Y - tz2^.Point.Y;
v2l := vecLength( v2 );
if ( vecOrth( v1, v2 ) ) and ( v1l - v2l <= eps ) then
begin
tz4 := listRoot^.Next;
while tz4 <> nil do
begin
v3.X := tz4^.Point.X - tz3^.Point.X;
v3.Y := tz4^.Point.Y - tz3^.Point.Y;
v3l := vecLength( v3 );
if ( vecOrth( v2, v3 ) ) and ( v2l - v3l <= eps ) then
begin
v4.X := tz4^.Point.X - tz1^.Point.X;
v4.Y := tz4^.Point.Y - tz1^.Point.Y;
v4l := vecLength( v4 );
if ( vecOrth( v3, v4 ) ) and ( v3l - v4l <= eps ) then
begin
AddSquareNode( Squares, tz1^.Point, tz2^.Point, tz3^.Point, tz4^.Point );
end;
end;
tz4 := tz4^.Next;
end;
end;
tz3 := tz3^.Next;
end;
end;
tz2 := tz2^.Next;
end;
tz1 := tz1^.Next;
end;
result := Squares;
end;
end.
Соседние файлы в папке курсач