hedgewars/uLand.pas
changeset 498 9c8b385dc9a1
parent 495 62c1c2b4414c
child 547 b81a055f2d06
equal deleted inserted replaced
497:adf1aee202c6 498:9c8b385dc9a1
   134 end;
   134 end;
   135 
   135 
   136 procedure Vector(p1, p2, p3: TPoint; var Vx, Vy: hwFloat);
   136 procedure Vector(p1, p2, p3: TPoint; var Vx, Vy: hwFloat);
   137 var d1, d2, d: hwFloat;
   137 var d1, d2, d: hwFloat;
   138 begin
   138 begin
   139 Vx:= p1.X - p3.X;
   139 Vx:= int2hwFloat(p1.X - p3.X);
   140 Vy:= p1.Y - p3.Y;
   140 Vy:= int2hwFloat(p1.Y - p3.Y);
   141 d:= Distance(p2.X - p1.X, p2.Y - p1.Y);
   141 d:= DistanceI(p2.X - p1.X, p2.Y - p1.Y);
   142 d1:= Distance(p2.X - p3.X, p2.Y - p3.Y);
   142 d1:= DistanceI(p2.X - p3.X, p2.Y - p3.Y);
   143 d2:= Distance(Vx, Vy);
   143 d2:= Distance(Vx, Vy);
   144 if d1 < d then d:= d1;
   144 if d1 < d then d:= d1;
   145 if d2 < d then d:= d2;
   145 if d2 < d then d:= d2;
   146 d:= d * _1div3;
   146 d:= d * _1div3;
   147 if d2.QWordValue = 0 then
   147 if d2.QWordValue = 0 then
   148    begin
   148    begin
   149    Vx:= 0;
   149    Vx:= _0;
   150    Vy:= 0
   150    Vy:= _0
   151    end else
   151    end else
   152    begin
   152    begin
   153    d2:= 1 / d2;
   153    d2:= _1 / d2;
   154    Vx:= Vx * d2;
   154    Vx:= Vx * d2;
   155    Vy:= Vy * d2;
   155    Vy:= Vy * d2;
   156 
   156 
   157    Vx:= Vx * d;
   157    Vx:= Vx * d;
   158    Vy:= Vy * d
   158    Vy:= Vy * d
   160 end;
   160 end;
   161 
   161 
   162 procedure AddLoopPoints(var pa, opa: TPixAr; StartI, EndI: LongInt; Delta: hwFloat);
   162 procedure AddLoopPoints(var pa, opa: TPixAr; StartI, EndI: LongInt; Delta: hwFloat);
   163 var i, pi, ni: LongInt;
   163 var i, pi, ni: LongInt;
   164     NVx, NVy, PVx, PVy: hwFloat;
   164     NVx, NVy, PVx, PVy: hwFloat;
   165     x1, x2, y1, y2, cx1, cx2, cy1, cy2: hwFloat;
   165     x1, x2, y1, y2: LongInt;
   166     tsq, tcb, t, r1, r2, r3: hwFloat;
   166     tsq, tcb, t, r1, r2, r3, cx1, cx2, cy1, cy2: hwFloat;
   167     X, Y: LongInt;
   167     X, Y: LongInt;
   168 begin
   168 begin
   169 pi:= EndI;
   169 pi:= EndI;
   170 i:= StartI;
   170 i:= StartI;
   171 ni:= Succ(StartI);
   171 ni:= Succ(StartI);
   183 
   183 
   184     x1:= opa.ar[pi].x;
   184     x1:= opa.ar[pi].x;
   185     y1:= opa.ar[pi].y;
   185     y1:= opa.ar[pi].y;
   186     x2:= opa.ar[i].x;
   186     x2:= opa.ar[i].x;
   187     y2:= opa.ar[i].y;
   187     y2:= opa.ar[i].y;
   188     cx1:= x1 - PVx;
   188     cx1:= int2hwFloat(x1) - PVx;
   189     cy1:= y1 - PVy;
   189     cy1:= int2hwFloat(y1) - PVy;
   190     cx2:= x2 + NVx;
   190     cx2:= int2hwFloat(x2) + NVx;
   191     cy2:= y2 + NVy;
   191     cy2:= int2hwFloat(y2) + NVy;
   192     t:= 0;
   192     t:= _0;
   193     while t.Round = 0 do
   193     while t.Round = 0 do
   194           begin
   194           begin
   195           tsq:= t * t;
   195           tsq:= t * t;
   196           tcb:= tsq * t;
   196           tcb:= tsq * t;
   197           r1:= (1 - 3*t + 3*tsq -   tcb);
   197           r1:= (_1 - t*3 + tsq*3 - tcb);
   198           r2:= (    3*t - 6*tsq + 3*tcb);
   198           r2:= (     t*3 - tsq*6 + tcb*3);
   199           r3:= (          3*tsq - 3*tcb);
   199           r3:= (           tsq*3 - tcb*3);
   200           X:= hwRound(r1 * x1 + r2 * cx1 + r3 * cx2 + tcb * x2);
   200           X:= hwRound(r1 * x1 + r2 * cx1 + r3 * cx2 + tcb * x2);
   201           Y:= hwRound(r1 * y1 + r2 * cy1 + r3 * cy2 + tcb * y2);
   201           Y:= hwRound(r1 * y1 + r2 * cy1 + r3 * cy2 + tcb * y2);
   202           t:= t + Delta;
   202           t:= t + Delta;
   203           pa.ar[pa.Count].x:= X;
   203           pa.ar[pa.Count].x:= X;
   204           pa.ar[pa.Count].y:= Y;
   204           pa.ar[pa.Count].y:= Y;