Changeset 86 for trunk/UEngine.pas


Ignore:
Timestamp:
Jun 21, 2022, 5:04:48 PM (23 months ago)
Author:
chronos
Message:
  • Fixed: Calculation of tracks end.
  • Modified: Updated Common package to version 0.10.
  • Modified: Build with Lazarus 2.2.2.
  • Modified: Used Generics.Collections instead of fgl for generic lists.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/UEngine.pas

    r84 r86  
    11unit UEngine;
    22
    3 {$mode delphi}
    43{$IFDEF DARWIN}{$modeswitch Objectivec1}{$ENDIF}
    54
     
    76
    87uses
    9   {$IFDEF Darwin}MacOSAll, CocoaAll, CocoaUtils,{$ENDIF}
     8  {$IFDEF DARWIN}MacOSAll, CocoaAll, CocoaUtils,{$ENDIF}
    109  Classes, SysUtils, Graphics, Controls, ExtCtrls, Math, DateUtils,
    11   UMetaCanvas, fgl, UMenu, UControls;
     10  UMetaCanvas, Generics.Collections, Generics.Defaults, UMenu, UControls;
    1211
    1312type
     
    5756  { TMapStations }
    5857
    59   TMapStations = class(TFPGObjectList<TMapStation>)
     58  TMapStations = class(TObjectList<TMapStation>)
    6059    Engine: TEngine;
    6160    function GetRect: TRect;
     
    7170  { TLineStations }
    7271
    73   TLineStations = class(TFPGObjectList<TLineStation>)
     72  TLineStations = class(TObjectList<TLineStation>)
    7473    Line: TMetroLine;
    7574    function SearchMapStation(Station: TMapStation): TLineStation;
     
    105104  { TTrackPoints }
    106105
    107   TTrackPoints = class(TFPGObjectList<TTrackPoint>)
     106  TTrackPoints = class(TObjectList<TTrackPoint>)
    108107    Track: TTrack;
    109108    function AddNew: TTrackPoint;
     
    122121  { TTrackLinks }
    123122
    124   TTrackLinks = class(TFPGObjectList<TTrackLink>)
     123  TTrackLinks = class(TObjectList<TTrackLink>)
    125124    Track: TTrack;
    126125    function SearchPoints(Point1, Point2: TTrackPoint): TTrackLink;
     
    140139  { TTracks }
    141140
    142   TTracks = class(TFPGObjectList<TTrackLink>)
     141  TTracks = class(TObjectList<TTrackLink>)
    143142    function SearchPointUp(TrackPoint: TTrackPoint; Skip: TTrackLink): TTrackLink;
    144143    function SearchPointDown(TrackPoint: TTrackPoint; Skip: TTrackLink): TTrackLink;
     
    156155  { TTrackPointsAngleGroup }
    157156
    158   TTrackPointsAngleGroup = class(TFPGObjectList<TTrackPointsAngle>)
     157  TTrackPointsAngleGroup = class(TObjectList<TTrackPointsAngle>)
    159158    function SearchAngle(Angle: Double): TTrackPointsAngle;
    160159  end;
     
    164163  TMetroLine = class
    165164  private
     165    procedure UpdateEndingLine(EndIndex, Direction: Integer);
    166166    procedure UpdateEndingLines;
    167167  public
     
    182182  { TMetroLines }
    183183
    184   TMetroLines = class(TFPGObjectList<TMetroLine>)
     184  TMetroLines = class(TObjectList<TMetroLine>)
    185185    Engine: TEngine;
    186186    function AddNew: TMetroLine;
     
    194194  end;
    195195
    196   TMetroCarriages = class(TFPGObjectList<TMetroCarriage>)
     196  TMetroCarriages = class(TObjectList<TMetroCarriage>)
    197197  end;
    198198
     
    224224  { TMetroTrains }
    225225
    226   TMetroTrains = class(TFPGObjectList<TMetroTrain>)
     226  TMetroTrains = class(TObjectList<TMetroTrain>)
    227227    function GetUnusedTrain: TMetroTrain;
    228228    function GetUnusedCount: Integer;
     
    239239  { TMetroPassengers }
    240240
    241   TMetroPassengers = class(TFPGObjectList<TMetroPassenger>)
     241  TMetroPassengers = class(TObjectList<TMetroPassenger>)
    242242    Engine: TEngine;
    243243    function AddNew: TMetroPassenger;
     
    251251  end;
    252252
    253   TRivers = class(TFPGObjectList<TRiver>)
     253  TRivers = class(TObjectList<TRiver>)
    254254  end;
    255255
     
    499499begin
    500500  Points := TTrackPoints.Create;
    501   Points.FreeObjects := False;
     501  Points.OwnsObjects := False;
    502502end;
    503503
     
    627627begin
    628628  TrackLinks := TTrackLinks.Create;
    629   TrackLinks.FreeObjects := False;
     629  TrackLinks.OwnsObjects := False;
    630630end;
    631631
     
    751751begin
    752752  NeighPoints := TTrackPoints.Create;
    753   NeighPoints.FreeObjects := False;
     753  NeighPoints.OwnsObjects := False;
    754754  NeighLinks := TTrackLinks.Create;
    755   NeighLinks.FreeObjects := False;
     755  NeighLinks.OwnsObjects := False;
    756756end;
    757757
     
    888888{ TMetroLine }
    889889
    890 procedure TMetroLine.UpdateEndingLines;
     890procedure TMetroLine.UpdateEndingLine(EndIndex, Direction: Integer);
    891891var
    892892  Index: Integer;
     
    894894  Angle: Double;
    895895  EndPoint: TPoint;
     896begin
     897{  if Direction = 1 then Index := Track.Points.IndexOf(LineStations.Last.TrackPoint)
     898    else if Direction = -1 then Index := Track.Points.IndexOf(LineStations.Last.TrackPoint);
     899  if Index = EndIndex then begin
     900    NewTrackPoint := Track.Points.AddNew;
     901    if Direction = 1 then Track.Points.Insert(EndIndex, NewTrackPoint)
     902    else if Direction = -1 then begin
     903      Inc(EndIndex);
     904      Track.Points.Insert(EndIndex, NewTrackPoint);
     905    end;
     906  end;
     907 }
     908  Angle := ArcTan2((Track.Points[EndIndex + 2 * Direction].PositionDesigned.Y -
     909    Track.Points[EndIndex + Direction].PositionDesigned.Y),
     910    (Track.Points[EndIndex + 2 * Direction].PositionDesigned.X -
     911    Track.Points[EndIndex + Direction].PositionDesigned.X));
     912  EndPoint := Point(Round(Track.Points[EndIndex + Direction].PositionDesigned.X - EndStationLength * Cos(Angle)),
     913    Round(Track.Points[EndIndex + Direction].PositionDesigned.Y - EndStationLength * Sin(Angle)));
     914  Track.Points[EndIndex].PositionDesigned := EndPoint;
     915  Track.Points[EndIndex].Position := EndPoint;
     916end;
     917
     918procedure TMetroLine.UpdateEndingLines;
     919var
     920  Index: Integer;
     921  NewTrackPoint: TTrackPoint;
    896922begin
    897923  if LineStations.Count >= 2 then begin
     
    906932      Track.Points.Insert(Track.Points.Count, NewTrackPoint);
    907933    end;
    908 
    909     Angle := ArcTan2((Track.Points[2].PositionDesigned.Y - Track.Points[1].PositionDesigned.Y),
    910       (Track.Points[2].PositionDesigned.X - Track.Points[1].PositionDesigned.X));
    911     EndPoint := Point(Round(Track.Points[1].PositionDesigned.X - EndStationLength * Cos(Angle)),
    912       Round(Track.Points[1].PositionDesigned.Y - EndStationLength * Sin(Angle)));
    913     Track.Points.First.PositionDesigned := EndPoint;
    914     Track.Points.First.Position := EndPoint;
    915 
    916     Angle := ArcTan2((Track.Points[Track.Points.Count - 2].PositionDesigned.Y - Track.Points[Track.Points.Count - 3].PositionDesigned.Y),
    917       (Track.Points[Track.Points.Count - 2].PositionDesigned.X - Track.Points[Track.Points.Count - 3].PositionDesigned.X));
    918     EndPoint := Point(Round(Track.Points[Track.Points.Count - 2].PositionDesigned.X + EndStationLength * Cos(Angle)),
    919       Round(Track.Points[Track.Points.Count - 2].PositionDesigned.Y + EndStationLength * Sin(Angle)));
    920     Track.Points.Last.PositionDesigned := EndPoint;
    921     Track.Points.Last.Position := EndPoint;
     934    UpdateEndingLine(0, 1);
     935    UpdateEndingLine(Track.Points.Count - 1, -1);
    922936  end;
    923937end;
     
    11001114begin
    11011115  LineStations := TLineStations.Create;
    1102   LineStations.FreeObjects := True;
     1116  LineStations.OwnsObjects := True;
    11031117  Trains := TMetroTrains.Create;
    1104   Trains.FreeObjects := False;
     1118  Trains.OwnsObjects := False;
    11051119  Track := TTrack.Create;
    11061120  Track.Line := Self;
     
    11971211begin
    11981212  Passengers := TMetroPassengers.Create;
    1199   Passengers.FreeObjects := False;
     1213  Passengers.OwnsObjects := False;
    12001214  Carriages := TMetroCarriages.Create;
    12011215  Direction := 1;
     
    12301244begin
    12311245  TrackLinks := TTrackLinks.Create;
    1232   TrackLinks.FreeObjects := False;
     1246  TrackLinks.OwnsObjects := False;
    12331247
    12341248  // Collect all near track points as track links
     
    12901304      with TrackLinks[J] do begin
    12911305        // Get orthogonal angle
    1292         HAngle := Angle + Pi / 2;
    1293         if HAngle > Pi then HAngle := HAngle - Pi;
     1306        HAngle := (Angle + Pi / 2) mod Pi;
    12941307        NewShift.X := Trunc(MetroLineThickness * Cos(HAngle) * (J - (TrackLinks.Count - 1) / 2));
    12951308        NewShift.Y := Trunc(MetroLineThickness * Sin(HAngle) * (J - (TrackLinks.Count - 1) / 2));
     
    13021315end;
    13031316
    1304 function MapStationCompareLine(const Item1, Item2: TMetroLine): Integer;
     1317function MapStationCompareLine(constref Item1, Item2: TMetroLine): Integer;
    13051318begin
    13061319  if Item1.Index > Item2.Index then Result := 1
     
    13111324procedure TMapStation.SortLines;
    13121325begin
    1313   Lines.Sort(MapStationCompareLine);
     1326  Lines.Sort(TComparer<TMetroLine>.Construct(MapStationCompareLine));
    13141327end;
    13151328
     
    13761389begin
    13771390  Passengers := TMetroPassengers.Create;
    1378   Passengers.FreeObjects := False;
     1391  Passengers.OwnsObjects := False;
    13791392  Lines := TMetroLines.Create;
    1380   Lines.FreeObjects := False;
     1393  Lines.OwnsObjects := False;
    13811394end;
    13821395
     
    19411954          Track.Points[I].PositionDesigned + Track.Points[I].LinkDown.Shift,
    19421955          Track.Points[I].PositionDesigned + Track.Points[I].LinkUp.Shift,
    1943           Track.Points[I + 1].PositionDesigned + Track.Points[I].LinkUp.Shift, NewPoint) then
    1944           Track.Points[I].Position := NewPoint
    1945           else begin
     1956          Track.Points[I + 1].PositionDesigned + Track.Points[I].LinkUp.Shift, NewPoint) then begin
     1957            Track.Points[I].Position := NewPoint;
     1958          end else begin
    19461959            // Parallel lines
    19471960            NewPoint := Track.Points[I].PositionDesigned + Track.Points[I].LinkDown.Shift;
     
    19491962          end;
    19501963//      end;
     1964
     1965      // Update ending
     1966      if Track.Points.Count > 1 then begin
     1967        Track.Points[Track.Points.Count - 1].Position := Track.Points[Track.Points.Count - 1].PositionDesigned -
     1968          Track.Points[Track.Points.Count - 1].LinkDown.Shift;
     1969      end;
    19511970    end;
    19521971
     
    23332352{      if (S = TrackPoints.Count - 1) then begin
    23342353        Canvas.Pen.EndCap := pecSquare;
    2335         Angle := arctan2(((TrackPoints[S].Position.Y - TrackPoints[S - 1].Position.Y),
     2354        Angle := arctan2D(((TrackPoints[S].Position.Y - TrackPoints[S - 1].Position.Y),
    23362355          (TrackPoints[S].Position.X - TrackPoints[S - 1].Position.X));
    23372356        EndPoint := Point(Round(TrackPoints[S].Position.X + EndStationLength * Cos(Angle)),
Note: See TracChangeset for help on using the changeset viewer.