I tried googling for “parametric splines” but didn’t end up with a concise 
definition of what they are. If B-splines fit your needs (and it seems from 
the SciPy documentation that it might do), maybe Interpolations.jl 
<https://github.com/tlycken/Interpolations.jl> would be useful enough? The 
API is a little different, but I think this does what you’re after:

using Interpolations

t = 0:.1:.9
x = sin(2π*t)
y = cos(2π*t)
A = hcat(x,y)

itp = scale(interpolate(A, (BSpline(Cubic(Periodic())), NoInterp()), OnGrid()), 
t, 1:2)

tfine = 0:.01:1
xs, ys = [itp[t,1] for t in tfine], [itp[t,2] for t in tfine]

using Gadfly
plot(layer(x=x,y=y,Geom.point),layer(x=xs,y=ys,Geom.path))

Results on my machine:

<https://lh3.googleusercontent.com/-caXHox7rTE4/Vu7V6Ad2ePI/AAAAAAAABIE/j22VyECSoGkeGaIQaXX_kNOgIzY-FR0Mg/s1600/parametric-spline.png>

// T

On Sunday, March 20, 2016 at 3:04:12 AM UTC+1, Kyle Barbary wrote:

Hi Kaj,
>
> A pull request adding a wrapper for this to Dierckx.jl would be most 
> welcome. This would be a matter of reading the docstring for the parcur 
> function here 
> <https://github.com/kbarbary/Dierckx.jl/blob/master/deps/src/ddierckx/parcur.f>
>  
> and then writing a wrapper function that sets up the arguments correctly 
> and calls the Fortran function with ccall. There are a lot of examples in 
> Dierckx.jl. It’s a bit tedious but mostly straight forward. Fortunately 
> (for me anyway) knowing Fortran is not a requirement. I usually consult the 
> relevant scipy.interpolate wrapper (e.g., this one for splprep 
> <https://github.com/scipy/scipy/blob/05dc7b8b0662c9c973203b36044458ca35084833/scipy/interpolate/fitpack.py#L107>)
>  
> to see how they handled things, and look at the tests in that package as 
> well.
>
> You can construct an array of vectors by prepending the element type, 
> which in your example would be Vector{Float64}. For example:
>
> julia> a = [1., 2.];
>
> julia> b = [3., 4.];
>
> julia> Vector{Float64}[a, b]
> 2-element Array{Array{Float64,1},1}:
>  [1.0,2.0]
>  [3.0,4.0]
>
> The plan for Julia 0.5, is that you won’t need to prepend the element 
> type: just [a, b] will do.
>
> By the way, collect is often not necessary. For example:
>
> julia> t = 0.0:0.1:0.5
> 0.0:0.1:0.5
>
> julia> sin(2*pi*t)
> 6-element Array{Float64,1}:
>  0.0        
>  0.587785   
>  0.951057   
>  0.951057   
>  0.587785   
>  1.22465e-16
>
> Best,
> — Kyle
> ​
>
> On Sat, Mar 19, 2016 at 3:24 PM, Kaj Wiik <[email protected] <javascript:>
> > wrote:
>
>> Replying to myself...sorry.
>>
>> It seems that the easiest way for now is to call SciPy:
>>
>> using PyCall
>> @pyimport scipy.interpolate as interpolate
>> t = collect(0:.1:1)
>> x = sin(2π*t)
>> y = cos(2π*t)
>> p = Array[]
>> push!(p, x)
>> push!(p, y)
>> tck, u = interpolate.splprep(p, s=0)
>> unew = collect(0:0.01:1)
>> out = interpolate.splev(unew, tck)
>>
>> using Winston
>> plot(x, y, "o", out[1], out[2], "-r")
>>
>> BTW, is there an easier way to create an array of vectors?
>>
>> Cheers,
>> Kaj
>>
>>
>> On Saturday, March 19, 2016 at 4:13:19 PM UTC+2, Kaj Wiik wrote:
>>>
>>>
>>> Is there a Julia package that implements parametric splines? 
>>>
>>> I noticed that the Dierckx Fortran library has an implementation but the 
>>> corresponding Julia package does not does not have bindings for it.
>>>
>>> Thanks,
>>> Kaj
>>>
>>
> ​

Reply via email to