Changeset 172


Ignore:
Timestamp:
Nov 24, 2017, 10:11:54 AM (7 years ago)
Author:
chronos
Message:
  • Fixed: Rectangle points were not normalized.
  • Fixed: Error in rect to polygon conversion.
Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Packages/Common/UGeometry.pas

    r171 r172  
    66
    77uses
    8   Classes, SysUtils, Math, typinfo;
     8  Classes, SysUtils, Math;
    99
    1010type
     
    5151    function Center: T;
    5252    procedure SetEmpty;
     53    procedure Normalize;
    5354    class operator Equal(const A, B: TGRect<T>): Boolean;
    5455    constructor Create(const P1, P2: T);
     
    201202  Self.Points[0] := Rect.P1;
    202203  Self.Points[1] := T.Create(Rect.P2.X, Rect.P1.Y);
    203   Self.Points[2] := Rect.P1;
     204  Self.Points[2] := Rect.P2;
    204205  Self.Points[3] := T.Create(Rect.P1.X, Rect.P2.Y);
    205206end;
     
    320321function TGLine<T>.ToRect: TGRect<T>;
    321322begin
    322   Result.P1 := P1;
    323   Result.P2 := P2;
     323  Result := TGRect<T>.Create(P1, P2);
    324324end;
    325325
     
    461461end;
    462462
     463procedure TGRect<T>.Normalize;
     464var
     465  NewP1: T;
     466  NewP2: T;
     467begin
     468  NewP1 := P1.Min(P1, P2);
     469  NewP2 := P1.Max(P1, P2);
     470  P1 := NewP1;
     471  P2 := NewP2;
     472end;
     473
    463474function TGRect<T>.Center: T;
    464475begin
     
    481492  Self.P1 := P1;
    482493  Self.P2 := P2;
     494  Normalize;
    483495end;
    484496
  • trunk/UMap.pas

    r171 r172  
    239239{ TVoronoiMap }
    240240
    241 function CompareDistance(C1, C2: Pointer): Integer;
    242 begin
    243   if TCellsDistance(C1).Distance > TCellsDistance(C2).Distance then Result := 1
    244   else if TCellsDistance(C1).Distance < TCellsDistance(C2).Distance then Result := -1
    245   else Result := 0;
    246 end;
    247 
    248 function CompareDistanceReverse(const C1, C2: TCellsDistance): Integer;
    249 begin
    250   if C1.Distance > C2.Distance then Result := -1
    251   else if C1.Distance < C2.Distance then Result := 1
     241function CompareDistance(const C1, C2: TCellsDistance): Integer;
     242begin
     243  if C1.Distance > C2.Distance then Result := 1
     244  else if C1.Distance < C2.Distance then Result := -1
    252245  else Result := 0;
    253246end;
     
    321314    CellsDistance.Add(NewCellDist);
    322315  end;
    323   CellsDistance.Sort(CompareDistanceReverse);
     316  CellsDistance.Sort(CompareDistance);
    324317
    325318  // Keep shortest non-intersected cell pairs
    326319  SelectedCells := TFPGObjectList<TCellsDistance>.Create;
    327320  SelectedCells.FreeObjects := False;
    328   I := CellsDistance.Count - 1;
    329   while I >= 0 do begin
     321  I := 0;
     322  while I < CellsDistance.Count do begin
    330323    Intersected := False;
    331324    for J := 0 to SelectedCells.Count - 1 do
     
    347340    end;
    348341    if not Intersected then SelectedCells.Add(CellsDistance[I]);
    349     Dec(I);
     342    Inc(I);
    350343  end;
    351344
Note: See TracChangeset for help on using the changeset viewer.