changeset 10483 | 1f58cb4aa773 |
parent 10197 | c57798251b55 |
child 10485 | 05b771423b95 |
10482:b49b82351ad3 | 10483:1f58cb4aa773 |
---|---|
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 if pa.Count >= cMaxEdgePoints-1 then exit; |
|
147 pi:= EndI; |
148 pi:= EndI; |
148 i:= StartI; |
149 i:= StartI; |
149 ni:= Succ(StartI); |
150 ni:= Succ(StartI); |
150 {$HINTS OFF} |
151 {$HINTS OFF} |
151 Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy); |
152 Vector(opa.ar[pi], opa.ar[i], opa.ar[ni], NVx, NVy); |
171 cx1:= int2hwFloat(x1) - PVx; |
172 cx1:= int2hwFloat(x1) - PVx; |
172 cy1:= int2hwFloat(y1) - PVy; |
173 cy1:= int2hwFloat(y1) - PVy; |
173 cx2:= int2hwFloat(x2) + NVx; |
174 cx2:= int2hwFloat(x2) + NVx; |
174 cy2:= int2hwFloat(y2) + NVy; |
175 cy2:= int2hwFloat(y2) + NVy; |
175 t:= _0; |
176 t:= _0; |
176 while t.Round = 0 do |
177 while (t.Round = 0) and (pa.Count < cMaxEdgePoints-2) do |
177 begin |
178 begin |
178 tsq:= t * t; |
179 tsq:= t * t; |
179 tcb:= tsq * t; |
180 tcb:= tsq * t; |
180 r1:= (_1 - t*3 + tsq*3 - tcb); |
181 r1:= (_1 - t*3 + tsq*3 - tcb); |
181 r2:= ( t*3 - tsq*6 + tcb*3); |
182 r2:= ( t*3 - tsq*6 + tcb*3); |
184 Y:= hwRound(r1 * y1 + r2 * cy1 + r3 * cy2 + tcb * y2); |
185 Y:= hwRound(r1 * y1 + r2 * cy1 + r3 * cy2 + tcb * y2); |
185 t:= t + Delta; |
186 t:= t + Delta; |
186 pa.ar[pa.Count].x:= X; |
187 pa.ar[pa.Count].x:= X; |
187 pa.ar[pa.Count].y:= Y; |
188 pa.ar[pa.Count].y:= Y; |
188 inc(pa.Count); |
189 inc(pa.Count); |
189 TryDo(pa.Count <= cMaxEdgePoints, 'Edge points overflow', true) |
190 //TryDo(pa.Count <= cMaxEdgePoints, 'Edge points overflow', true) |
190 end; |
191 end; |
191 until i = StartI; |
192 until i = StartI; |
192 pa.ar[pa.Count].x:= opa.ar[StartI].X; |
193 pa.ar[pa.Count].x:= opa.ar[StartI].X; |
193 pa.ar[pa.Count].y:= opa.ar[StartI].Y; |
194 pa.ar[pa.Count].y:= opa.ar[StartI].Y; |
194 inc(pa.Count) |
195 inc(pa.Count) |
200 begin |
201 begin |
201 opa:= pa; |
202 opa:= pa; |
202 pa.Count:= 0; |
203 pa.Count:= 0; |
203 i:= 0; |
204 i:= 0; |
204 StartLoop:= 0; |
205 StartLoop:= 0; |
205 while i < LongInt(opa.Count) do |
206 while (i < LongInt(opa.Count)) and (pa.Count < cMaxEdgePoints-1) do |
206 if (opa.ar[i + 1].X = NTPX) then |
207 if (opa.ar[i + 1].X = NTPX) then |
207 begin |
208 begin |
208 AddLoopPoints(pa, opa, StartLoop, i, Delta); |
209 AddLoopPoints(pa, opa, StartLoop, i, Delta); |
209 inc(i, 2); |
210 inc(i, 2); |
210 StartLoop:= i; |
211 StartLoop:= i; |