initial
This commit is contained in:
112
CwJ/makie-demos/bezier.jl
Normal file
112
CwJ/makie-demos/bezier.jl
Normal file
@@ -0,0 +1,112 @@
|
||||
using AbstractPlotting
|
||||
using AbstractPlotting.MakieLayout
|
||||
using GLMakie
|
||||
|
||||
using LinearAlgebra
|
||||
|
||||
|
||||
function bezier()
|
||||
descr = """
|
||||
Bezier Curves: B(t) = ∑(binomial(n,i) * tⁱ * (1-t)⁽ⁿ⁻¹⁾ * Pᵢ)
|
||||
"""
|
||||
|
||||
## From http://juliaplots.org/MakieReferenceImages/gallery//edit_polygon/index.html:
|
||||
function add_move!(scene, points, pplot)
|
||||
idx = Ref(0); dragstart = Ref(false); startpos = Base.RefValue(Point2f0(0))
|
||||
on(events(scene).mousedrag) do drag
|
||||
if ispressed(scene, Mouse.left)
|
||||
if drag == Mouse.down
|
||||
plot, _idx = mouse_selection(scene)
|
||||
if plot == pplot
|
||||
idx[] = _idx; dragstart[] = true
|
||||
startpos[] = to_world(scene, Point2f0(scene.events.mouseposition[]))
|
||||
end
|
||||
elseif drag == Mouse.pressed && dragstart[] && checkbounds(Bool, points[], idx[])
|
||||
pos = to_world(scene, Point2f0(scene.events.mouseposition[]))
|
||||
|
||||
# very wierd, but we work with components
|
||||
# not vector
|
||||
z = zero(eltype(pos))
|
||||
x,y = pos
|
||||
|
||||
ptidx = idx[]
|
||||
|
||||
x = clamp(x, -1, 1)
|
||||
y = clamp(y, -1, 1)
|
||||
|
||||
points[][idx[]] = [x,y]
|
||||
points[] = points[]
|
||||
end
|
||||
else
|
||||
dragstart[] = false
|
||||
end
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
upperpoints = Point2f0[(0,0), (5, 0), (5, 5), (0,5)]
|
||||
lowerpoints = (Point2f0[(0,0), (5, 0), (5, -5), (0,-5)])
|
||||
|
||||
points = Node(Point2f0[(1, 4), (3, 0), (4,-4.0)])
|
||||
|
||||
# where we lay our scene:
|
||||
scene, layout = layoutscene()
|
||||
layout.halign = :left
|
||||
layout.valign = :top
|
||||
|
||||
|
||||
p = layout[1, 1:2] = LScene(scene)
|
||||
rowsize!(layout, 1, Auto(1))
|
||||
colsize!(layout, 1, Auto(1))
|
||||
colsize!(layout, 2, Auto(1))
|
||||
|
||||
npts = layout[2,1:2] = LSlider(scene, range=3:12, startvalue=4)
|
||||
layout[3,1:2] = LText(scene, chomp(descr))
|
||||
|
||||
# points = Node(Point2f0[(-1/2, -1/2),
|
||||
# (-1/2, 1/2),
|
||||
# (1/2, 1/2),
|
||||
# (1/2, -1/2)])
|
||||
|
||||
#npts = 6
|
||||
#ts = range(3pi/2, -pi/2, length=npts+2)
|
||||
#points = Node(Point2f0[(cos(t),sin(t)) for t in ts[2:end-1]])
|
||||
|
||||
points = lift(npts.value) do val
|
||||
ts = range(3pi/2, -pi/2, length=val+2)
|
||||
Point2f0[(cos(t),sin(t)) for t in ts[2:end-1]]
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
bcurve = lift(points) do pts
|
||||
n = length(pts) - 1
|
||||
B = t -> begin
|
||||
tot = 0.0
|
||||
for (i′, Pᵢ) in enumerate(pts)
|
||||
i = i′ - 1
|
||||
tot += binomial(n, i) * t^i * (1-t)^(n-i) * Pᵢ
|
||||
end
|
||||
tot
|
||||
end
|
||||
ts = range(0, 1, length=200)
|
||||
Point2f0[B(t) for t in ts]
|
||||
end
|
||||
|
||||
|
||||
|
||||
lines!(p.scene, bcurve, strokecolor=:black, strokewidth=15)
|
||||
lines!(p.scene, points, strokecolor=:gray90, strokewidth=5, linestyle=:dash)
|
||||
scatter!(p.scene, points)
|
||||
xlims!(p.scene, (-1,1))
|
||||
ylims!(p.scene, (-1,1))
|
||||
add_move!(p.scene, points, p.scene[end])
|
||||
|
||||
|
||||
|
||||
scene
|
||||
|
||||
end
|
||||
Reference in New Issue
Block a user