hedgewars/uLandOutline.pas
branchqmlfrontend
changeset 10515 7705784902e1
parent 10510 9329dab04490
child 10560 9f09196d92a6
equal deleted inserted replaced
10458:f7a199346c3e 10515:7705784902e1
   122         end
   122         end
   123     else
   123     else
   124         begin
   124         begin
   125         d:= DistanceI(p2.X - p1.X, p2.Y - p1.Y);
   125         d:= DistanceI(p2.X - p1.X, p2.Y - p1.Y);
   126         d1:= DistanceI(p2.X - p3.X, p2.Y - p3.Y);
   126         d1:= DistanceI(p2.X - p3.X, p2.Y - p3.Y);
   127         
   127 
   128         if d1 < d then
   128         if d1 < d then
   129             d:= d1;
   129             d:= d1;
   130         if d2 < d then
   130         if d2 < d then
   131             d:= d2;
   131             d:= d2;
   132 
   132 
   133         d2:= d * _1div3 / d2;
   133         d2:= d * _1div3 / d2;
   134         
   134 
   135         Vx:= Vx * d2;
   135         Vx:= Vx * d2;
   136         Vy:= Vy * d2
   136         Vy:= Vy * d2
   137         end
   137         end
   138 end;
   138 end;
   139 
   139 
   142     NVx, NVy, PVx, PVy: hwFloat;
   142     NVx, NVy, PVx, PVy: hwFloat;
   143     x1, x2, y1, y2: LongInt;
   143     x1, x2, y1, y2: LongInt;
   144     tsq, tcb, t, r1, r2, r3, cx1, cx2, cy1, cy2: hwFloat;
   144     tsq, tcb, t, r1, r2, r3, cx1, cx2, cy1, cy2: hwFloat;
   145     X, Y: LongInt;
   145     X, Y: LongInt;
   146 begin
   146 begin
   147 pi:= EndI;
   147     if pa.Count < cMaxEdgePoints - 2 then
   148 i:= StartI;
   148         begin
   149 ni:= Succ(StartI);
   149         pi:= EndI;
   150 {$HINTS OFF}
       
   151 Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy);
       
   152 {$HINTS ON}
       
   153 repeat
       
   154     inc(pi);
       
   155     if pi > EndI then
       
   156         pi:= StartI;
       
   157     inc(i);
       
   158     if i > EndI then
       
   159         i:= StartI;
   150         i:= StartI;
   160     inc(ni);
   151         ni:= Succ(StartI);
   161     if ni > EndI then
   152         {$HINTS OFF}
   162         ni:= StartI;
   153         Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy);
   163     PVx:= NVx;
   154         {$HINTS ON}
   164     PVy:= NVy;
   155         repeat
   165     Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy);
   156             i:= ni;
   166 
   157             inc(pi);
   167     x1:= opa.ar[pi].x;
   158             if pi > EndI then
   168     y1:= opa.ar[pi].y;
   159                 pi:= StartI;
   169     x2:= opa.ar[i].x;
   160             inc(ni);
   170     y2:= opa.ar[i].y;
   161             if ni > EndI then
   171     cx1:= int2hwFloat(x1) - PVx;
   162                 ni:= StartI;
   172     cy1:= int2hwFloat(y1) - PVy;
   163             PVx:= NVx;
   173     cx2:= int2hwFloat(x2) + NVx;
   164             PVy:= NVy;
   174     cy2:= int2hwFloat(y2) + NVy;
   165             Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy);
   175     t:= _0;
   166 
   176     while t.Round = 0 do
   167             x1:= opa.ar[pi].x;
   177         begin
   168             y1:= opa.ar[pi].y;
   178         tsq:= t * t;
   169             x2:= opa.ar[i].x;
   179         tcb:= tsq * t;
   170             y2:= opa.ar[i].y;
   180         r1:= (_1 - t*3 + tsq*3 - tcb);
   171 
   181         r2:= (     t*3 - tsq*6 + tcb*3);
   172             cx1:= int2hwFloat(x1) - PVx;
   182         r3:= (           tsq*3 - tcb*3);
   173             cy1:= int2hwFloat(y1) - PVy;
   183         X:= hwRound(r1 * x1 + r2 * cx1 + r3 * cx2 + tcb * x2);
   174             cx2:= int2hwFloat(x2) + NVx;
   184         Y:= hwRound(r1 * y1 + r2 * cy1 + r3 * cy2 + tcb * y2);
   175             cy2:= int2hwFloat(y2) + NVy;
   185         t:= t + Delta;
   176             t:= _0;
   186         pa.ar[pa.Count].x:= X;
   177             while (t.Round = 0) and (pa.Count < cMaxEdgePoints-2) do
   187         pa.ar[pa.Count].y:= Y;
   178                 begin
   188         inc(pa.Count);
   179                 tsq:= t * t;
   189         TryDo(pa.Count <= cMaxEdgePoints, 'Edge points overflow', true)
   180                 tcb:= tsq * t;
       
   181                 r1:= (_1 - t*3 + tsq*3 - tcb);
       
   182                 r2:= (     t*3 - tsq*6 + tcb*3);
       
   183                 r3:= (           tsq*3 - tcb*3);
       
   184                 X:= hwRound(r1 * x1 + r2 * cx1 + r3 * cx2 + tcb * x2);
       
   185                 Y:= hwRound(r1 * y1 + r2 * cy1 + r3 * cy2 + tcb * y2);
       
   186                 t:= t + Delta;
       
   187                 pa.ar[pa.Count].x:= X;
       
   188                 pa.ar[pa.Count].y:= Y;
       
   189                 inc(pa.Count);
       
   190                 //TryDo(pa.Count <= cMaxEdgePoints, 'Edge points overflow', true)
       
   191                 end;
       
   192         until i = StartI;
   190         end;
   193         end;
   191 until i = StartI;
   194 
   192 pa.ar[pa.Count].x:= opa.ar[StartI].X;
   195     pa.ar[pa.Count].x:= opa.ar[StartI].X;
   193 pa.ar[pa.Count].y:= opa.ar[StartI].Y;
   196     pa.ar[pa.Count].y:= opa.ar[StartI].Y;
   194 inc(pa.Count)
   197     inc(pa.Count)
   195 end;
   198 end;
   196 
   199 
   197 procedure BezierizeEdge(var pa: TPixAr; Delta: hwFloat);
   200 procedure BezierizeEdge(var pa: TPixAr; Delta: hwFloat);
   198 var i, StartLoop: LongInt;
   201 var i, StartLoop: LongInt;
   199     opa: TPixAr;
   202     opa: TPixAr;
   200 begin
   203 begin
   201 opa:= pa;
   204 opa:= pa;
   202 pa.Count:= 0;
   205 pa.Count:= 0;
   203 i:= 0;
   206 i:= 0;
   204 StartLoop:= 0;
   207 StartLoop:= 0;
   205 while i < LongInt(opa.Count) do
   208 while (i < LongInt(opa.Count)) and (pa.Count < cMaxEdgePoints-1) do
   206     if (opa.ar[i + 1].X = NTPX) then
   209     if (opa.ar[i + 1].X = NTPX) then
   207         begin
   210         begin
   208         AddLoopPoints(pa, opa, StartLoop, i, Delta);
   211         AddLoopPoints(pa, opa, StartLoop, i, Delta);
   209         inc(i, 2);
   212         inc(i, 2);
   210         StartLoop:= i;
   213         StartLoop:= i;