From 15c1dee802b5c9f9fddf66f7688b6d25bab92902 Mon Sep 17 00:00:00 2001 From: Yuto Horikawa Date: Sat, 10 Feb 2024 15:50:38 +0900 Subject: [PATCH] Update docs (#380) * update docs * remove dot * remove geometric modeling page * update fitting page * remove plots.jl page --- README.md | 2 +- docs/make.jl | 2 - docs/src/api.md | 1 + docs/src/geometricmodeling.md | 101 --------------- docs/src/math/bsplinebasis.md | 7 +- docs/src/math/fitting.md | 61 +++++++-- docs/src/math/rationalbsplinemanifold.md | 3 +- docs/src/visualization/plots.md | 156 ----------------------- 8 files changed, 56 insertions(+), 277 deletions(-) delete mode 100644 docs/src/geometricmodeling.md delete mode 100644 docs/src/visualization/plots.md diff --git a/README.md b/README.md index 55ad3a783..33bc6c5fa 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Basic (mathematical) operations for B-spline functions and related things with J [![Coverage](https://codecov.io/gh/hyrodium/BasicBSpline.jl/branch/main/graph/badge.svg)](https://codecov.io/gh/hyrodium/BasicBSpline.jl) [![Aqua QA](https://raw.githubusercontent.com/JuliaTesting/Aqua.jl/master/badge.svg)](https://github.com/JuliaTesting/Aqua.jl) [![DOI](https://zenodo.org/badge/258791290.svg)](https://zenodo.org/badge/latestdoi/258791290) -[![BasicBSpline Downloads](https://shields.io/endpoint?url=https://pkgs.genieframework.com/api/v1/badge/BasicBSpline)](https://pkgs.genieframework.com?packages=BasicBSpline). +[![BasicBSpline Downloads](https://shields.io/endpoint?url=https://pkgs.genieframework.com/api/v1/badge/BasicBSpline)](https://pkgs.genieframework.com?packages=BasicBSpline) ![](docs/src/img/BasicBSplineLogo.png) diff --git a/docs/make.jl b/docs/make.jl index 6fd1d3227..4f7536a81 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -71,11 +71,9 @@ makedocs(; # "ChainRules" => "chainrules.md" # ], "Visualization" => [ - "Plots.jl" => "visualization/plots.md", "PlotlyJS.jl" => "visualization/plotlyjs.md", "BasicBSplineExporter.jl" => "visualization/basicbsplineexporter.md", ], - "Geometric modeling" => "geometricmodeling.md", "Interpolations" => "interpolations.md", "API" => "api.md", ], diff --git a/docs/src/api.md b/docs/src/api.md index 81de6cb61..5e65c8806 100644 --- a/docs/src/api.md +++ b/docs/src/api.md @@ -30,6 +30,7 @@ isdegenerate(P::BSplineSpace) BSplineManifold unbounded_mapping RationalBSplineManifold +fittingcontrolpoints ``` ```@docs diff --git a/docs/src/geometricmodeling.md b/docs/src/geometricmodeling.md deleted file mode 100644 index afe52b78e..000000000 --- a/docs/src/geometricmodeling.md +++ /dev/null @@ -1,101 +0,0 @@ -# Geometric modeling - -## Setup - -```@example geometricmodeling -using BasicBSpline -using StaticArrays -using Plots -using LinearAlgebra -gr() -``` - -## Arc -```@example geometricmodeling -p = 2 -k = KnotVector([0,0,0,1,1,1]) -P = BSplineSpace{p}(k) -t = 1 # angle in radians -a = [SVector(1,0), SVector(1,tan(t/2)), SVector(cos(t),sin(t))] -w = [1,cos(t/2),1] -M = RationalBSplineManifold(a,w,P) -plot(M, xlims=(0,1.1), ylims=(0,1.1), aspectratio=1) -savefig("geometricmodeling-arc.png") # hide -nothing # hide -``` - -![](geometricmodeling-arc.png) - -## Circle -```@example geometricmodeling -p = 2 -k = KnotVector([0,0,0,1,1,2,2,3,3,4,4,4]) -P = BSplineSpace{p}(k) -a = [normalize(SVector(cosd(t), sind(t)), Inf) for t in 0:45:360] -w = [ifelse(isodd(i), √2, 1) for i in 1:9] -M = RationalBSplineManifold(a,w,P) -plot(M, xlims=(-1.2,1.2), ylims=(-1.2,1.2), aspectratio=1) -savefig("geometricmodeling-circle.png") # hide -nothing # hide -``` - -![](geometricmodeling-circle.png) - -## Torus -```@example geometricmodeling -plotly() -R1 = 3 -R2 = 1 - -A = push.(a, 0) - -a1 = (R1+R2)*A -a5 = (R1-R2)*A -a2 = [p+R2*SVector(0,0,1) for p in a1] -a3 = [p+R2*SVector(0,0,1) for p in R1*A] -a4 = [p+R2*SVector(0,0,1) for p in a5] -a6 = [p-R2*SVector(0,0,1) for p in a5] -a7 = [p-R2*SVector(0,0,1) for p in R1*A] -a8 = [p-R2*SVector(0,0,1) for p in a1] - -a = hcat(a1,a2,a3,a4,a5,a6,a7,a8,a1) -M = RationalBSplineManifold(a,w*w',P,P) -plot(M) -savefig("geometricmodeling-torus.html") # hide -nothing # hide -``` - -```@raw html - -``` - -## Paraboloid -```@example geometricmodeling -plotly() -p = 2 -k = KnotVector([-1,-1,-1,1,1,1]) -P = BSplineSpace{p}(k) -a = [SVector(i,j,2i^2+2j^2-2) for i in -1:1, j in -1:1] -M = BSplineManifold(a,P,P) -plot(M) -savefig("geometricmodeling-paraboloid.html") # hide -nothing # hide -``` - -```@raw html - -``` - -## Hyperbolic paraboloid -```@example geometricmodeling -plotly() -a = [SVector(i,j,2i^2-2j^2) for i in -1:1, j in -1:1] -M = BSplineManifold(a,P,P) -plot(M) -savefig("geometricmodeling-hyperbolicparaboloid.html") # hide -nothing # hide -``` - -```@raw html - -``` diff --git a/docs/src/math/bsplinebasis.md b/docs/src/math/bsplinebasis.md index d910773d0..5c42d2c85 100644 --- a/docs/src/math/bsplinebasis.md +++ b/docs/src/math/bsplinebasis.md @@ -274,6 +274,7 @@ end Let ``X_1, \dots, X_n`` be i.i.d. random variables with ``X_i \sim U(0,1)``, then the probability density function of ``X_1+\cdots+X_n`` can be obtained via `BasicBSpline.uniform_bsplinebasis_kernel(Val(n-1),t)`. ```@example math_bsplinebasis +gr() N = 100000 # polynomial degree 0 plot1 = histogram([rand() for _ in 1:N], normalize=true, label=false) @@ -289,10 +290,8 @@ plot4 = histogram([rand()+rand()+rand()+rand() for _ in 1:N], normalize=true, la plot!(t->BasicBSpline.uniform_bsplinebasis_kernel(Val(3),t), label=false) # plot all plot(plot1,plot2,plot3,plot4) -savefig("histogram-uniform.html") # hide +savefig("histogram-uniform.png") # hide nothing # hide ``` -```@raw html - -``` +![](histogram-uniform.png) diff --git a/docs/src/math/fitting.md b/docs/src/math/fitting.md index 0b135d3bf..3fd8542d8 100644 --- a/docs/src/math/fitting.md +++ b/docs/src/math/fitting.md @@ -1,23 +1,18 @@ # Fitting with B-spline manifold -The following functions such as `fittingcontolpoints` were provided from BasicBSpline.jl before v0.9.0. -From BasicBSpline v0.9.0, these functions are moved to [BasicBSplineFitting](https://github.com/hyrodium/BasicBSplineFitting.jl). - -```@setup math +## Setup +```@example math_fitting using BasicBSpline using BasicBSplineFitting -using BasicBSplineExporter using StaticArrays -using Plots; plotly() +using Plots ``` -Fitting with least squares method. +## Fitting with least squares -```@docs -fittingcontrolpoints -``` +[`fittingcontrolpoints`](@ref) function -```@example math +```@example math_fitting p1 = 2 p2 = 2 k1 = KnotVector(-10:10)+p1*KnotVector([-10,10]) @@ -29,9 +24,51 @@ f(u1, u2) = SVector(2u1 + sin(u1) + cos(u2) + u2 / 2, 3u2 + sin(u2) + sin(u1) / a = fittingcontrolpoints(f, (P1, P2)) M = BSplineManifold(a, (P1, P2)) -save_png("fitting.png", M, unitlength=50, xlims=(-10,10), ylims=(-10,10)) +gr() +plot(M; xlims=(-10,10), ylims=(-10,10), aspectratio=1) +savefig("fitting.png") # hide +nothing # hide ``` ![](fitting.png) [Try on Desmos graphing graphing calculator!](https://www.desmos.com/calculator/2hm3b1fbdf) ![](../img/fitting_desmos.png) + + +### Cardioid (planar curve) +```@example math_fitting +f(t) = SVector((1+cos(t))*cos(t),(1+cos(t))*sin(t)) +p = 3 +k = KnotVector(range(0,2π,15)) + p * KnotVector([0,2π]) + 2 * KnotVector([π]) +P = BSplineSpace{p}(k) +a = fittingcontrolpoints(f, P) +M = BSplineManifold(a, P) + +gr() +plot(M; aspectratio=1) +savefig("plots-cardioid.html") # hide +nothing # hide +``` + +```@raw html + +``` + +### Helix (spatial curve) +```@example math_fitting +f(t) = SVector(cos(t),sin(t),t) +p = 3 +k = KnotVector(range(0,6π,15)) + p * KnotVector([0,6π]) +P = BSplineSpace{p}(k) +a = fittingcontrolpoints(f, P) +M = BSplineManifold(a, P) + +plotly() +plot(M) +savefig("plots-helix.html") # hide +nothing # hide +``` + +```@raw html + +``` diff --git a/docs/src/math/rationalbsplinemanifold.md b/docs/src/math/rationalbsplinemanifold.md index bf3056711..58968d911 100644 --- a/docs/src/math/rationalbsplinemanifold.md +++ b/docs/src/math/rationalbsplinemanifold.md @@ -87,7 +87,8 @@ t = 1 # angle in radians a = [SVector(1,0), SVector(1,tan(t/2)), SVector(cos(t),sin(t))] w = [1,cos(t/2),1] M = RationalBSplineManifold(a,w,P) -plot(M, xlims=(0,1.1), ylims=(0,1.1), aspectratio=1) +plot([cosd(t) for t in 0:360], [sind(t) for t in 0:360]; xlims=(-1.1,1.1), ylims=(-1.1,1.1), aspectratio=1, label="circle", color=:gray, linestyle=:dash) +plot!(M; label="Rational B-spline curve") savefig("geometricmodeling-arc.png") # hide nothing # hide ``` diff --git a/docs/src/visualization/plots.md b/docs/src/visualization/plots.md deleted file mode 100644 index 77384c4d1..000000000 --- a/docs/src/visualization/plots.md +++ /dev/null @@ -1,156 +0,0 @@ -# Plots.jl - -`BasicBSpline.jl` has a dependency on [`RecipesBase.jl`](https://github.com/JuliaPlots/RecipesBase.jl). -This means, users can easily visalize instances defined in `BasicBSpline`. -In this section, we will provide some plottig examples. - -```@setup plots -using BasicBSpline -using BasicBSplineFitting -using StaticArrays -using Plots; plotly() -``` - -## `BSplineSpace` - -```@example plots -k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]) -P0 = BSplineSpace{0}(k) # 0th degree piecewise polynomial space -P1 = BSplineSpace{1}(k) # 1st degree piecewise polynomial space -P2 = BSplineSpace{2}(k) # 2nd degree piecewise polynomial space -P3 = BSplineSpace{3}(k) # 3rd degree piecewise polynomial space -plot( - plot([t->bsplinebasis(P0,i,t) for i in 1:dim(P0)], 0, 10, ylims=(0,1), legend=false, title="0th polynomial degree"), - plot([t->bsplinebasis(P1,i,t) for i in 1:dim(P1)], 0, 10, ylims=(0,1), legend=false, title="1st polynomial degree"), - plot([t->bsplinebasis(P2,i,t) for i in 1:dim(P2)], 0, 10, ylims=(0,1), legend=false, title="2nd polynomial degree"), - plot([t->bsplinebasis(P3,i,t) for i in 1:dim(P3)], 0, 10, ylims=(0,1), legend=false, title="3rd polynomial degree"), -) -savefig("plots-bsplinebasis-raw.html") # hide -nothing # hide -``` - -```@raw html - -``` - -```@example plots -k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]) -P0 = BSplineSpace{0}(k) # 0th degree piecewise polynomial space -P1 = BSplineSpace{1}(k) # 1st degree piecewise polynomial space -P2 = BSplineSpace{2}(k) # 2nd degree piecewise polynomial space -P3 = BSplineSpace{3}(k) # 3rd degree piecewise polynomial space -plot( - plot(P0, ylims=(0,1), legend=false, title="0th polynomial degree"), - plot(P1, ylims=(0,1), legend=false, title="1st polynomial degree"), - plot(P2, ylims=(0,1), legend=false, title="2nd polynomial degree"), - plot(P3, ylims=(0,1), legend=false, title="3rd polynomial degree"), - layout=(2,2), -) -savefig("plots-bsplinebasis.html") # hide -nothing # hide -``` - -```@raw html - -``` - -## `BSplineDerivativeSpace` - -```@example plots -k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]) -P = BSplineSpace{3}(k) -plot( - plot(BSplineDerivativeSpace{0}(P), label="0th derivative", color=:black), - plot(BSplineDerivativeSpace{1}(P), label="1st derivative", color=:red), - plot(BSplineDerivativeSpace{2}(P), label="2nd derivative", color=:green), - plot(BSplineDerivativeSpace{3}(P), label="3rd derivative", color=:blue), -) -savefig("plots-bsplinebasisderivative.html") # hide -nothing # hide -``` - -```@raw html - -``` - -## `BSplineManifold` - -### Cardioid (planar curve) -```@example plots -f(t) = SVector((1+cos(t))*cos(t),(1+cos(t))*sin(t)) -p = 3 -k = KnotVector(range(0,2π,15)) + p * KnotVector([0,2π]) + 2 * KnotVector([π]) -P = BSplineSpace{p}(k) -a = fittingcontrolpoints(f, P) -M = BSplineManifold(a, P) - -plot(M) -savefig("plots-cardioid.html") # hide -nothing # hide -``` - -```@raw html - -``` - -### Helix (spatial curve) -```@example plots -f(t) = SVector(cos(t),sin(t),t) -p = 3 -k = KnotVector(range(0,6π,15)) + p * KnotVector([0,6π]) -P = BSplineSpace{p}(k) -a = fittingcontrolpoints(f, P) -M = BSplineManifold(a, P) - -plot(M) -savefig("plots-helix.html") # hide -nothing # hide -``` - -```@raw html - -``` - -### B-spline surface - -```@example plots -p1 = 2 -p2 = 3 -k1 = KnotVector(1:10) -k2 = KnotVector(1:20) -P1 = BSplineSpace{p1}(k1) -P2 = BSplineSpace{p2}(k2) -a = [SVector(i-j^2/20, j+i^2/10, sin((i+j)/2)+randn()) for i in 1:dim(P1), j in 1:dim(P2)] -M = BSplineManifold(a,(P1,P2)) -plot(M) - -savefig("plots-surface.html") # hide -nothing # hide -``` - -```@raw html - -``` - - -## `RationalBSplineManifold` - -```@example plots -k = KnotVector([0,0,0,1,1,1]) -P = BSplineSpace{2}(k) -a = [SVector(1,0),SVector(1,1),SVector(0,1)] -w = [1,1/√2,1] -M = BSplineManifold(a,P) -R = RationalBSplineManifold(a,w,P) -ts = 0:0.01:2 -plot(cospi.(ts),sinpi.(ts), label="circle") -plot!(M, label="B-spline curve") -plot!(R, label="Rational B-spline curve") - -savefig("plots-arc.html") # hide -nothing # hide -``` - -```@raw html - -```