How can I find a curve that pass through my scattered points in 3D?

I have points scattered in 3D and they are irregularly sampled and are not sequenced in monotonic order. When I try simply to draw curve using plot3 i have messed up crossings from points across. Is there anyway to find smooth curve that only pass through nearest points? if not how can I approximate?
for example d =
0.0071 -0.0515 0.0202
0.0095 -0.0512 0.0200
-0.0175 0.0438 0.0297
-0.0149 0.0453 0.0289
0.0322 -0.0313 0.0331
0.0336 -0.0289 0.0338
-0.0268 -0.0316 0.0372
-0.0289 -0.0301 0.0370
0.0413 -0.0029 0.0374
0.0413 -0.0018 0.0374
0.0041 -0.0516 0.0206
0.0044 -0.0516 0.0206
-0.0396 0.0051 0.0388
-0.0398 0.0030 0.0389
-0.0284 0.0405 0.0257
-0.0300 0.0395 0.0254
-0.0395 0.0108 0.0378
-0.0398 0.0088 0.0380
0.0417 -0.0086 0.0360
0.0410 -0.0105 0.0363
0.0370 -0.0204 0.0364
0.0370 -0.0202 0.0365
-0.0010 -0.0516 0.0210
-0.0028 -0.0514 0.0214
0.0181 -0.0487 0.0202
0.0177 -0.0489 0.0201
-0.0079 -0.0493 0.0247
-0.0064 -0.0503 0.0232
-0.0396 0.0051 0.0388
-0.0396 0.0059 0.0388
-0.0399 -0.0090 0.0379
-0.0401 -0.0085 0.0378
-0.0356 -0.0193 0.0383
-0.0352 -0.0201 0.0383
-0.0390 -0.0114 0.0382
-0.0399 -0.0090 0.0379
-0.0401 -0.0085 0.0378
-0.0404 -0.0071 0.0378
-0.0370 0.0228 0.0350
-0.0370 0.0231 0.0348
-0.0300 0.0395 0.0254
-0.0311 0.0386 0.0254
-0.0344 0.0312 0.0308
-0.0343 0.0314 0.0307
-0.0365 0.0252 0.0338
-0.0364 0.0259 0.0333
-0.0353 0.0287 0.0322
-0.0361 0.0269 0.0328
-0.0343 0.0314 0.0307
-0.0342 0.0319 0.0304
-0.0147 0.0454 0.0288
-0.0149 0.0453 0.0289
-0.0119 0.0467 0.0281
-0.0145 0.0455 0.0288
-0.0099 0.0473 0.0278
-0.0092 0.0475 0.0277
0.0022 0.0483 0.0277
0.0047 0.0483 0.0275
-0.0064 0.0481 0.0275
-0.0038 0.0482 0.0278
-0.0036 0.0482 0.0278
-0.0038 0.0482 0.0278
0.0327 0.0351 0.0285
0.0332 0.0342 0.0289
0.0192 0.0410 0.0325
0.0176 0.0416 0.0326
0.0176 0.0416 0.0326
0.0163 0.0422 0.0326
0.0249 0.0373 0.0331
0.0249 0.0373 0.0331
0.0376 0.0259 0.0320
0.0380 0.0248 0.0324
0.0361 0.0287 0.0314
0.0376 0.0259 0.0320
0.0337 0.0333 0.0292
0.0332 0.0342 0.0289
0.0388 0.0231 0.0328
0.0388 0.0227 0.0330
0.0393 0.0202 0.0340
0.0393 0.0202 0.0340
0.0414 0.0013 0.0373
0.0415 0.0029 0.0371
0.0414 -0.0042 0.0370
0.0413 -0.0029 0.0374
0.0395 0.0145 0.0365
0.0392 0.0168 0.0359
0.0247 -0.0438 0.0240
0.0256 -0.0426 0.0251
0.0099 -0.0511 0.0199
0.0099 -0.0511 0.0200
0.0185 -0.0485 0.0203
0.0181 -0.0487 0.0202
0.0265 -0.0415 0.0262
0.0256 -0.0426 0.0251
0.0305 -0.0342 0.0317
0.0306 -0.0340 0.0319
-0.0222 -0.0371 0.0352
-0.0232 -0.0356 0.0361
-0.0340 -0.0230 0.0378
-0.0335 -0.0241 0.0374
-0.0352 -0.0201 0.0383
-0.0347 -0.0214 0.0380
-0.0335 -0.0241 0.0374
-0.0327 -0.0258 0.0370
-0.0307 -0.0286 0.0367
-0.0318 -0.0273 0.0368
-0.0289 -0.0301 0.0370
-0.0307 -0.0286 0.0367
-0.0327 -0.0258 0.0370
-0.0318 -0.0273 0.0368
-0.0261 -0.0323 0.0373
-0.0241 -0.0345 0.0366
-0.0268 -0.0316 0.0372
-0.0261 -0.0323 0.0373
-0.0211 -0.0389 0.0338
-0.0208 -0.0396 0.0332
-0.0174 -0.0427 0.0313
-0.0155 -0.0440 0.0305
-0.0118 -0.0464 0.0285
-0.0109 -0.0471 0.0276
-0.0222 -0.0371 0.0352
-0.0211 -0.0389 0.0338
-0.0241 -0.0345 0.0366
-0.0232 -0.0356 0.0361
-0.0203 -0.0403 0.0328
-0.0208 -0.0396 0.0332
-0.0174 -0.0427 0.0313
-0.0182 -0.0422 0.0315
-0.0182 -0.0422 0.0315
-0.0203 -0.0403 0.0328
-0.0146 -0.0446 0.0301
-0.0144 -0.0448 0.0300
-0.0109 -0.0471 0.0276
-0.0091 -0.0485 0.0259
-0.0079 -0.0493 0.0247
-0.0091 -0.0485 0.0259
-0.0064 -0.0503 0.0232
-0.0040 -0.0512 0.0217
-0.0028 -0.0514 0.0214
-0.0037 -0.0513 0.0215
-0.0037 -0.0513 0.0215
-0.0040 -0.0512 0.0217
-0.0144 -0.0448 0.0300
-0.0118 -0.0464 0.0285
-0.0155 -0.0440 0.0305
-0.0146 -0.0446 0.0301
-0.0407 -0.0052 0.0377
-0.0407 -0.0027 0.0380
-0.0356 -0.0193 0.0383
-0.0364 -0.0173 0.0385
-0.0340 -0.0230 0.0378
-0.0347 -0.0214 0.0380
-0.0379 -0.0143 0.0383
-0.0381 -0.0138 0.0383
-0.0404 -0.0071 0.0378
-0.0407 -0.0056 0.0377
-0.0381 -0.0138 0.0383
-0.0390 -0.0114 0.0382
-0.0364 -0.0173 0.0385
-0.0375 -0.0151 0.0384
-0.0379 -0.0143 0.0383
-0.0375 -0.0151 0.0384
-0.0407 -0.0027 0.0380
-0.0408 -0.0023 0.0380
-0.0407 -0.0056 0.0377
-0.0407 -0.0052 0.0377
-0.0408 -0.0023 0.0380
-0.0406 0.0001 0.0382
-0.0406 0.0003 0.0382
-0.0406 0.0001 0.0382
-0.0406 0.0003 0.0382
-0.0404 0.0011 0.0384
-0.0404 0.0011 0.0384
-0.0398 0.0030 0.0389
-0.0398 0.0083 0.0381
-0.0396 0.0059 0.0388
-0.0382 0.0145 0.0379
-0.0380 0.0151 0.0379
-0.0376 0.0176 0.0373
-0.0376 0.0174 0.0373
-0.0376 0.0174 0.0373
-0.0380 0.0151 0.0379
-0.0382 0.0145 0.0379
-0.0387 0.0132 0.0378
-0.0387 0.0132 0.0378
-0.0393 0.0117 0.0377
-0.0398 0.0088 0.0380
-0.0398 0.0083 0.0381
-0.0395 0.0108 0.0378
-0.0393 0.0117 0.0377
-0.0374 0.0191 0.0367
-0.0376 0.0176 0.0373
-0.0372 0.0201 0.0363
-0.0374 0.0191 0.0367
-0.0370 0.0231 0.0348
-0.0365 0.0252 0.0338
-0.0372 0.0203 0.0362
-0.0372 0.0201 0.0363
-0.0364 0.0259 0.0333
-0.0361 0.0269 0.0328
-0.0334 0.0341 0.0287
-0.0329 0.0352 0.0279
-0.0334 0.0341 0.0287
-0.0342 0.0319 0.0304
-0.0344 0.0312 0.0308
-0.0353 0.0287 0.0322
-0.0372 0.0203 0.0362
-0.0370 0.0228 0.0350
-0.0257 0.0412 0.0274
-0.0270 0.0409 0.0265
-0.0324 0.0368 0.0265
-0.0329 0.0352 0.0279
-0.0311 0.0386 0.0254
-0.0324 0.0368 0.0265
-0.0270 0.0409 0.0265
-0.0284 0.0405 0.0257
-0.0257 0.0412 0.0274
-0.0246 0.0413 0.0282
-0.0202 0.0425 0.0299
-0.0201 0.0426 0.0298
-0.0230 0.0418 0.0289
-0.0246 0.0413 0.0282
-0.0230 0.0418 0.0289
-0.0223 0.0418 0.0293
-0.0175 0.0438 0.0297
-0.0201 0.0426 0.0298
-0.0223 0.0418 0.0293
-0.0202 0.0425 0.0298
-0.0202 0.0425 0.0298
-0.0202 0.0425 0.0299
-0.0092 0.0475 0.0277
-0.0070 0.0480 0.0275
-0.0145 0.0455 0.0288
-0.0147 0.0454 0.0288
-0.0009 0.0482 0.0280
-0.0011 0.0482 0.0280
-0.0009 0.0482 0.0280
0.0016 0.0483 0.0277
-0.0064 0.0481 0.0275
-0.0070 0.0480 0.0275
-0.0119 0.0467 0.0281
-0.0099 0.0473 0.0278
-0.0011 0.0482 0.0280
-0.0036 0.0482 0.0278
0.0275 0.0370 0.0314
0.0249 0.0373 0.0331
0.0206 0.0401 0.0328
0.0221 0.0389 0.0333
0.0249 0.0373 0.0331
0.0231 0.0383 0.0333
0.0192 0.0410 0.0325
0.0206 0.0401 0.0328
0.0144 0.0429 0.0326
0.0163 0.0422 0.0326
0.0138 0.0432 0.0325
0.0135 0.0433 0.0324
0.0022 0.0483 0.0277
0.0019 0.0483 0.0277
0.0103 0.0455 0.0305
0.0105 0.0453 0.0307
0.0075 0.0476 0.0280
0.0060 0.0480 0.0277
0.0103 0.0455 0.0305
0.0075 0.0476 0.0280
0.0120 0.0442 0.0318
0.0105 0.0453 0.0307
0.0060 0.0480 0.0277
0.0047 0.0483 0.0275
0.0016 0.0483 0.0277
0.0019 0.0483 0.0277
0.0138 0.0432 0.0325
0.0144 0.0429 0.0326
0.0120 0.0442 0.0318
0.0135 0.0433 0.0324
0.0249 0.0373 0.0331
0.0249 0.0373 0.0331
0.0337 0.0333 0.0292
0.0347 0.0315 0.0302
0.0299 0.0370 0.0290
0.0299 0.0370 0.0290
0.0299 0.0370 0.0290
0.0275 0.0370 0.0314
0.0299 0.0370 0.0290
0.0300 0.0370 0.0290
0.0300 0.0370 0.0290
0.0327 0.0351 0.0285
0.0231 0.0383 0.0333
0.0221 0.0389 0.0333
0.0388 0.0227 0.0330
0.0393 0.0202 0.0340
0.0360 0.0288 0.0314
0.0360 0.0287 0.0314
0.0347 0.0315 0.0302
0.0351 0.0307 0.0306
0.0388 0.0231 0.0328
0.0380 0.0248 0.0324
0.0360 0.0287 0.0314
0.0361 0.0287 0.0314
0.0351 0.0307 0.0306
0.0360 0.0288 0.0314
0.0392 0.0174 0.0356
0.0393 0.0202 0.0340
0.0392 0.0174 0.0356
0.0392 0.0168 0.0359
0.0395 0.0145 0.0365
0.0396 0.0142 0.0366
0.0415 0.0044 0.0369
0.0415 0.0029 0.0371
0.0409 0.0087 0.0369
0.0400 0.0115 0.0371
0.0396 0.0142 0.0366
0.0400 0.0116 0.0371
0.0415 0.0058 0.0368
0.0412 0.0070 0.0369
0.0400 0.0116 0.0371
0.0400 0.0115 0.0371
0.0415 0.0058 0.0368
0.0415 0.0044 0.0369
0.0409 0.0087 0.0369
0.0412 0.0070 0.0369
0.0417 -0.0074 0.0362
0.0416 -0.0057 0.0367
0.0412 0.0000 0.0375
0.0413 -0.0018 0.0374
0.0373 -0.0189 0.0369
0.0376 -0.0174 0.0373
0.0376 -0.0174 0.0373
0.0378 -0.0169 0.0373
0.0407 -0.0115 0.0363
0.0401 -0.0125 0.0366
0.0389 -0.0145 0.0372
0.0378 -0.0169 0.0373
0.0401 -0.0125 0.0366
0.0389 -0.0145 0.0372
0.0410 -0.0105 0.0363
0.0407 -0.0115 0.0363
0.0417 -0.0074 0.0362
0.0417 -0.0086 0.0360
0.0373 -0.0189 0.0369
0.0370 -0.0202 0.0365
0.0361 -0.0239 0.0351
0.0364 -0.0230 0.0354
0.0338 -0.0285 0.0339
0.0340 -0.0282 0.0340
0.0364 -0.0230 0.0354
0.0370 -0.0204 0.0364
0.0336 -0.0289 0.0338
0.0338 -0.0285 0.0339
0.0353 -0.0258 0.0346
0.0361 -0.0239 0.0351
0.0416 -0.0057 0.0367
0.0414 -0.0042 0.0370
0.0414 0.0013 0.0373
0.0412 0.0000 0.0375
0.0209 -0.0472 0.0210
0.0223 -0.0461 0.0219
0.0209 -0.0472 0.0210
0.0185 -0.0485 0.0203
0.0071 -0.0515 0.0202
0.0068 -0.0515 0.0202
0.0099 -0.0511 0.0200
0.0095 -0.0512 0.0200
0.0013 -0.0517 0.0208
-0.0010 -0.0516 0.0210
0.0013 -0.0517 0.0208
0.0017 -0.0517 0.0207
0.0041 -0.0516 0.0206
0.0017 -0.0517 0.0207
0.0068 -0.0515 0.0202
0.0044 -0.0516 0.0206
0.0177 -0.0489 0.0201
0.0153 -0.0498 0.0199
0.0133 -0.0504 0.0197
0.0153 -0.0498 0.0199
0.0099 -0.0511 0.0199
0.0126 -0.0506 0.0197
0.0126 -0.0506 0.0197
0.0133 -0.0504 0.0197
0.0240 -0.0445 0.0235
0.0223 -0.0461 0.0219
0.0274 -0.0398 0.0278
0.0265 -0.0415 0.0262
0.0306 -0.0340 0.0319
0.0308 -0.0337 0.0320
0.0293 -0.0365 0.0302
0.0305 -0.0342 0.0317
0.0293 -0.0365 0.0302
0.0283 -0.0384 0.0288
0.0240 -0.0445 0.0235
0.0247 -0.0438 0.0240
0.0279 -0.0390 0.0284
0.0283 -0.0384 0.0288
0.0340 -0.0282 0.0340
0.0353 -0.0258 0.0346
0.0308 -0.0337 0.0320
0.0322 -0.0313 0.0331
0.0274 -0.0398 0.0278
0.0279 -0.0390 0.0284
Thanks for you help

 Accepted Answer

