# Interpolate a 3D curve?

**URL:** https://discourse.julialang.org/t/interpolate-a-3d-curve/56401
**Category:** New to Julia
**Tags:** interpolations
**Created:** [March 3, 2021, 11:50am UTC](https://discourse.julialang.org/t/interpolate-a-3d-curve/56401 "2021-03-03T11:50:03Z")
**Posts on this page:** 9
**Page:** 1

<div class="post-metadata">

### Author: ![marianoarnaiz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marianoarnaiz/32/19377_2.png) [@marianoarnaiz](https://discourse.julialang.org/u/marianoarnaiz)
#### Post date: [March 3, 2021, 11:50am UTC](https://discourse.julialang.org/t/interpolate-a-3d-curve/56401/1 "2021-03-03T11:50:03Z")

</div>

Hi everyone, I know this must be very simple using Interpolations.jl but I can’t get it to work. I have a 3D curve in an array (example bellow) and I need to have 10 times more points. Linear or Bspline interpolation between the points are OK.  
Any idea?  
Thanks in advance

rayo=[-67 0.00 200.0  
-67 0.09 210.0  
-67 2.06 410.0  
-67 6.04 660.0  
-67 14.26 778.8  
-67 22.48 660.0  
-67 26.45 410.0  
-67 28.43 210.0  
-67 28.52 200.0  
-67 29.82 35.0  
-67 29.91 20.0  
-67 30.00 0.0]

---

<div class="post-metadata">

### Author: ![fgerick](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fgerick/32/13228_2.png) [@fgerick](https://discourse.julialang.org/u/fgerick)
#### Post date: [March 3, 2021, 12:04pm UTC](https://discourse.julialang.org/t/interpolate-a-3d-curve/56401/2 "2021-03-03T12:04:28Z")

</div>

```julia
julia> itp=interpolate(rayo,BSpline(Linear()))
12×3 interpolate(::Matrix{Float64}, BSpline(Linear())) with element type Float64:
 -67.0 0.0 200.0
 -67.0 0.09 210.0
 -67.0 2.06 410.0
 -67.0 6.04 660.0
 -67.0 14.26 778.8
 -67.0 22.48 660.0
 -67.0 26.45 410.0
 -67.0 28.43 210.0
 -67.0 28.52 200.0
 -67.0 29.82 35.0
 -67.0 29.91 20.0
 -67.0 30.0 0.0

julia> itp(range(1,12,length=120),1:3)

```

---

<div class="post-metadata">

### Author: ![marianoarnaiz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marianoarnaiz/32/19377_2.png) [@marianoarnaiz](https://discourse.julialang.org/u/marianoarnaiz)
#### Post date: [March 3, 2021, 12:19pm UTC](https://discourse.julialang.org/t/interpolate-a-3d-curve/56401/3 "2021-03-03T12:19:29Z")

</div>

> [@fgerick](#):
>
> `itp(range(1,12,length=120),1:3)`

Works great! Thanks!

---

<div class="post-metadata">

### Author: ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)
#### Post date: [March 3, 2021, 5:54pm UTC](https://discourse.julialang.org/t/interpolate-a-3d-curve/56401/4 "2021-03-03T17:54:14Z")

</div>

Dierckx.jl parametric splines interpolation is perfect for this problem:

```julia
using Dierckx
N = size(rayo,1)
spl = ParametricSpline(1:N, rayo') # adjoint to have data series along matrix rows
tfine = LinRange(1, N, 10*N) # interpolates with 10x more points
xyz = evaluate(spl,tfine)'

```

![3D_points_Dierckx_Parametric_Interpolation](https://global.discourse-cdn.com/julialang/original/3X/d/5/d509f5a904eb33f0a8816c8a8164d68007609595.png)

---

<div class="post-metadata">

### Author: ![marianoarnaiz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marianoarnaiz/32/19377_2.png) [@marianoarnaiz](https://discourse.julialang.org/u/marianoarnaiz)
#### Post date: [March 3, 2021, 7:50pm UTC](https://discourse.julialang.org/t/interpolate-a-3d-curve/56401/5 "2021-03-03T19:50:05Z")

</div>

Ok, I will admit that one is exactly what I wanted

---

<div class="post-metadata">

### Author: ![marianoarnaiz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marianoarnaiz/32/19377_2.png) [@marianoarnaiz](https://discourse.julialang.org/u/marianoarnaiz)
#### Post date: [March 3, 2021, 7:57pm UTC](https://discourse.julialang.org/t/interpolate-a-3d-curve/56401/6 "2021-03-03T19:57:40Z")

</div>

> [@rafael.guerra](#):
>
> ```julia
> using Dierckx
> N = size(rayo,1)
> spl = ParametricSpline(1:N, rayo') # adjoint to have data series along matrix rows
> tfine = LinRange(1, N, 10*N) # interpolates with 10x more points
> xyz = evaluate(spl,tfine)'
> 
> ```

I am getting a bit of back-and-forth with the interpolation, any way to get rid of it?

---

<div class="post-metadata">

### Author: ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)
#### Post date: [March 3, 2021, 8:01pm UTC](https://discourse.julialang.org/t/interpolate-a-3d-curve/56401/7 "2021-03-03T20:01:37Z")

</div>

Are you referring to the tiny variation around the constant -67.0 coordinate?

```julia
julia> extrema(xyz[:,1])
(-67.00000000000003, -66.99999999999997)

```

To tame the plots use the `xlims` keyword.

---

<div class="post-metadata">

### Author: ![marianoarnaiz](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/marianoarnaiz/32/19377_2.png) [@marianoarnaiz](https://discourse.julialang.org/u/marianoarnaiz)
#### Post date: [March 3, 2021, 8:11pm UTC](https://discourse.julialang.org/t/interpolate-a-3d-curve/56401/8 "2021-03-03T20:11:41Z")

</div>

More in the Y coordinate… it makes some “Z” that I can’t have. I know it is usual with splines… but I wonder if they can be avoided.

---

<div class="post-metadata">

### Author: ![rafael.guerra](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rafael.guerra/32/216610_2.png) [@rafael.guerra](https://discourse.julialang.org/u/rafael.guerra)
#### Post date: [March 3, 2021, 8:46pm UTC](https://discourse.julialang.org/t/interpolate-a-3d-curve/56401/9 "2021-03-03T20:46:47Z")

</div>

Could you post a graph of what exactly you mean to avoid misinterpretation?  
If you refer to the “overshooting” of the interpolating parametric splines in the plot below of the y coordinates versus point number, this can be overcome by using the smoothing option that does not pass exactly at the points:

```julia
spl2 = ParametricSpline(1:N, rayo', s=2000) # define smoothing error s, data dependent

```

Result for y-coordinate:

 ![Dierckx_3D_points_parametric_smoothing_spline](https://global.discourse-cdn.com/julialang/original/3X/f/1/f14c0d5d29cc2f0adee27053392096090e1e498d.png)
