![]() |
|
24-07-2009 13:04 (ссылка)
Re: Как вам это!!!
Теоретически это сделать можно - присвоить адрес ячейки, хранящийся в Result, если, конечно, типы совпадают, но зачем?
Комментарии запрещены
Александр Чукреев
24-07-2009 18:09 (ссылка)
Re: Как вам это!!!
Функция создаёт треугольник из рёбер. Рёбра это указатели на записи и содержат указатели на точки и указатели на треугольники которым принадлежат. Это надо для навигации, типа как узнать с каким треугольником соседствует этот треугольник, по этой грани.
Комментарии запрещены
Александр Чукреев
25-07-2009 00:26 (ссылка)
Re: Как вам это!!!
{Указатели}
MyPointPointer = ^MyPointNode; {Точка}
MyRibPointer = ^MyRibNode; {Рёбро}
MyTrianglePointer = ^MyTriangleNode; {Триугольник}
{Записи}
MyPointNode = record {Точка}
X, Y, Z: Currency; {Координаты}
end;
MyRibNode = record {Рёбро}
{слева на право, сверху вниз}
Nodes: array[1..2] of MyPointPointer; {Точки}
Triangles: array[1..2] of MyTrianglePointer; {Триугольники которым принадлежит данное ребро}
end;
MyTriangleNode = record {Триугольник}
{слева на право, сверху вниз}
viz: boolean; {Флаг посещения}
Ribs: array[1..3] of MyRibPointer; {Список рёбер}
end;
function CreateTriNode(var Rib1, Rib2, Rib3: MyRibPointer): MyTrianglePointer;
{Pre: Даны указатели на рёбра.
Post: Возвращён указатель на треугольник.}
var
ArrFunct: array[1..3] of MyLineFunct;
I: Integer;
begin
ArrFunct[1]:= Getkb(Rib1^.Nodes[1]^, Rib1^.Nodes[2]^);
ArrFunct[2]:= Getkb(Rib2^.Nodes[1]^, Rib2^.Nodes[2]^);
ArrFunct[3]:= Getkb(Rib3^.Nodes[1]^, Rib3^.Nodes[2]^);
{Проверяем НЕ паролельность!}
if (ArrFunct[1].k<>ArrFunct[2].k) or (ArrFunct[1].k<>ArrFunct[3].k) or (ArrFunct[2].k<>ArrFunct[3].k) then
begin
new(Result); Result^.viz:=false;
Result^.Ribs[1]:=Rib1; Result^.Ribs[2]:=Rib2; Result^.Ribs[3]:=Rib3;
{!!! Указатели на триугольник!!!}
for I := 1 to 3 do if Result^.Ribs[I]^.Triangles[1]=nil
then Result^.Ribs[I]^.Triangles[1]:= Result
else Result^.Ribs[I]^.Triangles[2]:= Result;
end
else Result:=nil;
end;
MyPointPointer = ^MyPointNode; {Точка}
MyRibPointer = ^MyRibNode; {Рёбро}
MyTrianglePointer = ^MyTriangleNode; {Триугольник}
{Записи}
MyPointNode = record {Точка}
X, Y, Z: Currency; {Координаты}
end;
MyRibNode = record {Рёбро}
{слева на право, сверху вниз}
Nodes: array[1..2] of MyPointPointer; {Точки}
Triangles: array[1..2] of MyTrianglePointer; {Триугольники которым принадлежит данное ребро}
end;
MyTriangleNode = record {Триугольник}
{слева на право, сверху вниз}
viz: boolean; {Флаг посещения}
Ribs: array[1..3] of MyRibPointer; {Список рёбер}
end;
function CreateTriNode(var Rib1, Rib2, Rib3: MyRibPointer): MyTrianglePointer;
{Pre: Даны указатели на рёбра.
Post: Возвращён указатель на треугольник.}
var
ArrFunct: array[1..3] of MyLineFunct;
I: Integer;
begin
ArrFunct[1]:= Getkb(Rib1^.Nodes[1]^, Rib1^.Nodes[2]^);
ArrFunct[2]:= Getkb(Rib2^.Nodes[1]^, Rib2^.Nodes[2]^);
ArrFunct[3]:= Getkb(Rib3^.Nodes[1]^, Rib3^.Nodes[2]^);
{Проверяем НЕ паролельность!}
if (ArrFunct[1].k<>ArrFunct[2].k) or (ArrFunct[1].k<>ArrFunct[3].k) or (ArrFunct[2].k<>ArrFunct[3].k) then
begin
new(Result); Result^.viz:=false;
Result^.Ribs[1]:=Rib1; Result^.Ribs[2]:=Rib2; Result^.Ribs[3]:=Rib3;
{!!! Указатели на триугольник!!!}
for I := 1 to 3 do if Result^.Ribs[I]^.Triangles[1]=nil
then Result^.Ribs[I]^.Triangles[1]:= Result
else Result^.Ribs[I]^.Triangles[2]:= Result;
end
else Result:=nil;
end;
Комментарии запрещены