working on recipes

This commit is contained in:
Thomas Breloff 2015-10-09 14:35:00 -04:00
parent 64b8e15918
commit 45747e3635
3 changed files with 232 additions and 157 deletions

File diff suppressed because one or more lines are too long

214
examples/recipes.ipynb Normal file

File diff suppressed because one or more lines are too long

View File

@ -9,6 +9,16 @@ plot!(recipe::PlotRecipe, args...; kw...) = plot!(getRecipeXY(recipe)..., args..
plot!(plt::Plot, recipe::PlotRecipe, args...; kw...) = plot!(getRecipeXY(recipe)..., args...; getRecipeArgs(recipe)..., kw...)
# -------------------------------------------------
function rotate(x::Real, y::Real, θ::Real; center = (0,0))
cx = x - center[1]
cy = y - center[2]
xrot = cx * cos(θ) - cy * sin(θ)
yrot = cy * cos(θ) + cx * sin(θ)
xrot + center[1], yrot + center[2]
end
# -------------------------------------------------
type EllipseRecipe <: PlotRecipe
@ -22,24 +32,21 @@ EllipseRecipe(w,h,x,y) = EllipseRecipe(w,h,x,y,0)
# return x,y coords of a rotated ellipse, centered at the origin
function rotatedEllipse(w, h, x, y, θ, rotθ)
# coord before rotation
# # coord before rotation
xpre = w * cos(θ)
ypre = h * sin(θ)
# rotate
xrot = xpre * cos(rotθ) + ypre * sin(rotθ)
yrot = ypre * cos(rotθ) - xpre * sin(rotθ)
# translate
xrot + x, yrot + y
# rotate and translate
r = rotate(xpre, ypre, rotθ)
x + r[1], y + r[2]
end
function getRecipeXY(ep::EllipseRecipe)
x, y = unzip([rotatedEllipse(ep.w, ep.h, ep.x, ep.y, u, ep.θ) for u in linspace(0,2π,100)])
right = rotatedEllipse(ep.w, ep.h, ep.x, ep.y, 0, ep.θ)
top = rotatedEllipse(ep.w, ep.h, ep.x, ep.y, 0.5π, ep.θ)
linex = Float64[top[1], ep.x, right[1]]
liney = Float64[top[2], ep.y, right[2]]
top = rotate(0, ep.h, ep.θ)
right = rotate(ep.w, 0, ep.θ)
linex = Float64[top[1], 0, right[1]] + ep.x
liney = Float64[top[2], 0, right[2]] + ep.y
Any[x, linex], Any[y, liney]
end