@d1 start location (distance from start / total distance) @d2 end location (distance from start / total distance)
1207{
1213 int nsegs, i;
1214 double length, slength, tlength;
1215 int state = 0;
1216
1217
1218
1219
1220
1222
1223
1225
1226
1227 LWDEBUGF(3,
"Total length: %g", length);
1228
1229
1230
1231 from = length*from;
1232 to = length*to;
1233
1234
1235 LWDEBUGF(3,
"From/To: %g/%g", from, to);
1236
1237
1238 tlength = 0;
1241 for ( i = 0; i < nsegs; i++ )
1242 {
1243 double dseg;
1244
1246
1247
1248 LWDEBUGF(3 ,
"Segment %d: (%g,%g,%g,%g)-(%g,%g,%g,%g)",
1249 i, p1.
x, p1.
y, p1.
z, p1.
m, p2.
x, p2.
y, p2.
z, p2.
m);
1250
1251
1252
1254
1255
1256
1257
1258 if ( state == 0 )
1259 {
1260
1262
1263 if ( fabs ( from - ( tlength + slength ) ) <= tolerance )
1264 {
1265
1266 LWDEBUG(3,
" Second point is our start");
1267
1268
1269
1270
1272 state=1;
1273 goto END;
1274 }
1275
1276 else if ( fabs(from - tlength) <= tolerance )
1277 {
1278
1279 LWDEBUG(3,
" First point is our start");
1280
1281
1282
1283
1285
1286
1287
1288
1289
1290 state=1;
1291 }
1292
1293
1294
1295
1296
1297 else if ( from > tlength + slength ) goto END;
1298
1299 else
1300 {
1301
1302 LWDEBUG(3,
" Seg contains first point");
1303
1304
1305
1306
1307
1308 dseg = (from - tlength) / slength;
1309
1311
1313
1314
1315
1316
1317
1318 state=1;
1319 }
1320 }
1321
1322 if ( state == 1 )
1323 {
1324
1326
1327
1328
1329
1330 if ( fabs(to - ( tlength + slength ) ) <= tolerance )
1331 {
1332
1333 LWDEBUG(3,
" Second point is our end");
1334
1336 break;
1337 }
1338
1339
1340
1341
1342
1343 else if ( fabs(to - tlength) <= tolerance )
1344 {
1345
1346 LWDEBUG(3,
" First point is our end");
1347
1349
1350 break;
1351 }
1352
1353
1354
1355
1356
1357 else if ( to > tlength + slength )
1358 {
1360 goto END;
1361 }
1362
1363
1364
1365
1366
1367 else if ( to < tlength + slength )
1368 {
1369
1370 LWDEBUG(3,
" Seg contains our end");
1371
1372 dseg = (to - tlength) / slength;
1374
1376
1377 break;
1378 }
1379
1380 else
1381 {
1383 }
1384 }
1385
1386
1387END:
1388
1389 tlength += slength;
1390 memcpy(&p1, &p2,
sizeof(
POINT4D));
1391 }
1392
1394
1395 return dpa;
1396}
double distance2d_pt_pt(const POINT2D *p1, const POINT2D *p2)
void interpolate_point4d(const POINT4D *A, const POINT4D *B, POINT4D *I, double F)
Find interpolation point I between point A and point B so that the len(AI) == len(AB)*F and I falls o...
#define FLAGS_GET_Z(flags)
#define FLAGS_GET_M(flags)
int getPoint4d_p(const POINTARRAY *pa, uint32_t n, POINT4D *point)
#define LWDEBUG(level, msg)
#define LWDEBUGF(level, msg,...)
POINTARRAY * ptarray_construct_empty(char hasz, char hasm, uint32_t maxpoints)
Create a new POINTARRAY with no points.
double ptarray_length_2d(const POINTARRAY *pts)
Find the 2d length of the given POINTARRAY (even if it's 3d)
int ptarray_append_point(POINTARRAY *pa, const POINT4D *pt, int repeated_points)
Append a point to the end of an existing POINTARRAY If allow_duplicate is LW_FALSE,...