96 |
96 |
97 procedure FindPoint(si: LongInt; fillPointsCount: LongWord; var newPoint: TPoint; var pa: TPixAr); |
97 procedure FindPoint(si: LongInt; fillPointsCount: LongWord; var newPoint: TPoint; var pa: TPixAr); |
98 const mapBorderMargin = 40; |
98 const mapBorderMargin = 40; |
99 minDistance = 32; // adjust/parametrize this for different details size |
99 minDistance = 32; // adjust/parametrize this for different details size |
100 var p1, p2, p4, fp, mp: TPoint; |
100 var p1, p2, p4, fp, mp: TPoint; |
101 i, t1, t2, a, b, p, q, iy, ix, aqpb: LongInt; |
101 i, t1, t2, iy, ix, aqpb: LongInt; |
|
102 a, b, p, q: LongInt; |
102 dab, d, distL, distR: LongInt; |
103 dab, d, distL, distR: LongInt; |
103 begin |
104 begin |
104 // [p1, p2] is the segment we're trying to divide |
105 // [p1, p2] is the segment we're trying to divide |
105 p1:= pa.ar[si]; |
106 p1:= pa.ar[si]; |
106 p2:= pa.ar[si + 1]; |
107 p2:= pa.ar[si + 1]; |
187 aqpb:= a * q - p * b; |
188 aqpb:= a * q - p * b; |
188 |
189 |
189 if (aqpb <> 0) then |
190 if (aqpb <> 0) then |
190 begin |
191 begin |
191 // (ix; iy) is intersection point |
192 // (ix; iy) is intersection point |
192 iy:= (((pa.ar[i].x - mp.x) * b + mp.y * a) * q - pa.ar[i].y * p * b) div aqpb; |
193 iy:= ((Int64(pa.ar[i].x - mp.x) * b + Int64(mp.y) * a) * q - Int64(pa.ar[i].y) * p * b) div aqpb; |
193 if abs(b) > abs(q) then |
194 if abs(b) > abs(q) then |
194 ix:= (iy - mp.y) * a div b + mp.x |
195 ix:= (iy - mp.y) * a div b + mp.x |
195 else |
196 else |
196 ix:= (iy - pa.ar[i].y) * p div q + pa.ar[i].x; |
197 ix:= (iy - pa.ar[i].y) * p div q + pa.ar[i].x; |
197 |
198 |
218 aqpb:= a * q - p * b; |
219 aqpb:= a * q - p * b; |
219 |
220 |
220 if (aqpb <> 0) then |
221 if (aqpb <> 0) then |
221 begin |
222 begin |
222 // (ix; iy) is intersection point |
223 // (ix; iy) is intersection point |
223 iy:= (((p1.x - mp.x) * b + mp.y * a) * q - p1.y * p * b) div aqpb; |
224 iy:= ((Int64(p1.x - mp.x) * b + Int64(mp.y) * a) * q - Int64(p1.y) * p * b) div aqpb; |
224 if abs(b) > abs(q) then |
225 if abs(b) > abs(q) then |
225 ix:= (iy - mp.y) * a div b + mp.x |
226 ix:= (iy - mp.y) * a div b + mp.x |
226 else |
227 else |
227 ix:= (iy - p1.y) * p div q + p1.x; |
228 ix:= (iy - p1.y) * p div q + p1.x; |
228 |
229 |
237 aqpb:= a * q - p * b; |
238 aqpb:= a * q - p * b; |
238 |
239 |
239 if (aqpb <> 0) then |
240 if (aqpb <> 0) then |
240 begin |
241 begin |
241 // (ix; iy) is intersection point |
242 // (ix; iy) is intersection point |
242 iy:= (((p2.x - mp.x) * b + mp.y * a) * q - p2.y * p * b) div aqpb; |
243 iy:= ((Int64(p2.x - mp.x) * b + Int64(mp.y) * a) * q - Int64(p2.y) * p * b) div aqpb; |
243 if abs(b) > abs(q) then |
244 if abs(b) > abs(q) then |
244 ix:= (iy - mp.y) * a div b + mp.x |
245 ix:= (iy - mp.y) * a div b + mp.x |
245 else |
246 else |
246 ix:= (iy - p2.y) * p div q + p2.x; |
247 ix:= (iy - p2.y) * p div q + p2.x; |
247 |
248 |