Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
Delphi 10.4 Sydney
|
AW: Abschlussprojekt FIAE (Optimierung von Algorithmen) -> Vergleich von Polygonen
16. Mär 2022, 10:52
Wenn ich mich jetzt nicht verguckt habe, kann man die Hauptfunktion auch etwas verkürzen zu:
Delphi-Quellcode:
function CompareBothLists(AFirstList,
ASecondList: TCadVec3List; ADirectional, AFirstListOpen, ASecondListOpen: Boolean): Boolean;
var
LFirstTmpList,LSecondTmpList: TCadVec3List;
function PleaseChangeToAMeaningfulName(const AList1, AList2: TCadVec3List; const ADirectional: Boolean): Boolean;
var
i: Integer;
begin
Result := False;
for i := 0 to AList2.Count - 1 do
begin
if IsListItemEqual(AList1[0], AList2[i]) then
begin
Result := CompareClosedPolygon(AList1, AList2, i, ADirectional);
if Result then
Break;
end;
end;
end;
function PleaseChangeToAMeaningfulName2(const AList: TCadVec3List): Boolean;
begin
Result := IsListItemEqual(AList.First, AList.Last);
if Result then
begin
AList.Delete(AList.Count - 1);
end;
end;
begin
// Vergleich der Listen bzw. der Polygone und ob diese geometrisch gleich, oder ungleich sind.
// Hierbei werden verschiedene Rahmenbedingungen und Szenarien aufgeführt -> geschlossene Polygone, offene Polygone, geschlossenes/offenes Polygon.
LFirstTmpList := TCadVec3List.Create;
LSecondTmpList := TCadVec3List.Create;
try
Result := False;
if (AFirstList = nil) or (ASecondList = nil) then
Exit;
LFirstTmpList.AddRange(AFirstList);
LSecondTmpList.AddRange(ASecondList);
RemoveIdenticalFromList(LFirstTmpList, AFirstListOpen);
RemoveIdenticalFromList(LSecondTmpList, ASecondListOpen);
if (AFirstListOpen = ASecondListOpen) and (LFirstTmpList.Count <> LSecondTmpList.Count) then
Exit;
if not AFirstListOpen and not ASecondListOpen then
begin
Result := PleaseChangeToAMeaningfulName(LFirstTmpList, LSecondTmpList, ADirectional);
end
else if AFirstListOpen and ASecondListOpen then
begin
Result := CompareOpenPolygons(LFirstTmpList, LSecondTmpList, ADirectional)
end
else if AFirstListOpen and not ASecondListOpen then
begin
if PleaseChangeToAMeaningfulName2(LFirstTmpList) then
begin
Result := PleaseChangeToAMeaningfulName(LFirstTmpList, LSecondTmpList, ADirectional);
end;
end
else
begin
if PleaseChangeToAMeaningfulName2(LSecondTmpList) then
begin
Result := PleaseChangeToAMeaningfulName(LSecondTmpList, LFirstTmpList, ADirectional);
end;
end;
finally
LSecondTmpList.Free;
LFirstTmpList.Free;
end;
end;
Ob jetzt Subroutinen oder eigene freistehende Funktionen ist Geschmackssache.
|
|
Zitat
|