[th, r, z] = cart2pol(d(:,1),d(:,2),d(:,3));
[sr, idx] = sort(th);
sd = d(idx,:);
plot3(sd(:,1), sd(:,2), sd(:,3))

5 Comments

Well, this is an awesome illustration of the fact that one should always start by visualizing data!
Perfect!!! It works as I wanted :) Just to add two question on the top, 1. luckily all my points lie on a shpere of radius r, would this still work for any scattered data? 2. the other thing is, can i get the curve as object? to interplolate or sample at diffrent points?
Thanks a lot!!
Walter will probably answer later, but here is a short answer: no, this solution is based on the fact that points describe a trajectory around the origin (in cylindrical coordinates) and that you have only one loop. Being on a sphere or not doesn't matter, but the two aforementioned conditions must hold. Note that if only the first condition is not verified, you can shift points (e.g. subtract coordinates of center of mass) before calling CART2POL.
One way to interpolate is to get ri, zi based on thi using INTERP1 with some th and [r,z] as inputs. One issue is that you have 205 confounded points, which means that thetas are not strictly monotonic increasing. Here is an example
% From Walter's solution => th, r, z, idx.
[th, r, z] = cart2pol(d(:,1),d(:,2),d(:,3));
[sr, idx] = sort(th);
% Build array of 100 random thetas where to interpolate.
ni = 100 ;
thi = 2*pi * (rand(ni,1)-0.5) ;
% Determine IDs of unique thetas/points => strict. monotonic.
idxm = idx([true; diff(th(idx))>0]) ;
% Interpolate => ri, zi.
rz = [r(idxm), z(idxm)] ;
rizi = interp1(th(idxm), rz, thi) ;
% Back to cartesian.
[xi,yi,zi] = pol2cart(thi, rizi(:,1), rizi(:,2)) ;
% Plot points/traj.
sd = d(idx,:) ;
figure(1) ; clf ; hold on ; rotate3d ;
plot3(sd(:,1), sd(:,2), sd(:,3)) ; % Trajectory.
plot3(sd(:,1), sd(:,2), sd(:,3), '.r') ; % Original points in red.
plot3(xi, yi, zi, '.g') ; % Interp. points in green.
and then use your mouse to rotate the axes and check that green dots are well placed.
@ Cedric Wannaz , Thanks a lot, i interpolate at equidistant thetas and they were all well placed

Sign in to comment.

More Answers (0)

Categories

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!