From cb5da831c8f802476d28fc2850dbcd5979d58005 Mon Sep 17 00:00:00 2001 From: "Documenter.jl" Date: Tue, 19 Sep 2023 03:42:13 +0000 Subject: [PATCH] build based on d10dab0 --- dev/.documenter-siteinfo.json | 1 + dev/1dim-manifold.html | 4 +- dev/2dim-manifold-currying.html | 4 +- dev/2dim-manifold.html | 4 +- dev/2dim_h-refinement.png | Bin 108969 -> 108953 bytes dev/2dim_p-refinement.png | Bin 115373 -> 115445 bytes dev/BasicBSplineExporter_2dim.png | Bin 125953 -> 125913 bytes dev/assets/documenter.js | 737 +- dev/assets/search.js | 267 - dev/assets/themes/documenter-dark.css | 7699 +--------------- dev/assets/themes/documenter-light.css | 7733 +---------------- dev/assets/themeswap.js | 82 +- dev/assets/warner.js | 87 +- dev/basicbsplineexporter/index.html | 4 +- dev/bsplinebasisall-1.html | 4 +- dev/bsplinebasisall-2.html | 4 +- dev/bsplinebasisall-3.html | 4 +- dev/bsplinebasisderivativeplot.html | 4 +- dev/bsplinebasisplot.html | 4 +- dev/bsplinebasisplot2.html | 4 +- dev/cardioid.html | 6 +- dev/contributing/index.html | 2 +- dev/fitting.png | Bin 227321 -> 227485 bytes dev/geometricmodeling-arc.html | 4 +- dev/geometricmodeling-circle.html | 4 +- ...eometricmodeling-hyperbolicparaboloid.html | 4 +- dev/geometricmodeling-paraboloid.html | 4 +- dev/geometricmodeling-torus.html | 4 +- dev/geometricmodeling/index.html | 4 +- dev/helix.html | 6 +- dev/histogram-uniform.html | 66 +- dev/index.html | 4 +- dev/internal/index.html | 4 +- dev/interpolation_cubic.html | 4 +- dev/interpolation_linear.html | 4 +- dev/interpolation_periodic.html | 4 +- dev/interpolation_periodic_sin.html | 4 +- dev/interpolations/index.html | 4 +- dev/math-bsplinebasis/index.html | 75 +- dev/math-bsplinemanifold/index.html | 16 +- dev/math-bsplinespace/index.html | 23 +- dev/math-derivative/index.html | 14 +- dev/math-fitting/index.html | 6 +- dev/math-inclusive/index.html | 25 +- dev/math-knotvector/index.html | 40 +- dev/math-rationalbsplinemanifold/index.html | 7 +- dev/math-refinement/index.html | 4 +- dev/math/index.html | 4 +- dev/plotlyjs/index.html | 4 +- dev/plots-arc.html | 4 +- dev/plots-bsplinebasis-raw.html | 4 +- dev/plots-bsplinebasis.html | 4 +- dev/plots-bsplinebasisderivative.html | 4 +- dev/plots-cardioid.html | 4 +- dev/plots-helix.html | 4 +- dev/plots-surface.html | 4 +- dev/plots/index.html | 4 +- dev/search/index.html | 2 - dev/search_index.js | 2 +- dev/subbsplineplot.html | 4 +- dev/subbsplineplot2.html | 4 +- dev/sumofbsplineplot.html | 4 +- dev/sumofbsplineplot2.html | 4 +- dev/sumofbsplineplot3.html | 4 +- 64 files changed, 993 insertions(+), 16059 deletions(-) create mode 100644 dev/.documenter-siteinfo.json delete mode 100644 dev/assets/search.js delete mode 100644 dev/search/index.html diff --git a/dev/.documenter-siteinfo.json b/dev/.documenter-siteinfo.json new file mode 100644 index 000000000..398e963e8 --- /dev/null +++ b/dev/.documenter-siteinfo.json @@ -0,0 +1 @@ +{"documenter":{"julia_version":"1.9.3","generation_timestamp":"2023-09-19T03:41:16","documenter_version":"1.0.1"}} \ No newline at end of file diff --git a/dev/1dim-manifold.html b/dev/1dim-manifold.html index 7d04ebc3a..83875207e 100644 --- a/dev/1dim-manifold.html +++ b/dev/1dim-manifold.html @@ -1,7 +1,7 @@ -
+
+
+

BasicBSplineExporter.jl

BasicBSplineExporter.jl supports export BasicBSpline.BSplineManifold{Dim,Deg,<:StaticVector} to:

  • PNG image (.png)
  • SVG image (.png)
  • POV-Ray mesh (.inc)

Installation

] add https://github.com/hyrodium/BasicBSplineExporter.jl

First example

using BasicBSpline
+BasicBSplineExporter.jl · BasicBSpline.jl

BasicBSplineExporter.jl

BasicBSplineExporter.jl supports export BasicBSpline.BSplineManifold{Dim,Deg,<:StaticVector} to:

  • PNG image (.png)
  • SVG image (.png)
  • POV-Ray mesh (.inc)

Installation

] add https://github.com/hyrodium/BasicBSplineExporter.jl

First example

using BasicBSpline
 using BasicBSplineExporter
 using StaticArrays
 
@@ -12,4 +12,4 @@
 n2 = dim(P2)
 a = [SVector(2i-6.5+rand(),1.5j-6.5+rand()) for i in 1:dim(P1), j in 1:dim(P2)] # random generated control points
 M = BSplineManifold(a,(P1,P2)) # Define B-spline manifold
-save_png("BasicBSplineExporter_2dim.png", M) # save image

Other examples

Here are some images rendared with POV-Ray.

See BasicBSplineExporter.jl/test for more examples.

+save_png("BasicBSplineExporter_2dim.png", M) # save image

Other examples

Here are some images rendared with POV-Ray.

See BasicBSplineExporter.jl/test for more examples.

diff --git a/dev/bsplinebasisall-1.html b/dev/bsplinebasisall-1.html index 0274eab64..3fd1bc0d8 100644 --- a/dev/bsplinebasisall-1.html +++ b/dev/bsplinebasisall-1.html @@ -1,7 +1,7 @@ -
+
+
+
+
+
+
@@ -17,9 +17,9 @@ window.PLOTLYENV = window.PLOTLYENV || {} - if (document.getElementById('d38325cf-284c-4911-81f4-8abedd839f49')) { + if (document.getElementById('75e2ff16-2b87-4bf5-99d6-e05da58db803')) { Plotly.newPlot( - 'd38325cf-284c-4911-81f4-8abedd839f49', + '75e2ff16-2b87-4bf5-99d6-e05da58db803', [{"x":[1.999759001518061,2.0015083833616054,1.788116686260899,1.0176731052593309,0.21435955333452697,-0.24586426105910286,-0.27200580243640377,-0.07533894204442493,0.0012247388041783502,-0.00020885889244779896,0.0012247388041780813,-0.07533894204442466,-0.27200580243640393,-0.24586426105910336,0.21435955333452728,1.01767310525933,1.7881166862609021,2.0015083833616027,1.9997590015180586],"line":{"color":"blue"},"y":[0.000258648120407782,0.2988351812852854,0.8960860814400403,1.3666845344070295,1.2565473946695778,0.759996911845506,0.2504295376978045,0.0014193036958738883,0.0001811887931162982,-1.1492543028346347e-17,-0.0001811887931160482,-0.001419303695873413,-0.250429537697805,-0.7599969118455058,-1.2565473946695767,-1.3666845344070317,-0.8960860814400412,-0.2988351812852838,-0.0002586481204076563],"type":"scatter","name":"control points","marker":{"size":8}},{"mode":"lines","line":{"color":"red"},"y":[0.000258648120407782,0.05060881196427182,0.10088426242113469,0.15100935827558765,0.200908458312222,0.25050592131562893,0.29972610607039973,0.3484933713611255,0.3967320759723978,0.4443665786888075,0.4913212382949461,0.5375204135754049,0.582888463314775,0.6273497462976473,0.6708286213086139,0.7132494471322655,0.7545365825531933,0.7946143863559888,0.8334072960590209,0.8708537608770228,0.9069222684189552,0.9415851875774109,0.9748148872449838,1.0065837363142671,1.0368641036778554,1.0656283582283417,1.092848868858319,1.118498004460382,1.142548133927124,1.164971626151138,1.1857408500250186,1.204828174441359,1.222205968292752,1.2378466004717927,1.2517224398710736,1.2638058553831892,1.2740700315423261,1.2825150992642202,1.2891736640836262,1.2940802649079637,1.297269440644654,1.2987757302011183,1.2986336724847776,1.2968778064030517,1.2935426708633622,1.2886628047731306,1.2822727470397763,1.2744070365707216,1.265100212273386,1.2543868130551914,1.2423013778235585,1.2288784454859079,1.2141525549496603,1.1981582451222377,1.180931464236402,1.1625260448441825,1.143008112913044,1.1224440360643173,1.1009001819193323,1.07844291809942,1.055138612225911,1.0310536319201355,1.0062543448034234,0.9808071184971064,0.9547783206225143,0.9282343188009774,0.9012414806538265,0.8738661738023922,0.8461747658680046,0.8182336244719941,0.7901091172356915,0.7618676117804275,0.7335736135437414,0.7052801358752427,0.6770358125441437,0.6488892686984364,0.6208891294861111,0.59308402005516,0.5655225655535742,0.5382533911293447,0.5113251219304633,0.48478638310492095,0.45868579980070906,0.43307199716581957,0.4079936003482427,0.3834992344959706,0.3596375247569947,0.3364570962793056,0.3140065742108951,0.2923345806016259,0.27147929370892476,0.251445137676135,0.2322297300574618,0.21383068840711136,0.19624563027928996,0.17947217322820277,0.16350793480805606,0.14835053257305597,0.13399758407740783,0.12044670687531789,0.10769551852099221,0.0957416365686362,0.084582678572456,0.07421626208665766,0.06464000466544678,0.05585152386302952,0.04784843723361147,0.04062820264367164,0.03417436516646768,0.02844595780915113,0.0233995184581384,0.01899158499984583,0.015178695320689524,0.011917387307085837,0.009164198845451086,0.00687566782220144,0.005008332123753223,0.0035187296365227255,0.0023633982469261645,0.0014988758413798505,0.0008817003063000227,0.0004684095281029673,0.00021554139320495685,7.96337880222513e-5,1.7224598971125096e-5,-1.7224598971125438e-5,-7.963378802220866e-5,-0.00021554139320487437,-0.0004684095281028482,-0.00088170030629987,-0.0014988758413796678,-0.002363398246925955,-0.0035187296365224935,-0.005008332123752971,-0.006875667822201172,-0.009164198845450805,-0.011917387307085546,-0.015178695320689228,-0.01899158499984553,-0.02339951845813811,-0.028445957809150844,-0.0341743651664674,-0.04062820264367139,-0.04784843723361123,-0.0558515238630293,-0.06464000466544659,-0.0742162620866575,-0.08458267857245584,-0.09574163656863609,-0.10769551852099211,-0.12044670687531786,-0.13399758407740786,-0.14835053257305597,-0.16350793480805614,-0.17947217322820286,-0.1962456302792901,-0.2138306884071115,-0.23222973005746197,-0.25144513767613524,-0.271479293708925,-0.29233458060162576,-0.3140065742108957,-0.33645709627930576,-0.3596375247569945,-0.38349923449597123,-0.407993600348243,-0.43307199716581934,-0.45868579980070967,-0.4847863831049211,-0.511325121930463,-0.5382533911293451,-0.5655225655535742,-0.5930840200551597,-0.6208891294861116,-0.6488892686984362,-0.6770358125441436,-0.7052801358752431,-0.7335736135437416,-0.7618676117804273,-0.7901091172356917,-0.818233624471994,-0.846174765868004,-0.8738661738023911,-0.9012414806538263,-0.9282343188009768,-0.9547783206225133,-0.980807118497106,-1.006254344803423,-1.0310536319201344,-1.0551386122259105,-1.0784429180994195,-1.1009001819193316,-1.122444036064317,-1.1430081129130434,-1.1625260448441816,-1.1809314642364017,-1.1981582451222372,-1.2141525549496601,-1.228878445485908,-1.2423013778235583,-1.2543868130551914,-1.2651002122733863,-1.2744070365707216,-1.2822727470397763,-1.288662804773131,-1.293542670863363,-1.2968778064030524,-1.2986336724847782,-1.2987757302011194,-1.2972694406446552,-1.294080264907965,-1.2891736640836273,-1.2825150992642218,-1.274070031542328,-1.2638058553831901,-1.2517224398710751,-1.2378466004717945,-1.2222059682927535,-1.2048281744413603,-1.1857408500250206,-1.1649716261511394,-1.1425481339271253,-1.1184980044603838,-1.09284886885832,-1.0656283582283428,-1.036864103677857,-1.0065837363142682,-0.9748148872449849,-0.9415851875774119,-0.9069222684189555,-0.8708537608770236,-0.8334072960590213,-0.7946143863559885,-0.7545365825531933,-0.7132494471322658,-0.6708286213086131,-0.6273497462976472,-0.5828884633147747,-0.5375204135754051,-0.4913212382949452,-0.44436657868880697,-0.3967320759723978,-0.34849337136112435,-0.299726106070399,-0.25050592131562877,-0.20090845831222073,-0.1510093582755871,-0.1008842624211348,-0.05060881196427089,-0.0002586481204076563],"type":"scatter","name":"B-spline curve","x":[1.999759001518061,1.9990315480100604,1.9962827706568063,1.9915482735810333,1.984863660905477,1.9762645367528702,1.965786505245949,1.9534651705074464,1.939336136660099,1.9234350078266398,1.9057973881298043,1.886458881692327,1.865455092636942,1.8428216250863838,1.8185940831633884,1.7928080709906893,1.7654991926910208,1.7367030523871183,1.706455317503469,1.6748029208321245,1.6418169459562464,1.6075715970009767,1.5721410780914593,1.5355995933528368,1.4980213469102535,1.4594805428888522,1.420051385413775,1.379808078610167,1.3388248266031697,1.2971758335179275,1.2549353034795836,1.2121774406132808,1.168976449044162,1.1254065328973715,1.0815418962980516,1.037456743371346,0.9932251814083063,0.9489181185885196,0.9046026076601557,0.860345471838723,0.8162135343397294,0.7722736183786835,0.728592547171094,0.685237143932469,0.6422742318783163,0.5997706342241456,0.5577931741854641,0.516408674977781,0.4756839598166035,0.43568585191744125,0.39648117449580217,0.3581367507671941,0.3207194039471262,0.2842959572511066,0.2489309911848961,0.2146606262983245,0.18150142019021556,0.14946954590696643,0.11858117649497425,0.08885248500063689,0.06029964447035134,0.03293882795051514,0.006786208487525381,-0.018142040872220093,-0.04182974708232417,-0.06426073709638967,-0.08541883786801871,-0.10528787635081427,-0.12385167949837886,-0.1410940742643153,-0.15699888760222588,-0.17154994646571337,-0.18473671657772153,-0.196583462177543,-0.20712770905458733,-0.2164070091036779,-0.22445891421963776,-0.2313209762972901,-0.237030747231458,-0.24162577891696474,-0.2451436232486334,-0.24762183212128736,-0.2490979574297495,-0.24960955106884317,-0.24919416493339147,-0.24788935091821765,-0.24573266091814475,-0.24276164682799603,-0.23901386054259466,-0.2345268549646056,-0.22934158043117112,-0.2235099677151012,-0.21708616181748974,-0.21012430773943105,-0.20267855048201958,-0.1948030350463491,-0.18655190643351408,-0.1779793096446088,-0.1691393896807272,-0.16008629154296367,-0.1508741602324125,-0.14155714075016765,-0.13218937809732345,-0.12282501727497429,-0.11351820328421404,-0.10432308112613724,-0.0952937958018377,-0.08648438994608498,-0.07793998752758781,-0.06968999928417598,-0.06176223647985243,-0.0541845103786201,-0.046984632244481545,-0.04019041334143974,-0.03382966493349758,-0.027930198284657686,-0.022519824658922976,-0.017626355320296345,-0.01327760153278044,-0.009501374560378233,-0.006325485667092406,-0.0037777461169258473,-0.0018859671738814033,-0.0006779601019618208,-0.00018153616516995775,-0.0001815361651699792,-0.000677960101961878,-0.0018859671738814868,-0.00377774611692595,-0.006325485667092519,-0.009501374560378351,-0.013277601532780556,-0.017626355320296452,-0.022519824658923077,-0.02793019828465777,-0.033829664933497657,-0.04019041334143979,-0.04698463224448158,-0.05418451037862011,-0.06176223647985242,-0.06968999928417595,-0.07793998752758778,-0.08648438994608493,-0.09529379580183764,-0.10432308112613715,-0.11351820328421397,-0.12282501727497422,-0.1321893780973234,-0.1415571407501676,-0.15087416023241249,-0.1600862915429636,-0.16913938968072717,-0.17797930964460879,-0.18655190643351408,-0.19480303504634916,-0.2026785504820196,-0.21012430773943117,-0.21708616181748983,-0.22350996771510132,-0.22934158043117125,-0.23452685496460557,-0.2390138605425949,-0.2427616468279962,-0.24573266091814494,-0.24788935091821784,-0.24919416493339175,-0.24960955106884342,-0.24909795742974974,-0.24762183212128763,-0.24514362324863376,-0.24162577891696502,-0.23703074723145834,-0.23132097629729048,-0.22445891421963798,-0.21640700910367822,-0.20712770905458777,-0.1965834621775431,-0.18473671657772178,-0.1715499464657139,-0.15699888760222588,-0.14109407426431542,-0.12385167949837927,-0.10528787635081484,-0.0854188378680188,-0.06426073709638985,-0.04182974708232477,-0.01814204087222003,0.006786208487525272,0.032938827950514595,0.06029964447035153,0.0888524850006368,0.11858117649497399,0.14946954590696676,0.1815014201902156,0.2146606262983242,0.2489309911848964,0.28429595725110657,0.32071940394712584,0.35813675076719464,0.396481174495802,0.43568585191744075,0.47568395981660405,0.5164086749777808,0.5577931741854635,0.599770634224146,0.6422742318783166,0.6852371439324683,0.7285925471710945,0.7722736183786836,0.8162135343397288,0.8603454718387219,0.904602607660156,0.9489181185885195,0.9932251814083057,1.0374567433713462,1.0815418962980516,1.1254065328973712,1.168976449044163,1.212177440613281,1.2549353034795838,1.2971758335179289,1.3388248266031706,1.3798080786101674,1.4200513854137768,1.459480542888853,1.4980213469102543,1.535599593352839,1.572141078091461,1.6075715970009776,1.641816945956248,1.6748029208321262,1.7064553175034691,1.7367030523871196,1.7654991926910217,1.7928080709906897,1.8185940831633896,1.842821625086385,1.8654550926369413,1.886458881692326,1.9057973881298036,1.9234350078266385,1.9393361366600974,1.953465170507445,1.9657865052459464,1.9762645367528677,1.9848636609054746,1.991548273581031,1.9962827706568038,1.9990315480100578,1.9997590015180586]}], {"template":{"layout":{"coloraxis":{"colorbar":{"ticks":"","outlinewidth":0}},"xaxis":{"gridcolor":"white","zerolinewidth":2,"title":{"standoff":15},"ticks":"","zerolinecolor":"white","automargin":true,"linecolor":"white"},"hovermode":"closest","paper_bgcolor":"white","geo":{"showlakes":true,"showland":true,"landcolor":"#E5ECF6","bgcolor":"white","subunitcolor":"white","lakecolor":"white"},"colorscale":{"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"yaxis":{"gridcolor":"white","zerolinewidth":2,"title":{"standoff":15},"ticks":"","zerolinecolor":"white","automargin":true,"linecolor":"white"},"shapedefaults":{"line":{"color":"#2a3f5f"}},"hoverlabel":{"align":"left"},"mapbox":{"style":"light"},"polar":{"angularaxis":{"gridcolor":"white","ticks":"","linecolor":"white"},"bgcolor":"#E5ECF6","radialaxis":{"gridcolor":"white","ticks":"","linecolor":"white"}},"autotypenumbers":"strict","font":{"color":"#2a3f5f"},"ternary":{"baxis":{"gridcolor":"white","ticks":"","linecolor":"white"},"bgcolor":"#E5ECF6","caxis":{"gridcolor":"white","ticks":"","linecolor":"white"},"aaxis":{"gridcolor":"white","ticks":"","linecolor":"white"}},"annotationdefaults":{"arrowhead":0,"arrowwidth":1,"arrowcolor":"#2a3f5f"},"plot_bgcolor":"#E5ECF6","title":{"x":0.05},"scene":{"xaxis":{"gridcolor":"white","gridwidth":2,"backgroundcolor":"#E5ECF6","ticks":"","showbackground":true,"zerolinecolor":"white","linecolor":"white"},"zaxis":{"gridcolor":"white","gridwidth":2,"backgroundcolor":"#E5ECF6","ticks":"","showbackground":true,"zerolinecolor":"white","linecolor":"white"},"yaxis":{"gridcolor":"white","gridwidth":2,"backgroundcolor":"#E5ECF6","ticks":"","showbackground":true,"zerolinecolor":"white","linecolor":"white"}},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"]},"data":{"barpolar":[{"type":"barpolar","marker":{"line":{"color":"#E5ECF6","width":0.5}}}],"carpet":[{"aaxis":{"gridcolor":"white","endlinecolor":"#2a3f5f","minorgridcolor":"white","startlinecolor":"#2a3f5f","linecolor":"white"},"type":"carpet","baxis":{"gridcolor":"white","endlinecolor":"#2a3f5f","minorgridcolor":"white","startlinecolor":"#2a3f5f","linecolor":"white"}}],"scatterpolar":[{"type":"scatterpolar","marker":{"colorbar":{"ticks":"","outlinewidth":0}}}],"parcoords":[{"line":{"colorbar":{"ticks":"","outlinewidth":0}},"type":"parcoords"}],"scatter":[{"type":"scatter","marker":{"colorbar":{"ticks":"","outlinewidth":0}}}],"histogram2dcontour":[{"colorbar":{"ticks":"","outlinewidth":0},"type":"histogram2dcontour","colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"contour":[{"colorbar":{"ticks":"","outlinewidth":0},"type":"contour","colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"scattercarpet":[{"type":"scattercarpet","marker":{"colorbar":{"ticks":"","outlinewidth":0}}}],"mesh3d":[{"colorbar":{"ticks":"","outlinewidth":0},"type":"mesh3d"}],"surface":[{"colorbar":{"ticks":"","outlinewidth":0},"type":"surface","colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"scattermapbox":[{"type":"scattermapbox","marker":{"colorbar":{"ticks":"","outlinewidth":0}}}],"scattergeo":[{"type":"scattergeo","marker":{"colorbar":{"ticks":"","outlinewidth":0}}}],"histogram":[{"type":"histogram","marker":{"colorbar":{"ticks":"","outlinewidth":0}}}],"pie":[{"type":"pie","automargin":true}],"choropleth":[{"colorbar":{"ticks":"","outlinewidth":0},"type":"choropleth"}],"heatmapgl":[{"colorbar":{"ticks":"","outlinewidth":0},"type":"heatmapgl","colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"bar":[{"type":"bar","error_y":{"color":"#2a3f5f"},"error_x":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5}}}],"heatmap":[{"colorbar":{"ticks":"","outlinewidth":0},"type":"heatmap","colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"contourcarpet":[{"colorbar":{"ticks":"","outlinewidth":0},"type":"contourcarpet"}],"table":[{"type":"table","header":{"line":{"color":"white"},"fill":{"color":"#C8D4E3"}},"cells":{"line":{"color":"white"},"fill":{"color":"#EBF0F8"}}}],"scatter3d":[{"line":{"colorbar":{"ticks":"","outlinewidth":0}},"type":"scatter3d","marker":{"colorbar":{"ticks":"","outlinewidth":0}}}],"scattergl":[{"type":"scattergl","marker":{"colorbar":{"ticks":"","outlinewidth":0}}}],"histogram2d":[{"colorbar":{"ticks":"","outlinewidth":0},"type":"histogram2d","colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"scatterternary":[{"type":"scatterternary","marker":{"colorbar":{"ticks":"","outlinewidth":0}}}],"scatterpolargl":[{"type":"scatterpolargl","marker":{"colorbar":{"ticks":"","outlinewidth":0}}}]}},"height":500,"margin":{"l":50,"b":50,"r":50,"t":60},"width":500}, {"editable":false,"responsive":true,"staticPlot":false,"scrollZoom":true}, diff --git a/dev/contributing/index.html b/dev/contributing/index.html index 015e8c648..415e61c21 100644 --- a/dev/contributing/index.html +++ b/dev/contributing/index.html @@ -1,2 +1,2 @@ -Contributing · BasicBSpline.jl

Contributing

The main contributer Hyrodium is not native English speaker. So, English corrections would be really helpful. Of course, other code improvement are welcomed!

Feel free to open issues and pull requests!

+Contributing · BasicBSpline.jl

Contributing

The main contributer Hyrodium is not native English speaker. So, English corrections would be really helpful. Of course, other code improvement are welcomed!

Feel free to open issues and pull requests!

diff --git a/dev/fitting.png b/dev/fitting.png index 03fe12036fdcb7d7fb3b987b2c1500e8b83a67bf..27b390ae9b937b0ec7d098b892ca1a8b9a2f7612 100644 GIT binary patch literal 227485 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 literal 227321 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 XUfq7R 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⪙ncNt%Lw#s8!)QrxKH~?+eCmmbeTzLPCCT|9;(6 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

P4+o$g2Mtvvf=v#tpQ8 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 K=GCS?@&5%0yt*v_ diff --git a/dev/geometricmodeling-arc.html b/dev/geometricmodeling-arc.html index d067818be..315b3572a 100644 --- a/dev/geometricmodeling-arc.html +++ b/dev/geometricmodeling-arc.html @@ -1,7 +1,7 @@ -
+
+
+
+
+
diff --git a/dev/helix.html b/dev/helix.html index 5aa615fff..dd77e93a9 100644 --- a/dev/helix.html +++ b/dev/helix.html @@ -9,7 +9,7 @@
@@ -17,9 +17,9 @@ window.PLOTLYENV = window.PLOTLYENV || {} - if (document.getElementById('33202595-ea0f-4db8-b63f-f0bb77736b1b')) { + if (document.getElementById('487b4f32-9dbc-430b-9887-77bf283e0954')) { Plotly.newPlot( - '33202595-ea0f-4db8-b63f-f0bb77736b1b', + '487b4f32-9dbc-430b-9887-77bf283e0954', [{"x":[0.9953709320381128,1.019321397389834,0.2947842694597305,-1.2209024461609082,-0.8492251518754993,0.8483695529395563,1.2239110839089242,-0.30206030207110546,-1.3593687410804203,-0.3020603020711057,1.2239110839089242,0.8483695529395566,-0.8492251518754994,-1.2209024461609084,0.2947842694597287,1.0193213973898347,0.9953709320381123],"line":{"color":"blue"},"y":[0.0033962712301962316,0.4446750942572991,1.3217067455617062,0.5914273192366225,-1.0634935646239,-1.0620726715335462,0.5894312464269061,1.3250963187728528,4.2240516640035253e-16,-1.3250963187728526,-0.5894312464269077,1.0620726715335451,1.0634935646239012,-0.5914273192366217,-1.3217067455617044,-0.444675094257299,-0.0033962712301963682],"type":"scatter3d","name":"control points","z":[1.4983674023749671e-15,0.44879895051282703,1.3463968515384859,2.692793703076963,4.039190554615459,5.385587406153927,6.731984257692425,8.07838110923089,9.424777960769381,10.771174812307873,12.117571663846347,13.463968515384815,14.810365366923318,16.156762218461775,17.50315907000024,18.400756971025924,18.849555921538766],"marker":{"size":8}},{"mode":"lines","line":{"color":"red"},"y":[0.0033962712301962316,0.07774252706071076,0.1516756964733853,0.2248351000262815,0.29686005827746104,0.36738989178498577,0.43606392110691716,0.5025214668013169,0.5664018494262469,0.6273443895397688,0.6849884076999442,0.7389732244648349,0.7889381603925025,0.8345225360410082,0.8753656719684149,0.9111068887327832,0.9413855068921755,0.9658408470046529,0.9841131479289631,0.9960060720347576,1.0016736304088207,1.001315102960625,0.9951297695996421,0.9833169102353443,0.9660758047772038,0.9436057331346925,0.9161059752172829,0.8837758109344463,0.8468145201956556,0.8054213829103826,0.7597956789880996,0.710136688338278,0.6566436908703909,0.5995159664939095,0.5389527951183065,0.4751534566530542,0.40832063506726796,0.33876947437459837,0.26695065059304035,0.19332290862270698,0.11834499336371153,0.04247564971616751,-0.03382637741981166,-0.11010234314411271,-0.18589350255662218,-0.26074111075722683,-0.3341864228458131,-0.4057706939222677,-0.4750351790864772,-0.5415211334383279,-0.6047698120777072,-0.6643224701045014,-0.719720362618597,-0.7705047447198805,-0.81623723326697,-0.8567378355574689,-0.8920041726390097,-0.9220373569444673,-0.9468385009067153,-0.9664087169586281,-0.9807491175330805,-0.9898608150629462,-0.9937449219811,-0.9924025507204165,-0.9858348137137692,-0.9740428233940334,-0.9570276921940822,-0.934790532546791,-0.9073324568850336,-0.8746545776416843,-0.8367580072496185,-0.7936438581417088,-0.7453609931775856,-0.692252957248658,-0.6347755971759252,-0.5733849808471781,-0.5085371761502065,-0.4406882509728009,-0.37029427320275127,-0.2978113107278479,-0.2236954314358815,-0.1484027032146416,-0.07238919395191903,0.0038890284644964163,0.07997589614681437,0.15541534120724432,0.22975129575799635,0.30252769191128004,0.3732884617793053,0.4415775528149607,0.506990625899738,0.5692904786118451,0.6282736120010541,0.6837365271171363,0.7354757250098635,0.7832877067290069,0.826968973324339,0.8663160258456302,0.9011253653426535,0.9311934928651802,0.9563169094629815,0.9762921161858293,0.9909156140834954,0.9999839042057515,1.0032934876023687,1.0006408653231191,0.9918225384177743,0.9766372228221332,0.9550766064170917,0.9274723620886828,0.8941907703171116,0.8555981115825815,0.8120606663652953,0.7639447151454594,0.7116165384032758,0.6554424166189504,0.595788630272685,0.5330214598446865,0.46750718581515593,0.39961208866430065,0.32970244887232125,0.25814454691942534,0.18530466328581333,0.11154907845169287,0.03724407289726461,-0.037244072897263975,-0.11154907845169222,-0.1853046632858127,-0.25814454691942473,-0.32970244887232064,-0.39961208866430015,-0.46750718581515543,-0.533021459844686,-0.5957886302726846,-0.6554424166189499,-0.7116165384032752,-0.7639447151454591,-0.812060666365295,-0.8555981115825813,-0.8941907703171114,-0.9274723620886827,-0.9550766064170917,-0.9766372228221329,-0.9918225384177743,-1.0006408653231194,-1.003293487602369,-0.9999839042057518,-0.9909156140834958,-0.97629211618583,-0.956316909462982,-0.9311934928651809,-0.9011253653426542,-0.8663160258456314,-0.8269689733243392,-0.7832877067290078,-0.7354757250098638,-0.6837365271171374,-0.6282736120010544,-0.5692904786118462,-0.5069906258997383,-0.4415775528149618,-0.3732884617793057,-0.3025276919112813,-0.2297512957579967,-0.15541534120724562,-0.07997589614681466,-0.00388902846449772,0.07238919395191681,0.14840270321464036,0.22369543143587925,0.29781131072784667,0.3702942732027491,0.4406882509727996,0.5085371761502047,0.5733849808471769,0.6347755971759236,0.692252957248657,0.7453609931775842,0.7936438581417079,0.8367580072496171,0.8746545776416842,0.9073324568850332,0.9347905325467909,0.9570276921940819,0.974042823394033,0.9858348137137692,0.9924025507204164,0.9937449219811,0.9898608150629464,0.9807491175330805,0.9664087169586283,0.9468385009067155,0.9220373569444674,0.8920041726390102,0.85673783555747,0.8162372332669706,0.7705047447198817,0.7197203626185976,0.6643224701045027,0.6047698120777081,0.5415211334383295,0.4750351790864776,0.40577069392226894,0.33418642284581357,0.260741110757228,0.18589350255662268,0.11010234314411405,0.033826377419812176,-0.042475649716166186,-0.11834499336371106,-0.1933229086227055,-0.2669506505930398,-0.3387694743745971,-0.4083206350672657,-0.47515345665305425,-0.5389527951183062,-0.5995159664939085,-0.6566436908703891,-0.7101366883382783,-0.759795678988099,-0.8054213829103815,-0.8468145201956541,-0.8837758109344442,-0.9161059752172818,-0.9436057331346913,-0.9660758047772023,-0.9833169102353427,-0.995129769599641,-1.0013151029606235,-1.0016736304088196,-0.9960060720347566,-0.9841131479289614,-0.9658408470046517,-0.9413855068921745,-0.9111068887327827,-0.8753656719684132,-0.8345225360410075,-0.7889381603925019,-0.7389732244648348,-0.6849884076999424,-0.6273443895397677,-0.5664018494262466,-0.5025214668013176,-0.43606392110691533,-0.3673898917849848,-0.2968600582774611,-0.2248351000262824,-0.15167569647338366,-0.07774252706071,-0.0033962712301963682],"type":"scatter3d","name":"B-spline curve","z":[1.4983674023749671e-15,0.07570102779734561,0.15140205559468978,0.227103083392034,0.3028041111893782,0.37850513898672267,0.4542061667840671,0.5299071945814114,0.6056082223787559,0.6813092501761002,0.7570102779734448,0.8327113057707894,0.908412333568134,0.9841133613654782,1.059814389162823,1.1355154169601673,1.211216444757512,1.2869174725548564,1.3626185003522004,1.4383195281495451,1.5140205559468896,1.589721583744234,1.665422611541578,1.7411236393389222,1.8168246671362667,1.892525694933611,1.9682267227309556,2.043927750528299,2.1196287783256436,2.195329806122988,2.271030833920333,2.346731861717677,2.4224328895150213,2.498133917312366,2.5738349451097102,2.6495359729070547,2.7252370007043996,2.800938028501744,2.876639056299089,2.9523400840964333,3.0280411118937782,3.1037421396911236,3.1794431674884684,3.255144195285813,3.330845223083158,3.406546250880503,3.4822472786778476,3.557948306475192,3.6336493342725373,3.7093503620698813,3.7850513898672267,3.860752417664571,3.936453445461915,4.01215447325926,4.0878555010566044,4.163556528853949,4.239257556651292,4.314958584448638,4.390659612245981,4.466360640043325,4.542061667840669,4.617762695638012,4.6934637234353564,4.769164751232702,4.844865779030045,4.92056680682739,4.996267834624733,5.071968862422078,5.147669890219421,5.223370918016765,5.2990719458141085,5.374772973611453,5.450474001408799,5.526175029206143,5.601876057003488,5.677577084800832,5.753278112598176,5.828979140395521,5.904680168192867,5.980381195990211,6.056082223787556,6.131783251584902,6.2074842793822445,6.283185307179591,6.358886334976937,6.4345873627742805,6.510288390571626,6.585989418368969,6.661690446166316,6.737391473963659,6.813092501761003,6.888793529558347,6.964494557355692,7.040195585153035,7.11589661295038,7.191597640747723,7.267298668545068,7.34299969634241,7.418700724139754,7.494401751937098,7.570102779734442,7.6458038075317845,7.72150483532913,7.797205863126474,7.872906890923818,7.948607918721161,8.024308946518502,8.100009974315851,8.175711002113195,8.25141202991054,8.327113057707882,8.402814085505227,8.478515113302572,8.554216141099914,8.62991716889726,8.705618196694605,8.78131922449195,8.857020252289294,8.932721280086641,9.008422307883983,9.084123335681328,9.159824363478673,9.235525391276019,9.311226419073362,9.38692744687071,9.462628474668055,9.5383295024654,9.614030530262742,9.689731558060089,9.765432585857432,9.841133613654778,9.916834641452123,9.992535669249467,10.068236697046812,10.143937724844157,10.219638752641503,10.295339780438848,10.371040808236192,10.446741836033537,10.522442863830882,10.598143891628224,10.67384491942557,10.749545947222913,10.825246975020256,10.900948002817602,10.976649030614949,11.052350058412292,11.128051086209636,11.20375211400698,11.279453141804325,11.355154169601667,11.43085519739901,11.506556225196356,11.582257252993701,11.657958280791043,11.73365930858839,11.809360336385732,11.885061364183073,11.960762391980417,12.036463419777762,12.112164447575104,12.187865475372453,12.263566503169795,12.339267530967138,12.41496855876448,12.490669586561825,12.566370614359167,12.642071642156512,12.717772669953858,12.793473697751198,12.869174725548543,12.944875753345887,13.020576781143234,13.096277808940576,13.171978836737921,13.247679864535264,13.32338089233261,13.399081920129952,13.474782947927297,13.550483975724642,13.626185003521988,13.701886031319333,13.777587059116682,13.853288086914024,13.928989114711365,14.004690142508712,14.08039117030606,14.156092198103401,14.231793225900748,14.307494253698092,14.383195281495437,14.458896309292781,14.53459733709013,14.61029836488747,14.685999392684813,14.76170042048216,14.837401448279504,14.91310247607685,14.988803503874191,15.064504531671538,15.140205559468878,15.215906587266225,15.291607615063569,15.36730864286091,15.443009670658254,15.5187106984556,15.59441172625294,15.670112754050283,15.745813781847625,15.82151480964497,15.897215837442312,15.972916865239657,16.048617893037,16.124318920834344,16.200019948631688,16.275720976429028,16.351422004226375,16.427123032023715,16.502824059821062,16.57852508761841,16.654226115415746,16.729927143213093,16.805628171010433,16.88132919880778,16.957030226605124,17.032731254402464,17.10843228219981,17.184133309997158,17.259834337794498,17.335535365591845,17.41123639338919,17.486937421186532,17.56263844898388,17.638339476781223,17.714040504578566,17.78974153237592,17.865442560173264,17.941143587970604,18.01684461576795,18.0925456435653,18.168246671362642,18.243947699159996,18.31964872695734,18.395349754754683,18.47105078255203,18.546751810349377,18.62245283814672,18.698153865944075,18.77385489374142,18.849555921538766],"x":[0.9953709320381128,0.9958039190046631,0.9892469720434032,0.9760357419505834,0.9565058795224549,0.930993035555269,0.8998328608452753,0.8633610061887252,0.82191312238187,0.7758248602209602,0.7254318705022463,0.6710698040219795,0.6130743115764107,0.5517810439617904,0.4875256519743696,0.42064378641039923,0.35147109806612997,0.2803432377378128,0.20759598092194592,0.13358729514049983,0.0587227233690144,-0.01658604415663669,-0.09192731720057994,-0.16688940552694176,-0.24106061889984867,-0.3140292670834268,-0.38538365984180295,-0.4547121069391034,-0.5216029181394546,-0.5856444032069829,-0.646424871905815,-0.7035326340000769,-0.7565559992538954,-0.8050832774313966,-0.8487027782967071,-0.8870028116139534,-0.9195783975519709,-0.9462462481684996,-0.9670902490421011,-0.9822101918958317,-0.9917058684527484,-0.995677070435908,-0.9942235895683671,-0.9874452175731824,-0.9754417461734106,-0.9583129670921086,-0.9361586720523328,-0.9090786527771405,-0.8771727009895879,-0.8405406084127324,-0.7992821667696298,-0.7534971677833374,-0.7032854031769118,-0.6487466646734096,-0.5899971650721495,-0.5273615004049573,-0.46130750624268263,-0.3923058338414059,-0.32082713445720673,-0.24734205934616527,-0.17232125976436147,-0.09623538696787556,-0.019555092212787256,0.05724897324482327,0.133706158148876,0.20934581124329107,0.2836972812719882,0.3562899169788877,0.4266530671079093,0.4943160804029729,0.5588083056079982,0.6196590914669066,0.6764363747216658,0.7289462300836832,0.7770854855190366,0.8207511476419426,0.8598402230666177,0.8942497184072788,0.9238766402781424,0.948617995293425,0.9683707900673435,0.9830320312141145,0.9924987253479544,0.9966678790830803,0.9954364990337082,0.9887015918140551,0.9763601640383378,0.9583092223207724,0.9344457732755764,0.9046668553603394,0.8689768510459023,0.8277270763612068,0.7813388072275437,0.7302333195662045,0.6748318892984803,0.6155557923456617,0.5528263046290405,0.48706470206990804,0.4186922605895544,0.3481302561092711,0.27579996455034955,0.20212266183408067,0.12751962388175564,0.0524121266146656,-0.022778554045898458,-0.09763114217864519,-0.17172436186228351,-0.24463743755830317,-0.3159931895778846,-0.38549124698892134,-0.45283905734023555,-0.517744068180654,-0.5799137270590035,-0.6390554815241063,-0.6948767791247907,-0.7470850674098791,-0.7953877939281996,-0.8394924062285749,-0.8791063518598325,-0.9139370783707957,-0.9436920333102916,-0.9680786642271442,-0.9868044186701797,-0.9995767441882225,-1.0061030883300988,-1.0061030883300988,-0.9995767441882226,-0.9868044186701795,-0.9680786642271442,-0.9436920333102917,-0.9139370783707959,-0.8791063518598327,-0.839492406228575,-0.7953877939281997,-0.7470850674098792,-0.6948767791247908,-0.6390554815241064,-0.5799137270590036,-0.5177440681806541,-0.45283905734023566,-0.38549124698892145,-0.3159931895778847,-0.24463743755830333,-0.17172436186228363,-0.09763114217864623,-0.022778554045898635,0.05241212661466458,0.12751962388175545,0.20212266183407965,0.2757999645503495,0.3481302561092702,0.41869226058955433,0.4870647020699072,0.5528263046290411,0.6155557923456616,0.6748318892984807,0.7302333195662044,0.7813388072275441,0.8277270763612067,0.8689768510459027,0.9046668553603393,0.9344457732755767,0.9583092223207724,0.9763601640383378,0.988701591814055,0.9954364990337082,0.9966678790830804,0.9924987253479546,0.9830320312141148,0.9683707900673438,0.9486179952934253,0.9238766402781429,0.8942497184072791,0.8598402230666184,0.8207511476419427,0.7770854855190372,0.7289462300836833,0.6764363747216665,0.6196590914669068,0.5588083056079993,0.4943160804029725,0.42665306710790946,0.35628991697888707,0.28369728127198834,0.2093458112432903,0.13370615814887618,0.05724897324482244,-0.01955509221278717,-0.0962353869678764,-0.1723212597643614,-0.24734205934616604,-0.3208271344572067,-0.3923058338414067,-0.4613075062426827,-0.5273615004049566,-0.5899971650721496,-0.6487466646734089,-0.7032854031769116,-0.7534971677833368,-0.7992821667696298,-0.8405406084127319,-0.8771727009895882,-0.9090786527771405,-0.9361586720523332,-0.9583129670921086,-0.975441746173411,-0.9874452175731823,-0.9942235895683673,-0.9956770704359083,-0.9917058684527487,-0.982210191895832,-0.9670902490421013,-0.9462462481685003,-0.919578397551972,-0.8870028116139531,-0.8487027782967074,-0.8050832774313974,-0.7565559992538965,-0.7035326340000764,-0.6464248719058151,-0.5856444032069836,-0.5216029181394563,-0.45471210693910596,-0.385383659841803,-0.3140292670834278,-0.24106061889985037,-0.16688940552694437,-0.09192731720057984,-0.01658604415663739,0.05872272336901274,0.1335872951404973,0.20759598092194598,0.2803432377378124,0.3514710980661288,0.4206437864103973,0.4875256519743702,0.5517810439617903,0.6130743115764098,0.6710698040219782,0.7254318705022468,0.7758248602209602,0.8219131223818699,0.8633610061887248,0.8998328608452757,0.9309930355552689,0.9565058795224551,0.9760357419505832,0.9892469720434034,0.995803919004663,0.9953709320381123]}], {"template":{"layout":{"coloraxis":{"colorbar":{"ticks":"","outlinewidth":0}},"xaxis":{"gridcolor":"white","zerolinewidth":2,"title":{"standoff":15},"ticks":"","zerolinecolor":"white","automargin":true,"linecolor":"white"},"hovermode":"closest","paper_bgcolor":"white","geo":{"showlakes":true,"showland":true,"landcolor":"#E5ECF6","bgcolor":"white","subunitcolor":"white","lakecolor":"white"},"colorscale":{"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]},"yaxis":{"gridcolor":"white","zerolinewidth":2,"title":{"standoff":15},"ticks":"","zerolinecolor":"white","automargin":true,"linecolor":"white"},"shapedefaults":{"line":{"color":"#2a3f5f"}},"hoverlabel":{"align":"left"},"mapbox":{"style":"light"},"polar":{"angularaxis":{"gridcolor":"white","ticks":"","linecolor":"white"},"bgcolor":"#E5ECF6","radialaxis":{"gridcolor":"white","ticks":"","linecolor":"white"}},"autotypenumbers":"strict","font":{"color":"#2a3f5f"},"ternary":{"baxis":{"gridcolor":"white","ticks":"","linecolor":"white"},"bgcolor":"#E5ECF6","caxis":{"gridcolor":"white","ticks":"","linecolor":"white"},"aaxis":{"gridcolor":"white","ticks":"","linecolor":"white"}},"annotationdefaults":{"arrowhead":0,"arrowwidth":1,"arrowcolor":"#2a3f5f"},"plot_bgcolor":"#E5ECF6","title":{"x":0.05},"scene":{"xaxis":{"gridcolor":"white","gridwidth":2,"backgroundcolor":"#E5ECF6","ticks":"","showbackground":true,"zerolinecolor":"white","linecolor":"white"},"zaxis":{"gridcolor":"white","gridwidth":2,"backgroundcolor":"#E5ECF6","ticks":"","showbackground":true,"zerolinecolor":"white","linecolor":"white"},"yaxis":{"gridcolor":"white","gridwidth":2,"backgroundcolor":"#E5ECF6","ticks":"","showbackground":true,"zerolinecolor":"white","linecolor":"white"}},"colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"]},"data":{"barpolar":[{"type":"barpolar","marker":{"line":{"color":"#E5ECF6","width":0.5}}}],"carpet":[{"aaxis":{"gridcolor":"white","endlinecolor":"#2a3f5f","minorgridcolor":"white","startlinecolor":"#2a3f5f","linecolor":"white"},"type":"carpet","baxis":{"gridcolor":"white","endlinecolor":"#2a3f5f","minorgridcolor":"white","startlinecolor":"#2a3f5f","linecolor":"white"}}],"scatterpolar":[{"type":"scatterpolar","marker":{"colorbar":{"ticks":"","outlinewidth":0}}}],"parcoords":[{"line":{"colorbar":{"ticks":"","outlinewidth":0}},"type":"parcoords"}],"scatter":[{"type":"scatter","marker":{"colorbar":{"ticks":"","outlinewidth":0}}}],"histogram2dcontour":[{"colorbar":{"ticks":"","outlinewidth":0},"type":"histogram2dcontour","colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"contour":[{"colorbar":{"ticks":"","outlinewidth":0},"type":"contour","colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"scattercarpet":[{"type":"scattercarpet","marker":{"colorbar":{"ticks":"","outlinewidth":0}}}],"mesh3d":[{"colorbar":{"ticks":"","outlinewidth":0},"type":"mesh3d"}],"surface":[{"colorbar":{"ticks":"","outlinewidth":0},"type":"surface","colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"scattermapbox":[{"type":"scattermapbox","marker":{"colorbar":{"ticks":"","outlinewidth":0}}}],"scattergeo":[{"type":"scattergeo","marker":{"colorbar":{"ticks":"","outlinewidth":0}}}],"histogram":[{"type":"histogram","marker":{"colorbar":{"ticks":"","outlinewidth":0}}}],"pie":[{"type":"pie","automargin":true}],"choropleth":[{"colorbar":{"ticks":"","outlinewidth":0},"type":"choropleth"}],"heatmapgl":[{"colorbar":{"ticks":"","outlinewidth":0},"type":"heatmapgl","colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"bar":[{"type":"bar","error_y":{"color":"#2a3f5f"},"error_x":{"color":"#2a3f5f"},"marker":{"line":{"color":"#E5ECF6","width":0.5}}}],"heatmap":[{"colorbar":{"ticks":"","outlinewidth":0},"type":"heatmap","colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"contourcarpet":[{"colorbar":{"ticks":"","outlinewidth":0},"type":"contourcarpet"}],"table":[{"type":"table","header":{"line":{"color":"white"},"fill":{"color":"#C8D4E3"}},"cells":{"line":{"color":"white"},"fill":{"color":"#EBF0F8"}}}],"scatter3d":[{"line":{"colorbar":{"ticks":"","outlinewidth":0}},"type":"scatter3d","marker":{"colorbar":{"ticks":"","outlinewidth":0}}}],"scattergl":[{"type":"scattergl","marker":{"colorbar":{"ticks":"","outlinewidth":0}}}],"histogram2d":[{"colorbar":{"ticks":"","outlinewidth":0},"type":"histogram2d","colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"scatterternary":[{"type":"scatterternary","marker":{"colorbar":{"ticks":"","outlinewidth":0}}}],"scatterpolargl":[{"type":"scatterpolargl","marker":{"colorbar":{"ticks":"","outlinewidth":0}}}]}},"height":500,"margin":{"l":50,"b":50,"r":50,"t":60},"width":500}, {"editable":false,"responsive":true,"staticPlot":false,"scrollZoom":true}, diff --git a/dev/histogram-uniform.html b/dev/histogram-uniform.html index 9a771b633..60b34f03b 100644 --- a/dev/histogram-uniform.html +++ b/dev/histogram-uniform.html @@ -1,7 +1,7 @@ -
+

BasicBSpline.jl

Basic (mathematical) operations for B-spline functions and related things with Julia.

Stable Dev Build Status Coverage Aqua QA DOI BasicBSpline Downloads.

Summary

This package provides basic mathematical operations for B-spline.

  • B-spline basis function
  • Some operations for knot vector
  • Some operations for B-spline space (piecewise polynomial space)
  • B-spline manifold (includes curve, surface and solid)
  • Refinement algorithm for B-spline manifold
  • Fitting control points for a given function

Comparison to other Julia packages for B-spline

There are several Julia packages for B-spline, and this package distinguishes itself with the following key benefits:

  • Supports all degrees of polynomials.
  • Includes a refinement algorithm for B-spline manifolds.
  • Offers a fitting algorithm using least squares. (BasicBSplineFitting.jl)
  • Delivers high-speed performance.
  • Is mathematically oriented.

If you have any thoughts, please comment in:

Installation

Install this package

]add BasicBSpline

To export graphics, use BasicBSplineExporter.jl.

]add https://github.com/hyrodium/BasicBSplineExporter.jl

Example

B-spline function

using BasicBSpline
+Home · BasicBSpline.jl

BasicBSpline.jl

Basic (mathematical) operations for B-spline functions and related things with Julia.

Stable Dev Build Status Coverage Aqua QA DOI BasicBSpline Downloads.

Summary

This package provides basic mathematical operations for B-spline.

  • B-spline basis function
  • Some operations for knot vector
  • Some operations for B-spline space (piecewise polynomial space)
  • B-spline manifold (includes curve, surface and solid)
  • Refinement algorithm for B-spline manifold
  • Fitting control points for a given function

Comparison to other Julia packages for B-spline

There are several Julia packages for B-spline, and this package distinguishes itself with the following key benefits:

  • Supports all degrees of polynomials.
  • Includes a refinement algorithm for B-spline manifolds.
  • Offers a fitting algorithm using least squares. (BasicBSplineFitting.jl)
  • Delivers high-speed performance.
  • Is mathematically oriented.

If you have any thoughts, please comment in:

Installation

Install this package

]add BasicBSpline

To export graphics, use BasicBSplineExporter.jl.

]add https://github.com/hyrodium/BasicBSplineExporter.jl

Example

B-spline function

using BasicBSpline
 using Plots
 
 k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])
@@ -63,4 +63,4 @@
 a = fittingcontrolpoints(f, P)
 M = BSplineManifold(a, P)
 save_svg("sine-curve.svg", M, unitlength=50, xlims=(-2,2), ylims=(-8,8))
-save_svg("sine-curve_no-points.svg", M, unitlength=50, xlims=(-2,2), ylims=(-8,8), points=false)

This is useful when you edit graphs (or curves) with your favorite vector graphics editor.

See Plotting smooth graphs with Julia for more tutorials.

+save_svg("sine-curve_no-points.svg", M, unitlength=50, xlims=(-2,2), ylims=(-8,8), points=false)

This is useful when you edit graphs (or curves) with your favorite vector graphics editor.

See Plotting smooth graphs with Julia for more tutorials.

diff --git a/dev/internal/index.html b/dev/internal/index.html index 5824b9148..e0d71016a 100644 --- a/dev/internal/index.html +++ b/dev/internal/index.html @@ -1,5 +1,5 @@ -Private API · BasicBSpline.jl

Private API

Note that the following methods are considered private methods, and changes in their behavior are not considered breaking changes.

BasicBSpline.r_nomialFunction

Calculate $r$-nomial coefficient

r_nomial(n, k, r)

\[(1+x+\cdots+x^r)^n = \sum_{k} a_{n,k,r} x^k\]

source
BasicBSpline._lower_RFunction

Internal methods for obtaining a B-spline space with one degree lower.

\[\begin{aligned} +Private API · BasicBSpline.jl

Private API

Note that the following methods are considered private methods, and changes in their behavior are not considered breaking changes.

BasicBSpline.r_nomialFunction

Calculate $r$-nomial coefficient

r_nomial(n, k, r)

\[(1+x+\cdots+x^r)^n = \sum_{k} a_{n,k,r} x^k\]

source
BasicBSpline._lower_RFunction

Internal methods for obtaining a B-spline space with one degree lower.

\[\begin{aligned} \mathcal{P}[p,k] &\mapsto \mathcal{P}[p-1,k] \\ D^r\mathcal{P}[p,k] &\mapsto D^{r-1}\mathcal{P}[p-1,k] -\end{aligned}\]

source
Missing docstring.

Missing docstring for BasicBSpline._changebasis_R. Check Documenter's build log for details.

Missing docstring.

Missing docstring for BasicBSpline._changebasis_I. Check Documenter's build log for details.

+\end{aligned}\]

source
diff --git a/dev/interpolation_cubic.html b/dev/interpolation_cubic.html index 9d7888aaa..c6eac1835 100644 --- a/dev/interpolation_cubic.html +++ b/dev/interpolation_cubic.html @@ -1,7 +1,7 @@ -
+
+
+
+

Interpolations

Currently, BasicBSpline.jl doesn't have APIs for interpolations, but it is not hard to implement some basic interpolation algorithms with this package.

Interpolation with cubic B-spline

function interpolate(xs::AbstractVector, fs::AbstractVector{T}) where T
+Interpolations · BasicBSpline.jl

Interpolations

Currently, BasicBSpline.jl doesn't have APIs for interpolations, but it is not hard to implement some basic interpolation algorithms with this package.

Interpolation with cubic B-spline

function interpolate(xs::AbstractVector, fs::AbstractVector{T}) where T
     # Cubic open B-spline space
     p = 3
     k = KnotVector(xs) + KnotVector([xs[1],xs[end]]) * p
@@ -92,4 +92,4 @@
 plot!(t->f2(t), label="polynomial degree 2")
 plot!(t->f3(t), label="polynomial degree 3")
 plot!(t->f4(t), label="polynomial degree 4")
-plot!(t->f5(t), label="polynomial degree 5")
+plot!(t->f5(t), label="polynomial degree 5")
diff --git a/dev/math-bsplinebasis/index.html b/dev/math-bsplinebasis/index.html index 470e7de33..a3f44f293 100644 --- a/dev/math-bsplinebasis/index.html +++ b/dev/math-bsplinebasis/index.html @@ -1,5 +1,5 @@ -B-spline basis function · BasicBSpline.jl

B-spline basis function

Basic properties of B-spline basis function

Def. B-spline space

B-spline basis function is defined by Cox–de Boor recursion formula.

\[\begin{aligned} +B-spline basis function · BasicBSpline.jl

B-spline basis function

Basic properties of B-spline basis function

Def. B-spline space

B-spline basis function is defined by Cox–de Boor recursion formula.

\[\begin{aligned} {B}_{(i,p,k)}(t) &= \frac{t-k_{i}}{k_{i+p}-k_{i}}{B}_{(i,p-1,k)}(t) @@ -17,17 +17,17 @@ &1\quad (k_{i} < t \le k_{i+1}) \\ &0\quad (\text{otherwise}) \end{cases} -\end{aligned}\]

julia> p = 22
julia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])
julia> P = BSplineSpace{p}(k)BSplineSpace{2, Float64, KnotVector{Float64}}(KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]))
julia> plot([t->bsplinebasis₋₀(P,i,t) for i in 1:dim(P)], 0, 10, ylims=(0,1), label=false)Plot{Plots.PlotlyBackend() n=5}

In these cases, each B-spline basis function $B_{(i,2,k)}$ is coninuous, so bsplinebasis₊₀ and bsplinebasis₋₀ are equal.

Support of B-spline basis function

Thm. Support of B-spline basis function

If a B-spline space$\mathcal{P}[p,k]$ is non-degenerate, the support of its basis function is calculated as follows:

\[\operatorname{supp}(B_{(i,p,k)})=[k_{i},k_{i+p+1}]\]

[TODO: fig]

BasicBSpline.bsplinesupportFunction

Return the support of $i$-th B-spline basis function.

\[\operatorname{supp}(B_{(i,p,k)})=[k_{i},k_{i+p+1}]\]

Examples

julia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])
+\end{aligned}\]

julia> p = 22
julia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])
julia> P = BSplineSpace{p}(k)BSplineSpace{2, Float64, KnotVector{Float64}}(KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]))
julia> plot([t->bsplinebasis₋₀(P,i,t) for i in 1:dim(P)], 0, 10, ylims=(0,1), label=false)Plot{Plots.PlotlyBackend() n=5}

In these cases, each B-spline basis function $B_{(i,2,k)}$ is coninuous, so bsplinebasis₊₀ and bsplinebasis₋₀ are equal.

Support of B-spline basis function

Thm. Support of B-spline basis function

If a B-spline space$\mathcal{P}[p,k]$ is non-degenerate, the support of its basis function is calculated as follows:

\[\operatorname{supp}(B_{(i,p,k)})=[k_{i},k_{i+p+1}]\]

[TODO: fig]

BasicBSpline.bsplinesupportFunction

Return the support of $i$-th B-spline basis function.

\[\operatorname{supp}(B_{(i,p,k)})=[k_{i},k_{i+p+1}]\]

Examples

julia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])
 KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])
 
 julia> P = BSplineSpace{2}(k)
 BSplineSpace{2, Float64, KnotVector{Float64}}(KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]))
 
 julia> bsplinesupport(P,1)
-0.0..5.5
+0.0 .. 5.5
 
 julia> bsplinesupport(P,2)
-1.5..8.0
source

Partition of unity

Thm. Partition of unity

Let $B_{(i,p,k)}$ be a B-spline basis function, then the following equation is satisfied.

\[\begin{aligned} +1.5 .. 8.0

source

Partition of unity

Thm. Partition of unity

Let $B_{(i,p,k)}$ be a B-spline basis function, then the following equation is satisfied.

\[\begin{aligned} \sum_{i}B_{(i,p,k)}(t) &= 1 & (k_{p+1} \le t < k_{l-p}) \\ 0 \le B_{(i,p,k)}(t) &\le 1 \end{aligned}\]

julia> p = 22
julia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])
julia> P = BSplineSpace{p}(k)BSplineSpace{2, Float64, KnotVector{Float64}}(KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]))
julia> plot(t->sum(bsplinebasis₊₀(P,i,t) for i in 1:dim(P)), 0, 10, ylims=(0,1.1), label=false)Plot{Plots.PlotlyBackend() n=1}

To satisfy the partition of unity on whole interval $[1,8]$, sometimes more knots will be inserted to the endpoints of the interval.

julia> p = 22
julia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]) + p * KnotVector([0,10])KnotVector([0.0, 0.0, 0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0, 10.0, 10.0])
julia> P = BSplineSpace{p}(k)BSplineSpace{2, Float64, KnotVector{Float64}}(KnotVector([0.0, 0.0, 0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0, 10.0, 10.0]))
julia> plot(t->sum(bsplinebasis₊₀(P,i,t) for i in 1:dim(P)), 0, 10, ylims=(0,1.1), label=false)Plot{Plots.PlotlyBackend() n=1}

But, the sum $\sum_{i} B_{(i,p,k)}(t)$ is not equal to $1$ at $t=8$. Therefore, to satisfy partition of unity on closed interval $[k_{p+1}, k_{l-p}]$, the definition of first terms of B-spline basis functions are sometimes replaced:

\[\begin{aligned} @@ -38,7 +38,7 @@ &1\quad (k_{i} < t = k_{i+1}=k_{l})\\ &0\quad (\text{otherwise}) \end{cases} -\end{aligned}\]

julia> p = 22
julia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]) + p * KnotVector([0,10])KnotVector([0.0, 0.0, 0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0, 10.0, 10.0])
julia> P = BSplineSpace{p}(k)BSplineSpace{2, Float64, KnotVector{Float64}}(KnotVector([0.0, 0.0, 0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0, 10.0, 10.0]))
julia> plot(t->sum(bsplinebasis(P,i,t) for i in 1:dim(P)), 0, 10, ylims=(0,1.1), label=false)Plot{Plots.PlotlyBackend() n=1}
BasicBSpline.bsplinebasis₊₀Function

$i$-th B-spline basis function. Right-sided limit version.

\[\begin{aligned} +\end{aligned}\]

julia> p = 22
julia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]) + p * KnotVector([0,10])KnotVector([0.0, 0.0, 0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0, 10.0, 10.0])
julia> P = BSplineSpace{p}(k)BSplineSpace{2, Float64, KnotVector{Float64}}(KnotVector([0.0, 0.0, 0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0, 10.0, 10.0]))
julia> plot(t->sum(bsplinebasis(P,i,t) for i in 1:dim(P)), 0, 10, ylims=(0,1.1), label=false)Plot{Plots.PlotlyBackend() n=1}
BasicBSpline.bsplinebasis₊₀Function

$i$-th B-spline basis function. Right-sided limit version.

\[\begin{aligned} {B}_{(i,p,k)}(t) &= \frac{t-k_{i}}{k_{i+p}-k_{i}}{B}_{(i,p-1,k)}(t) @@ -58,7 +58,7 @@ 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 - 0.0 0.0 0.0 0.0 1.0 0.0

source
BasicBSpline.bsplinebasis₋₀Function

$i$-th B-spline basis function. Left-sided limit version.

\[\begin{aligned} {B}_{(i,p,k)}(t) &= \frac{t-k_{i}}{k_{i+p}-k_{i}}{B}_{(i,p-1,k)}(t) @@ -78,7 +78,7 @@ 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 - 0.0 0.0 0.0 0.0 0.0 1.0

source
BasicBSpline.bsplinebasisFunction

$i$-th B-spline basis function. Modified version.

\[\begin{aligned} {B}_{(i,p,k)}(t) &= \frac{t-k_{i}}{k_{i+p}-k_{i}}{B}_{(i,p-1,k)}(t) @@ -99,33 +99,56 @@ 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 - 0.0 0.0 0.0 0.0 1.0 1.0

source

B-spline basis functions at specific point

Sometimes, you may need the non-zero values of B-spline basis functions at specific point. The bsplinebasisall function is much more efficient than evaluating B-spline functions one by one with bsplinebasis function.

julia> using BenchmarkTools, BasicBSpline
julia> P = BSplineSpace{2}(KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]))BSplineSpace{2, Float64, KnotVector{Float64}}(KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]))
julia> t = 6.36.3
julia> (bsplinebasis(P, 2, t), bsplinebasis(P, 3, t), bsplinebasis(P, 4, t))(0.2101818181818182, 0.7166753246753247, 0.0731428571428571)
julia> bsplinebasisall(P, 2, t)3-element StaticArraysCore.SVector{3, Float64} with indices SOneTo(3): + 0.0 0.0 0.0 0.0 1.0 1.0
source
BasicBSpline.bsplinebasis₋₀IFunction

$i$-th B-spline basis function. Modified version (2).

\[\begin{aligned} +{B}_{(i,p,k)}(t) +&= +\frac{t-k_{i}}{k_{i+p}-k_{i}}{B}_{(i,p-1,k)}(t) ++\frac{k_{i+p+1}-t}{k_{i+p+1}-k_{i+1}}{B}_{(i+1,p-1,k)}(t) \\ +{B}_{(i,0,k)}(t) +&= +\begin{cases} + &1\quad (k_{i} \le t<k_{i+1})\\ + &1\quad (k_{i} < t = k_{i+1}=k_{l})\\ + &0\quad (\text{otherwise}) +\end{cases} +\end{aligned}\]

Examples

julia> P = BSplineSpace{0}(KnotVector(1:6))
+BSplineSpace{0, Int64, KnotVector{Int64}}(KnotVector([1, 2, 3, 4, 5, 6]))
+
+julia> BasicBSpline.bsplinebasis₋₀I.(P,1:5,(1:6)')
+5×6 Matrix{Float64}:
+ 1.0  1.0  0.0  0.0  0.0  0.0
+ 0.0  0.0  1.0  0.0  0.0  0.0
+ 0.0  0.0  0.0  1.0  0.0  0.0
+ 0.0  0.0  0.0  0.0  1.0  0.0
+ 0.0  0.0  0.0  0.0  0.0  1.0
source

B-spline basis functions at specific point

Sometimes, you may need the non-zero values of B-spline basis functions at specific point. The bsplinebasisall function is much more efficient than evaluating B-spline functions one by one with bsplinebasis function.

julia> using BenchmarkTools, BasicBSpline
julia> P = BSplineSpace{2}(KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]))BSplineSpace{2, Float64, KnotVector{Float64}}(KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]))
julia> t = 6.36.3
julia> (bsplinebasis(P, 2, t), bsplinebasis(P, 3, t), bsplinebasis(P, 4, t))(0.2101818181818182, 0.7166753246753247, 0.0731428571428571)
julia> bsplinebasisall(P, 2, t)3-element StaticArraysCore.SVector{3, Float64} with indices SOneTo(3): 0.21018181818181822 0.7166753246753247 - 0.0731428571428571
julia> @benchmark (bsplinebasis($P, 2, $t), bsplinebasis($P, 3, $t), bsplinebasis($P, 4, $t))BenchmarkTools.Trial: 10000 samples with 996 evaluations. - Range (minmax): 30.020 ns78.916 ns GC (min … max): 0.00% … 0.00% - Time (median): 30.522 ns GC (median): 0.00% - Time (mean ± σ): 30.747 ns ± 0.984 ns GC (mean ± σ): 0.00% ± 0.00% + 0.0731428571428571
julia> @benchmark (bsplinebasis($P, 2, $t), bsplinebasis($P, 3, $t), bsplinebasis($P, 4, $t))BenchmarkTools.Trial: 10000 samples with 994 evaluations. + Range (minmax): 32.093 ns62.778 ns GC (min … max): 0.00% … 0.00% + Time (median): 32.294 ns GC (median): 0.00% + Time (mean ± σ): 32.392 ns ± 0.774 ns GC (mean ± σ): 0.00% ± 0.00% - █ ▆ ▄ ▂ - ▂▇▁█▁█▁█▁██▁█▇▁▆▁▆▁▅▁▅▁▄▁▄▁▄▁▃▁▃▁▃▁▃▁▂▁▂▁▂▁▂▁▂▁▂▁▂▁▂▁▂▁▂▂ ▃ - 30 ns Histogram: frequency by time 33 ns < + ▇ █ + ▂▁▁█▁▁█▁█▁▁▄▁▁▂▁▁▂▁▁▅▁▁▁▂▁▁▁▁▁▁▁▁▁▁▁▁▂▁▁▁▁▁▁▁▁▁▂▁▁▂▁▁▂▁▁▂ ▂ + 32.1 ns Histogram: frequency by time 33.9 ns < Memory estimate: 0 bytes, allocs estimate: 0.
julia> @benchmark bsplinebasisall($P, 2, $t)BenchmarkTools.Trial: 10000 samples with 1000 evaluations. - Range (minmax): 9.599 ns24.000 ns GC (min … max): 0.00% … 0.00% - Time (median): 9.700 ns GC (median): 0.00% - Time (mean ± σ): 9.728 ns ± 0.417 ns GC (mean ± σ): 0.00% ± 0.00% + Range (minmax): 8.000 ns26.000 ns GC (min … max): 0.00% … 0.00% + Time (median): 8.100 ns GC (median): 0.00% + Time (mean ± σ): 8.069 ns ± 0.339 ns GC (mean ± σ): 0.00% ± 0.00% - - ▄▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▅▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▂ ▂ - 9.6 ns Histogram: frequency by time 9.9 ns < + ▆ + █▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ ▂ + 8 ns Histogram: frequency by time 8.1 ns < + + Memory estimate: 0 bytes, allocs estimate: 0.
BasicBSpline.intervalindexFunction

Return an index of a interval in the domain of B-spline space

Examples

julia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]);
 
- Memory estimate: 0 bytes, allocs estimate: 0.
BasicBSpline.intervalindexFunction

Return an index of a interval in the domain of B-spline space

Examples

julia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]);
 
 julia> P = BSplineSpace{2}(k);
 
+
 julia> domain(P)
-2.5..9.0
+2.5 .. 9.0
 
 julia> intervalindex(P,2.6)
 1
@@ -137,7 +160,7 @@
 3
 
 julia> intervalindex(P,9.5)
-3
source
BasicBSpline.bsplinebasisallFunction

B-spline basis functions at point t on i-th interval.

Examples

julia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])
+3
source
BasicBSpline.bsplinebasisallFunction

B-spline basis functions at point t on i-th interval.

Examples

julia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])
 KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])
 
 julia> p = 2
@@ -162,7 +185,7 @@
 3-element Vector{Float64}:
  0.38472727272727264
  0.6107012987012989
- 0.00457142857142858
source

The next figures illustlates the relation between domain(P), intervalindex(P,t) and bsplinebasisall(P,i,t).

k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])
+ 0.00457142857142858
source

The next figures illustlates the relation between domain(P), intervalindex(P,t) and bsplinebasisall(P,i,t).

k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])
 
 for p in 1:3
     P = BSplineSpace{p}(k)
@@ -185,4 +208,4 @@
 plot4 = histogram([rand()+rand()+rand()+rand() for _ in 1:N], normalize=true, label=false)
 plot!(t->BasicBSpline.uniform_bsplinebasis_kernel(Val(3),t), label=false)
 # plot all
-plot(plot1,plot2,plot3,plot4)
+plot(plot1,plot2,plot3,plot4)
diff --git a/dev/math-bsplinemanifold/index.html b/dev/math-bsplinemanifold/index.html index 0c795e118..ec9257fd6 100644 --- a/dev/math-bsplinemanifold/index.html +++ b/dev/math-bsplinemanifold/index.html @@ -1,8 +1,8 @@ -B-spline manifold · BasicBSpline.jl

B-spline manifold

Multi-dimensional B-spline

Thm. Basis of tensor product of B-spline spaces

The tensor product of B-spline spaces $\mathcal{P}[p^1,k^1]\otimes\mathcal{P}[p^2,k^2]$ is a linear space with the following basis.

\[\mathcal{P}[p^1,k^1]\otimes\mathcal{P}[p^2,k^2] +B-spline manifold · BasicBSpline.jl

B-spline manifold

Multi-dimensional B-spline

Thm. Basis of tensor product of B-spline spaces

The tensor product of B-spline spaces $\mathcal{P}[p^1,k^1]\otimes\mathcal{P}[p^2,k^2]$ is a linear space with the following basis.

\[\mathcal{P}[p^1,k^1]\otimes\mathcal{P}[p^2,k^2] = \operatorname*{span}_{i,j} (B_{(i,p^1,k^1)} \otimes B_{(j,p^2,k^2)})\]

where the basis are defined as

\[(B_{(i,p^1,k^1)} \otimes B_{(j,p^2,k^2)})(t^1, t^2) = B_{(i,p^1,k^1)}(t^1) \cdot B_{(j,p^2,k^2)}(t^2)\]

Higher dimensional tensor products $\mathcal{P}[p^1,k^1]\otimes\cdots\otimes\mathcal{P}[p^d,k^d]$ are defined similarly.

B-spline manifold

B-spline manifold is a parametric representation of a shape.

Def. B-spline manifold

For given $d$-dimensional B-spline basis functions $B_{(i^1,p^1,k^1)} \otimes \cdots \otimes B_{(i^d,p^d,k^d)}$ and given points $\bm{a}_{i^1 \dots i^d} \in V$, B-spline manifold is defined by the following equality:

\[\bm{p}(t^1,\dots,t^d;\bm{a}_{i^1 \dots i^d}) -=\sum_{i^1,\dots,i^d}(B_{(i^1,p^1,k^1)} \otimes \cdots \otimes B_{(i^d,p^d,k^d)})(t^1,\dots,t^d) \bm{a}_{i^1 \dots i^d}\]

Where $\bm{a}_{i^1 \dots i^d}$ are called control points.

We will also write $\bm{p}(t^1,\dots,t^d; \bm{a})$, $\bm{p}(t^1,\dots,t^d)$, $\bm{p}(t; \bm{a})$ or $\bm{p}(t)$ for simplicity.

Note that the BSplineManifold objects are callable, and the arguments will be checked if it fits in the domain of BSplineSpace.

BasicBSpline.BSplineManifoldType

Construct B-spline manifold from given control points and B-spline spaces.

Examples

julia> using StaticArrays
+=\sum_{i^1,\dots,i^d}(B_{(i^1,p^1,k^1)} \otimes \cdots \otimes B_{(i^d,p^d,k^d)})(t^1,\dots,t^d) \bm{a}_{i^1 \dots i^d}\]

Where $\bm{a}_{i^1 \dots i^d}$ are called control points.

We will also write $\bm{p}(t^1,\dots,t^d; \bm{a})$, $\bm{p}(t^1,\dots,t^d)$, $\bm{p}(t; \bm{a})$ or $\bm{p}(t)$ for simplicity.

Note that the BSplineManifold objects are callable, and the arguments will be checked if it fits in the domain of BSplineSpace.

BasicBSpline.BSplineManifoldType

Construct B-spline manifold from given control points and B-spline spaces.

Examples

julia> using StaticArrays
 
 julia> P = BSplineSpace{2}(KnotVector([0,0,0,1,1,1]))
 BSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([0, 0, 0, 1, 1, 1]))
@@ -15,6 +15,7 @@
 
 julia> M = BSplineManifold(a, P);
 
+
 julia> M(0.4)
 2-element SVector{2, Float64} with indices SOneTo(2):
  0.84
@@ -22,14 +23,16 @@
 
 julia> M(1.2)
 ERROR: DomainError with 1.2:
-The input 1.2 is out of range.
source

If you need extension of BSplineManifold or don't need the arguments check, you can call unbounded_mapping.

BasicBSpline.unbounded_mappingFunction
unbounded_mapping(M::BSplineManifold{Dim}, t::Vararg{Real,Dim})

Examples

julia> P = BSplineSpace{1}(KnotVector([0,0,1,1]))
+The input 1.2 is out of range.
+[...]
source

If you need extension of BSplineManifold or don't need the arguments check, you can call unbounded_mapping.

BasicBSpline.unbounded_mappingFunction
unbounded_mapping(M::BSplineManifold{Dim}, t::Vararg{Real,Dim})

Examples

julia> P = BSplineSpace{1}(KnotVector([0,0,1,1]))
 BSplineSpace{1, Int64, KnotVector{Int64}}(KnotVector([0, 0, 1, 1]))
 
 julia> domain(P)
-0..1
+0 .. 1
 
 julia> M = BSplineManifold([0,1], P);
 
+
 julia> unbounded_mapping(M, 0.1)
 0.1
 
@@ -41,7 +44,8 @@
 
 julia> M(1.2)
 ERROR: DomainError with 1.2:
-The input 1.2 is out of range.
source

unbounded_mapping(M,t...) is a little bit faster than M(t...) because it does not check the domain.

B-spline curve

## 1-dim B-spline manifold
+The input 1.2 is out of range.
+[...]
source

unbounded_mapping(M,t...) is a little bit faster than M(t...) because it does not check the domain.

B-spline curve

## 1-dim B-spline manifold
 p = 2 # degree of polynomial
 k = KnotVector(1:12) # knot vector
 P = BSplineSpace{p}(k) # B-spline space
@@ -58,4 +62,4 @@
 =\bm{p}(t; T(\bm{a}))\]

Fixing arguments (currying)

Just like fixing first index such as A[3,:]::Array{1} for matrix A::Array{2}, fixing first argument M(4.3,:) will create BSplineManifold{1} for B-spline surface M::BSplineManifold{2}.

julia> p = 2;
julia> k = KnotVector(1:8);
julia> P = BSplineSpace{p}(k);
julia> a = [SVector(5i+5j+rand(), 5i-5j+rand(), rand()) for i in 1:dim(P), j in 1:dim(P)];
julia> M = BSplineManifold(a,(P,P));
julia> M isa BSplineManifold{2}true
julia> M(:,:) isa BSplineManifold{2}true
julia> M(4.3,:) isa BSplineManifold{1} # Fix first argumenttrue
plot(M)
 plot!(M(4.3,:), linewidth = 5, color=:cyan)
 plot!(M(4.4,:), linewidth = 5, color=:red)
-plot!(M(:,5.2), linewidth = 5, color=:green)
+plot!(M(:,5.2), linewidth = 5, color=:green) diff --git a/dev/math-bsplinespace/index.html b/dev/math-bsplinespace/index.html index 88eeaa951..e61626053 100644 --- a/dev/math-bsplinespace/index.html +++ b/dev/math-bsplinespace/index.html @@ -1,5 +1,5 @@ -B-spline space · BasicBSpline.jl

B-spline space

Defnition

Before defining B-spline space, we'll define polynomial space with degree $p$.

Def. Polynomial space

Polynomial space with degree $p$.

\[\mathcal{P}[p] +B-spline space · BasicBSpline.jl

B-spline space

Defnition

Before defining B-spline space, we'll define polynomial space with degree $p$.

Def. Polynomial space

Polynomial space with degree $p$.

\[\mathcal{P}[p] =\left\{f:\mathbb{R}\to\mathbb{R}\ ;\ t\mapsto a_0+a_1t^1+\cdots+a_pt^p \ \left| \ % a_i\in \mathbb{R} \right. @@ -14,24 +14,24 @@ \exists \tilde{f}\in\mathcal{P}[p], f|_{[k_{i}, k_{i+1})} = \tilde{f}|_{[k_{i}, k_{i+1})} \\ \forall t \in \mathbb{R}, \exists \delta > 0, f|_{(t-\delta,t+\delta)}\in C^{p-\mathfrak{n}_k(t)} \end{gathered} \right. -\right\}\]

Note that each element of the space $\mathcal{P}[p,k]$ is a piecewise polynomial.

[TODO: fig]

BasicBSpline.BSplineSpaceType

Construct B-spline space from given polynominal degree and knot vector.

\[\mathcal{P}[p,k]\]

Examples

julia> p = 2
+\right\}\]

Note that each element of the space $\mathcal{P}[p,k]$ is a piecewise polynomial.

[TODO: fig]

BasicBSpline.BSplineSpaceType

Construct B-spline space from given polynominal degree and knot vector.

\[\mathcal{P}[p,k]\]

Examples

julia> p = 2
 2
 
 julia> k = KnotVector([1,3,5,6,8,9])
 KnotVector([1, 3, 5, 6, 8, 9])
 
 julia> BSplineSpace{p}(k)
-BSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([1, 3, 5, 6, 8, 9]))
source

Degeneration

Def. Degeneration

A B-spline space is said to be non-degenerate if its degree and knot vector satisfies following property:

\[\begin{aligned} +BSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([1, 3, 5, 6, 8, 9]))

source

Degeneration

Def. Degeneration

A B-spline space is said to be non-degenerate if its degree and knot vector satisfies following property:

\[\begin{aligned} k_{i}&<k_{i+p+1} & (1 \le i \le l-p-1) -\end{aligned}\]

BasicBSpline.isnondegenerateFunction

Check if given B-spline space is non-degenerate.

Examples

julia> isnondegenerate(BSplineSpace{2}(KnotVector([1,3,5,6,8,9])))
+\end{aligned}\]

BasicBSpline.isnondegenerateFunction

Check if given B-spline space is non-degenerate.

Examples

julia> isnondegenerate(BSplineSpace{2}(KnotVector([1,3,5,6,8,9])))
 true
 
 julia> isnondegenerate(BSplineSpace{1}(KnotVector([1,3,3,3,8,9])))
-false
source
BasicBSpline.isdegenerateMethod

Check if given B-spline space is degenerate.

Examples

julia> isdegenerate(BSplineSpace{2}(KnotVector([1,3,5,6,8,9])))
+false
source
BasicBSpline.isdegenerateMethod

Check if given B-spline space is degenerate.

Examples

julia> isdegenerate(BSplineSpace{2}(KnotVector([1,3,5,6,8,9])))
 false
 
 julia> isdegenerate(BSplineSpace{1}(KnotVector([1,3,3,3,8,9])))
-true
source

Dimensions

Thm. Dimension of B-spline space

The B-spline space is a linear space, and if a B-spline space is non-degenerate, its dimension is calculated by:

\[\dim(\mathcal{P}[p,k])=\# k - p -1\]

Dimensions

Thm. Dimension of B-spline space

The B-spline space is a linear space, and if a B-spline space is non-degenerate, its dimension is calculated by:

\[\dim(\mathcal{P}[p,k])=\# k - p -1\]

BasicBSpline.dimFunction

Return dimention of a B-spline space.

\[\dim(\mathcal{P}[p,k]) =\# k - p -1\]

Examples

julia> dim(BSplineSpace{1}(KnotVector([1,2,3,4,5,6,7])))
 5
 
@@ -39,11 +39,18 @@
 5
 
 julia> dim(BSplineSpace{1}(KnotVector([1,2,3,5,5,5,7])))
-5
source
BasicBSpline.exactdim_RMethod

Exact dimension of a B-spline space.

Examples

julia> exactdim_R(BSplineSpace{1}(KnotVector([1,2,3,4,5,6,7])))
+5
source
BasicBSpline.exactdim_RMethod

Exact dimension of a B-spline space.

Examples

julia> exactdim_R(BSplineSpace{1}(KnotVector([1,2,3,4,5,6,7])))
 5
 
 julia> exactdim_R(BSplineSpace{1}(KnotVector([1,2,4,4,4,6,7])))
 4
 
 julia> exactdim_R(BSplineSpace{1}(KnotVector([1,2,3,5,5,5,7])))
-4
source
+4
source
BasicBSpline.exactdim_IMethod

Exact dimension of a B-spline space.

Examples

julia> exactdim_I(BSplineSpace{1}(KnotVector([1,2,3,4,5,6,7])))
+5
+
+julia> exactdim_I(BSplineSpace{1}(KnotVector([1,2,4,4,4,6,7])))
+4
+
+julia> exactdim_I(BSplineSpace{1}(KnotVector([1,2,3,5,5,5,7])))
+3
source
diff --git a/dev/math-derivative/index.html b/dev/math-derivative/index.html index 6509c645e..9b40dae1a 100644 --- a/dev/math-derivative/index.html +++ b/dev/math-derivative/index.html @@ -1,5 +1,5 @@ -Derivative · BasicBSpline.jl

Derivative of B-spline

Thm. Derivative of B-spline basis function

The derivative of B-spline basis function can be expressed as follows:

\[\begin{aligned} +Derivative · BasicBSpline.jl

Derivative of B-spline

Thm. Derivative of B-spline basis function

The derivative of B-spline basis function can be expressed as follows:

\[\begin{aligned} \dot{B}_{(i,p,k)}(t) &=\frac{d}{dt}B_{(i,p,k)}(t) \\ &=p\left(\frac{1}{k_{i+p}-k_{i}}B_{(i,p-1,k)}(t)-\frac{1}{k_{i+p+1}-k_{i+1}}B_{(i+1,p-1,k)}(t)\right) @@ -10,7 +10,7 @@ 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), -)

BasicBSpline.BSplineDerivativeSpaceType
BSplineDerivativeSpace{r}(P::BSplineSpace)

Construct derivative of B-spline space from given differential order and B-spline space.

\[D^{r}(\mathcal{P}[p,k]) +)

BasicBSpline.BSplineDerivativeSpaceType
BSplineDerivativeSpace{r}(P::BSplineSpace)

Construct derivative of B-spline space from given differential order and B-spline space.

\[D^{r}(\mathcal{P}[p,k]) =\left\{t \mapsto \left. \frac{d^r f}{dt^r}(t) \ \right| \ f \in \mathcal{P}[p,k] \right\}\]

Examples

julia> P = BSplineSpace{2}(KnotVector([1,2,3,4,5,6]))
 BSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([1, 2, 3, 4, 5, 6]))
 
@@ -18,7 +18,7 @@
 BSplineDerivativeSpace{1, BSplineSpace{2, Int64, KnotVector{Int64}}, Int64}(BSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([1, 2, 3, 4, 5, 6])))
 
 julia> degree(P), degree(dP)
-(2, 1)
source
BasicBSpline.derivativeFunction
derivative(::BSplineDerivativeSpace{r}) -> BSplineDerivativeSpace{r+1}
 derivative(::BSplineSpace) -> BSplineDerivativeSpace{1}

Derivative of B-spline related space.

Examples

julia> BSplineSpace{2}(KnotVector(0:5))
 BSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([0, 1, 2, 3, 4, 5]))
 
@@ -26,7 +26,7 @@
 BSplineDerivativeSpace{1, BSplineSpace{2, Int64, KnotVector{Int64}}, Int64}(BSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([0, 1, 2, 3, 4, 5])))
 
 julia> BasicBSpline.derivative(ans)
-BSplineDerivativeSpace{2, BSplineSpace{2, Int64, KnotVector{Int64}}, Int64}(BSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([0, 1, 2, 3, 4, 5])))
source
BasicBSpline.bsplinebasis′₊₀Function
bsplinebasis′₊₀(::AbstractFunctionSpace, ::Integer, ::Real) -> Real

1st derivative of B-spline basis function. Right-sided limit version.

\[\dot{B}_{(i,p,k)}(t) -=p\left(\frac{1}{k_{i+p}-k_{i}}B_{(i,p-1,k)}(t)-\frac{1}{k_{i+p+1}-k_{i+1}}B_{(i+1,p-1,k)}(t)\right)\]

bsplinebasis′₊₀(P, i, t) is equivalent to bsplinebasis₊₀(derivative(P), i, t).

source
BasicBSpline.bsplinebasis′₋₀Function
bsplinebasis′₋₀(::AbstractFunctionSpace, ::Integer, ::Real) -> Real

1st derivative of B-spline basis function. Left-sided limit version.

\[\dot{B}_{(i,p,k)}(t) -=p\left(\frac{1}{k_{i+p}-k_{i}}B_{(i,p-1,k)}(t)-\frac{1}{k_{i+p+1}-k_{i+1}}B_{(i+1,p-1,k)}(t)\right)\]

bsplinebasis′₋₀(P, i, t) is equivalent to bsplinebasis₋₀(derivative(P), i, t).

source
BasicBSpline.bsplinebasis′Function
bsplinebasis′(::AbstractFunctionSpace, ::Integer, ::Real) -> Real

1st derivative of B-spline basis function. Modified version.

\[\dot{B}_{(i,p,k)}(t) -=p\left(\frac{1}{k_{i+p}-k_{i}}B_{(i,p-1,k)}(t)-\frac{1}{k_{i+p+1}-k_{i+1}}B_{(i+1,p-1,k)}(t)\right)\]

bsplinebasis′(P, i, t) is equivalent to bsplinebasis(derivative(P), i, t).

source
+BSplineDerivativeSpace{2, BSplineSpace{2, Int64, KnotVector{Int64}}, Int64}(BSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([0, 1, 2, 3, 4, 5])))
source
BasicBSpline.bsplinebasis′₊₀Function
bsplinebasis′₊₀(::AbstractFunctionSpace, ::Integer, ::Real) -> Real

1st derivative of B-spline basis function. Right-sided limit version.

\[\dot{B}_{(i,p,k)}(t) +=p\left(\frac{1}{k_{i+p}-k_{i}}B_{(i,p-1,k)}(t)-\frac{1}{k_{i+p+1}-k_{i+1}}B_{(i+1,p-1,k)}(t)\right)\]

bsplinebasis′₊₀(P, i, t) is equivalent to bsplinebasis₊₀(derivative(P), i, t).

source
BasicBSpline.bsplinebasis′₋₀Function
bsplinebasis′₋₀(::AbstractFunctionSpace, ::Integer, ::Real) -> Real

1st derivative of B-spline basis function. Left-sided limit version.

\[\dot{B}_{(i,p,k)}(t) +=p\left(\frac{1}{k_{i+p}-k_{i}}B_{(i,p-1,k)}(t)-\frac{1}{k_{i+p+1}-k_{i+1}}B_{(i+1,p-1,k)}(t)\right)\]

bsplinebasis′₋₀(P, i, t) is equivalent to bsplinebasis₋₀(derivative(P), i, t).

source
BasicBSpline.bsplinebasis′Function
bsplinebasis′(::AbstractFunctionSpace, ::Integer, ::Real) -> Real

1st derivative of B-spline basis function. Modified version.

\[\dot{B}_{(i,p,k)}(t) +=p\left(\frac{1}{k_{i+p}-k_{i}}B_{(i,p-1,k)}(t)-\frac{1}{k_{i+p+1}-k_{i+1}}B_{(i+1,p-1,k)}(t)\right)\]

bsplinebasis′(P, i, t) is equivalent to bsplinebasis(derivative(P), i, t).

source
diff --git a/dev/math-fitting/index.html b/dev/math-fitting/index.html index 73ceddcb0..3131c34fb 100644 --- a/dev/math-fitting/index.html +++ b/dev/math-fitting/index.html @@ -1,5 +1,5 @@ -Fitting · BasicBSpline.jl

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.

Fitting with least squares method.

BasicBSplineFitting.fittingcontrolpointsFunction

Fitting controlpoints with least squares method.

fittingcontrolpoints(func, Ps::Tuple)

This function will calculate $\bm{a}_i$ to minimize the following integral.

\[\int_I \left\|f(t)-\sum_i B_{(i,p,k)}(t) \bm{a}_i\right\|^2 dt\]

Similarly, for the two-dimensional case, minimize the following integral.

\[\int_{I^1 \times I^2} \left\|f(t^1, t^2)-\sum_{i,j} B_{(i,p^1,k^1)}(t^1)B_{(j,p^2,k^2)}(t^2) \bm{a}_{ij}\right\|^2 dt^1dt^2\]

Currently, this function supports up to three dimensions.

Examples

julia> f(t) = SVector(cos(t),sin(t),t);
+Fitting · BasicBSpline.jl

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.

Fitting with least squares method.

BasicBSplineFitting.fittingcontrolpointsFunction

Fitting controlpoints with least squares method.

fittingcontrolpoints(func, Ps::Tuple)

This function will calculate $\bm{a}_i$ to minimize the following integral.

\[\int_I \left\|f(t)-\sum_i B_{(i,p,k)}(t) \bm{a}_i\right\|^2 dt\]

Similarly, for the two-dimensional case, minimize the following integral.

\[\int_{I^1 \times I^2} \left\|f(t^1, t^2)-\sum_{i,j} B_{(i,p^1,k^1)}(t^1)B_{(j,p^2,k^2)}(t^2) \bm{a}_{ij}\right\|^2 dt^1dt^2\]

Currently, this function supports up to three dimensions.

Examples

julia> f(t) = SVector(cos(t),sin(t),t);
 
 julia> P = BSplineSpace{3}(KnotVector(range(0,2π,30)) + 3*KnotVector([0,2π]));
 
@@ -8,7 +8,7 @@
 julia> M = BSplineManifold(a, P);
 
 julia> norm(M(1) - f(1)) < 1e-5
-true
p1 = 2
+true
source
p1 = 2
 p2 = 2
 k1 = KnotVector(-10:10)+p1*KnotVector([-10,10])
 k2 = KnotVector(-10:10)+p2*KnotVector([-10,10])
@@ -19,4 +19,4 @@
 
 a = fittingcontrolpoints(f, (P1, P2))
 M = BSplineManifold(a, (P1, P2))
-save_png("fitting.png", M, unitlength=50, xlims=(-10,10), ylims=(-10,10))

Try on Desmos graphing graphing calculator!

+save_png("fitting.png", M, unitlength=50, xlims=(-10,10), ylims=(-10,10))

Try on Desmos graphing graphing calculator!

diff --git a/dev/math-inclusive/index.html b/dev/math-inclusive/index.html index 57a5b529b..8544c5f09 100644 --- a/dev/math-inclusive/index.html +++ b/dev/math-inclusive/index.html @@ -1,13 +1,16 @@ -Inclusive relationship · BasicBSpline.jl

Inclusive relation between B-spline spaces

Thm. Inclusive relation between B-spline spaces

For non-degenerate B-spline spaces, the following relationship holds.

\[\mathcal{P}[p,k] +Inclusive relationship · BasicBSpline.jl

Inclusive relation between B-spline spaces

Thm. Inclusive relation between B-spline spaces

For non-degenerate B-spline spaces, the following relationship holds.

\[\mathcal{P}[p,k] \subseteq \mathcal{P}[p',k'] -\Leftrightarrow (m=p'-p \ge 0 \ \text{and} \ k+m\widehat{k}\subseteq k')\]

Base.issubsetMethod

Check inclusive relationship between B-spline spaces.

\[\mathcal{P}[p,k] +\Leftrightarrow (m=p'-p \ge 0 \ \text{and} \ k+m\widehat{k}\subseteq k')\]

Base.issubsetMethod

Check inclusive relationship between B-spline spaces.

\[\mathcal{P}[p,k] \subseteq\mathcal{P}[p',k']\]

Examples

julia> P1 = BSplineSpace{1}(KnotVector([1,3,5,8]));
 
+
 julia> P2 = BSplineSpace{1}(KnotVector([1,3,5,6,8,9]));
 
+
 julia> P3 = BSplineSpace{2}(KnotVector([1,1,3,3,5,5,8,8]));
 
+
 julia> P1 ⊆ P2
 true
 
@@ -18,7 +21,7 @@
 false
 
 julia> P2 ⊈ P3
-true
source

Here are plots of the B-spline basis functions of the spaces P1, P2, P3.

julia> P1 = BSplineSpace{1}(KnotVector([1,3,5,8]))BSplineSpace{1, Int64, KnotVector{Int64}}(KnotVector([1, 3, 5, 8]))
julia> P2 = BSplineSpace{1}(KnotVector([1,3,5,6,8,9]))BSplineSpace{1, Int64, KnotVector{Int64}}(KnotVector([1, 3, 5, 6, 8, 9]))
julia> P3 = BSplineSpace{2}(KnotVector([1,1,3,3,5,5,8,8]))BSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([1, 1, 3, 3, 5, 5, 8, 8]))
julia> plot( +true
source

Here are plots of the B-spline basis functions of the spaces P1, P2, P3.

julia> P1 = BSplineSpace{1}(KnotVector([1,3,5,8]))BSplineSpace{1, Int64, KnotVector{Int64}}(KnotVector([1, 3, 5, 8]))
julia> P2 = BSplineSpace{1}(KnotVector([1,3,5,6,8,9]))BSplineSpace{1, Int64, KnotVector{Int64}}(KnotVector([1, 3, 5, 6, 8, 9]))
julia> P3 = BSplineSpace{2}(KnotVector([1,1,3,3,5,5,8,8]))BSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([1, 1, 3, 3, 5, 5, 8, 8]))
julia> plot( plot([t->bsplinebasis₊₀(P1,i,t) for i in 1:dim(P1)], 1, 9, ylims=(0,1), legend=false), plot([t->bsplinebasis₊₀(P2,i,t) for i in 1:dim(P2)], 1, 9, ylims=(0,1), legend=false), plot([t->bsplinebasis₊₀(P3,i,t) for i in 1:dim(P3)], 1, 9, ylims=(0,1), legend=false), @@ -39,14 +42,16 @@ plot([t->sum(A13[i,j]*bsplinebasis₊₀(P3,j,t) for j in 1:dim(P3)) for i in 1:dim(P1)], 1, 9, ylims=(0,1), legend=false), layout=(3,1), link=:x - )Plot{Plots.PlotlyBackend() n=6}
BasicBSpline.issqsubsetFunction

Check inclusive relationship between B-spline spaces.

\[\mathcal{P}[p,k] + )Plot{Plots.PlotlyBackend() n=6}

BasicBSpline.changebasis_RFunction

Return a coefficient matrix $A$ which satisfy

\[B_{(i,p,k)} = \sum_{j}A_{i,j}B_{(j,p',k')}\]

Assumption:

  • $P ⊆ P^{\prime}$
source
BasicBSpline.changebasis_IFunction

Return a coefficient matrix $A$ which satisfy

\[B_{(i,p,k)} = \sum_{j}A_{i,j}B_{(j,p',k')}\]

Assumption:

  • $P ⊑ P^{\prime}$
source
BasicBSpline.issqsubsetFunction

Check inclusive relationship between B-spline spaces.

\[\mathcal{P}[p,k] \sqsubseteq\mathcal{P}[p',k'] \Leftrightarrow \mathcal{P}[p,k]|_{[k_{p+1},k_{l-p}]} -\subseteq\mathcal{P}[p',k']|_{[k'_{p'+1},k'_{l'-p'}]}\]

source
BasicBSpline.expandspaceFunction

Expand B-spline space with given additional degree and knotvector. The behavior of expandspace is same as expandspace_I.

source
BasicBSpline.expandspace_RFunction

Expand B-spline space with given additional degree and knotvector. This function is compatible with issubset ().

Examples

julia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]);
+\subseteq\mathcal{P}[p',k']|_{[k'_{p'+1},k'_{l'-p'}]}\]

source
BasicBSpline.expandspaceFunction

Expand B-spline space with given additional degree and knotvector. The behavior of expandspace is same as expandspace_I.

source
BasicBSpline.expandspace_RFunction

Expand B-spline space with given additional degree and knotvector. This function is compatible with issubset ().

Examples

julia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]);
+
 
 julia> P = BSplineSpace{2}(k);
 
+
 julia> P′ = expandspace_R(P, Val(1), KnotVector([6.0]))
 BSplineSpace{3, Float64, KnotVector{Float64}}(KnotVector([0.0, 0.0, 1.5, 1.5, 2.5, 2.5, 5.5, 5.5, 6.0, 8.0, 8.0, 9.0, 9.0, 9.5, 9.5, 10.0, 10.0]))
 
@@ -57,13 +62,15 @@
 false
 
 julia> domain(P)
-2.5..9.0
+2.5 .. 9.0
 
 julia> domain(P′)
-1.5..9.5
source
BasicBSpline.expandspace_IFunction

Expand B-spline space with given additional degree and knotvector. This function is compatible with issqsubset ()

Examples

julia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]);
+1.5 .. 9.5
source
BasicBSpline.expandspace_IFunction

Expand B-spline space with given additional degree and knotvector. This function is compatible with issqsubset ()

Examples

julia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]);
+
 
 julia> P = BSplineSpace{2}(k);
 
+
 julia> P′ = expandspace_I(P, Val(1), KnotVector([6.0]))
 BSplineSpace{3, Float64, KnotVector{Float64}}(KnotVector([0.0, 1.5, 2.5, 2.5, 5.5, 5.5, 6.0, 8.0, 8.0, 9.0, 9.0, 9.5, 10.0]))
 
@@ -74,7 +81,7 @@
 true
 
 julia> domain(P)
-2.5..9.0
+2.5 .. 9.0
 
 julia> domain(P′)
-2.5..9.0
source
+2.5 .. 9.0source diff --git a/dev/math-knotvector/index.html b/dev/math-knotvector/index.html index f7baf6232..37f19ec89 100644 --- a/dev/math-knotvector/index.html +++ b/dev/math-knotvector/index.html @@ -1,37 +1,45 @@ -Knot vector · BasicBSpline.jl

Knot vector

Definition

Def. Knot vector

A finite sequence

\[k = (k_1, \dots, k_l)\]

is called knot vector if the sequence is broad monotonic increase, i.e. $k_{i} \le k_{i+1}$.

[TODO: fig]

BasicBSpline.KnotVectorType

Construct knot vector from given array.

\[k=(k_1,\dots,k_l)\]

Examples

julia> k = KnotVector([1,2,3])
+Knot vector · BasicBSpline.jl

Knot vector

Definition

Def. Knot vector

A finite sequence

\[k = (k_1, \dots, k_l)\]

is called knot vector if the sequence is broad monotonic increase, i.e. $k_{i} \le k_{i+1}$.

[TODO: fig]

BasicBSpline.KnotVectorType

Construct knot vector from given array.

\[k=(k_1,\dots,k_l)\]

Examples

julia> k = KnotVector([1,2,3])
 KnotVector([1, 2, 3])
 
 julia> k = KnotVector(1:3)
-KnotVector([1, 2, 3])
source
BasicBSpline.UniformKnotVectorType

Construct uniform knot vector from given range.

\[k=(k_1,\dots,k_l)\]

Examples

julia> k = UniformKnotVector(1:8)
 UniformKnotVector(1:8)
 
 julia> UniformKnotVector(8:-1:3)
-UniformKnotVector(3:1:8)
source
BasicBSpline.EmptyKnotVectorType

Knot vector with zero-element.

\[k=()\]

This struct is intended for internal use.

Examples

julia> EmptyKnotVector()
+UniformKnotVector(3:1:8)
source
BasicBSpline.SubKnotVectorType

A type to represetnt sub knot vector.

\[k=(k_1,\dots,k_l)\]

Examples

julia> k = knotvector"1 11 211"
+KnotVector([1, 3, 4, 6, 6, 7, 8])
+
+julia> view(k, 2:5)
+SubKnotVector([3, 4, 6, 6])
source
BasicBSpline.EmptyKnotVectorType

Knot vector with zero-element.

\[k=()\]

This struct is intended for internal use.

Examples

julia> EmptyKnotVector()
 EmptyKnotVector{Bool}()
 
 julia> EmptyKnotVector{Float64}()
-EmptyKnotVector{Float64}()
source

Operations for knot vectors

Base.lengthMethod

Length of knot vector

\[\begin{aligned} +EmptyKnotVector{Float64}()

source

Operations for knot vectors

Base.lengthMethod

Length of knot vector

\[\begin{aligned} \#{k} &=(\text{number of knot elements of} \ k) \\ \end{aligned}\]

For example, $\#{(1,2,2,3)}=4$.

Examples

julia> k = KnotVector([1,2,2,3]);
 
+
 julia> length(k)
-4
source

Although a knot vector is not a vector in linear algebra, but we introduce additional operator $+$.

Although a knot vector is not a vector in linear algebra, but we introduce additional operator $+$.

Base.:+Method

Sum of knot vectors

\[\begin{aligned} k^{(1)}+k^{(2)} &=(k^{(1)}_1, \dots, k^{(1)}_{l^{(1)}}) + (k^{(2)}_1, \dots, k^{(2)}_{l^{(2)}}) \\ &=(\text{sort of union of} \ k^{(1)} \ \text{and} \ k^{(2)} \text{)} \end{aligned}\]

For example, $(1,2,3,5)+(4,5,8)=(1,2,3,4,5,5,8)$.

Examples

julia> k1 = KnotVector([1,2,3,5]);
 
+
 julia> k2 = KnotVector([4,5,8]);
 
+
 julia> k1 + k2
-KnotVector([1, 2, 3, 4, 5, 5, 8])
source

Note that the operator +(::KnotVector, ::KnotVector) is commutative. This is why we choose the $+$ sign. We also introduce product operator $\cdot$ for knot vector.

Base.:*Method

Product of integer and knot vector

\[\begin{aligned} +KnotVector([1, 2, 3, 4, 5, 5, 8])

source

Note that the operator +(::KnotVector, ::KnotVector) is commutative. This is why we choose the $+$ sign. We also introduce product operator $\cdot$ for knot vector.

Base.:*Method

Product of integer and knot vector

\[\begin{aligned} m\cdot k&=\underbrace{k+\cdots+k}_{m} \end{aligned}\]

For example, $2\cdot (1,2,2,5)=(1,1,2,2,2,2,5,5)$.

Examples

julia> k = KnotVector([1,2,2,5]);
 
+
 julia> 2 * k
-KnotVector([1, 1, 2, 2, 2, 2, 5, 5])
source

Inclusive relationship between knot vectors.

Base.issubsetMethod

Check a inclusive relationship $k\subseteq k'$, for example:

\[\begin{aligned} +KnotVector([1, 1, 2, 2, 2, 2, 5, 5])

source

Inclusive relationship between knot vectors.

Base.issubsetMethod

Check a inclusive relationship $k\subseteq k'$, for example:

\[\begin{aligned} (1,2) &\subseteq (1,2,3) \\ (1,2,2) &\not\subseteq (1,2,3) \\ (1,2,3) &\subseteq (1,2,3) \\ @@ -42,13 +50,15 @@ false julia> KnotVector([1,2,3]) ⊆ KnotVector([1,2,3]) -true

source
Base.uniqueMethod

Unique elements of knot vector.

\[\begin{aligned} \widehat{k} &=(\text{unique knot elements of} \ k) \\ \end{aligned}\]

For example, $\widehat{(1,2,2,3)}=(1,2,3)$.

Examples

julia> k = KnotVector([1,2,2,3]);
 
+
 julia> unique(k)
-KnotVector([1, 2, 3])
source
BasicBSpline.countknotsMethod

For given knot vector $k$, the following function $\mathfrak{n}_k:\mathbb{R}\to\mathbb{Z}$ represents the number of knots that duplicate the knot vector $k$.

\[\mathfrak{n}_k(t) = \#\{i \mid k_i=t \}\]

For example, if $k=(1,2,2,3)$, then $\mathfrak{n}_k(0.3)=0$, $\mathfrak{n}_k(1)=1$, $\mathfrak{n}_k(2)=2$.

julia> k = KnotVector([1,2,2,3]);
+KnotVector([1, 2, 3])
source
BasicBSpline.countknotsMethod

For given knot vector $k$, the following function $\mathfrak{n}_k:\mathbb{R}\to\mathbb{Z}$ represents the number of knots that duplicate the knot vector $k$.

\[\mathfrak{n}_k(t) = \#\{i \mid k_i=t \}\]

For example, if $k=(1,2,2,3)$, then $\mathfrak{n}_k(0.3)=0$, $\mathfrak{n}_k(1)=1$, $\mathfrak{n}_k(2)=2$.

julia> k = KnotVector([1,2,2,3]);
+
 
 julia> countknots(k,0.3)
 0
@@ -57,4 +67,14 @@
 1
 
 julia> countknots(k,2.0)
-2
source
+2source

KnotVector with string macro

BasicBSpline.@knotvector_strMacro
@knotvector_str -> KnotVector

Construct a knotvector by specifying the numbers of duplicates of knots.

Examples

julia> knotvector"11111"
+KnotVector([1, 2, 3, 4, 5])
+
+julia> knotvector"123"
+KnotVector([1, 2, 2, 3, 3, 3])
+
+julia> knotvector" 2 2 2"
+KnotVector([2, 2, 4, 4, 6, 6])
+
+julia> knotvector"     1"
+KnotVector([6])
source
diff --git a/dev/math-rationalbsplinemanifold/index.html b/dev/math-rationalbsplinemanifold/index.html index 65b3349ce..7b600ae5f 100644 --- a/dev/math-rationalbsplinemanifold/index.html +++ b/dev/math-rationalbsplinemanifold/index.html @@ -1,9 +1,9 @@ -Rational B-spline manifold · BasicBSpline.jl

Rational B-spline manifold

Non-uniform rational basis spline (NURBS) is also supported in BasicBSpline.jl package.

Rational B-spline manifold

Rational B-spline manifold is a parametric representation of a shape.

Def. Rational B-spline manifold

For given $d$-dimensional B-spline basis functions $B_{(i^1,p^1,k^1)} \otimes \cdots \otimes B_{(i^d,p^d,k^d)}$, given points $\bm{a}_{i^1 \dots i^d} \in V$ and real numbers $w_{i^1 \dots i^d} > 0$, rational B-spline manifold is defined by the following equality:

\[\bm{p}(t^1,\dots,t^d; \bm{a}_{i^1 \dots i^d}, w_{i^1 \dots i^d}) +Rational B-spline manifold · BasicBSpline.jl

Rational B-spline manifold

Non-uniform rational basis spline (NURBS) is also supported in BasicBSpline.jl package.

Rational B-spline manifold

Rational B-spline manifold is a parametric representation of a shape.

Def. Rational B-spline manifold

For given $d$-dimensional B-spline basis functions $B_{(i^1,p^1,k^1)} \otimes \cdots \otimes B_{(i^d,p^d,k^d)}$, given points $\bm{a}_{i^1 \dots i^d} \in V$ and real numbers $w_{i^1 \dots i^d} > 0$, rational B-spline manifold is defined by the following equality:

\[\bm{p}(t^1,\dots,t^d; \bm{a}_{i^1 \dots i^d}, w_{i^1 \dots i^d}) =\sum_{i^1,\dots,i^d} \frac{(B_{(i^1,p^1,k^1)} \otimes \cdots \otimes B_{(i^d,p^d,k^d)})(t^1,\dots,t^d) w_{i^1 \dots i^d}} {\sum\limits_{j^1,\dots,j^d}(B_{(j^1,p^1,k^1)} \otimes \cdots \otimes B_{(j^d,p^d,k^d)})(t^1,\dots,t^d) w_{j^1 \dots j^d}} -\bm{a}_{i^1 \dots i^d}\]

Where $\bm{a}_{i^1,\dots,i^d}$ are called control points, and $w_{i^1 \dots i^d}$ are called weights.

BasicBSpline.RationalBSplineManifoldType

Construct Rational B-spline manifold from given control points, weights and B-spline spaces.

Examples

julia> using StaticArrays, LinearAlgebra
+\bm{a}_{i^1 \dots i^d}\]

Where $\bm{a}_{i^1,\dots,i^d}$ are called control points, and $w_{i^1 \dots i^d}$ are called weights.

BasicBSpline.RationalBSplineManifoldType

Construct Rational B-spline manifold from given control points, weights and B-spline spaces.

Examples

julia> using StaticArrays, LinearAlgebra
 
 julia> P = BSplineSpace{2}(KnotVector([0,0,0,1,1,1]))
 BSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([0, 0, 0, 1, 1, 1]))
@@ -22,10 +22,11 @@
 
 julia> M = RationalBSplineManifold(a,w,P);  # 1/4 arc
 
+
 julia> M(0.3)
 2-element SVector{2, Float64} with indices SOneTo(2):
  0.8973756499953727
  0.4412674277525845
 
 julia> norm(M(0.3))
-1.0
source

Properties

Similar to BSplineManifold, RationalBSplineManifold supports the following methods and properties.

  • currying
  • refinement
  • Affine commutativity
+1.0source

Properties

Similar to BSplineManifold, RationalBSplineManifold supports the following methods and properties.

  • currying
  • refinement
  • Affine commutativity
diff --git a/dev/math-refinement/index.html b/dev/math-refinement/index.html index 7e88c5a0f..a4fe60525 100644 --- a/dev/math-refinement/index.html +++ b/dev/math-refinement/index.html @@ -1,7 +1,7 @@ -Refinement · BasicBSpline.jl

Refinement

Documentation

Example

Define original manifold

p = 2 # degree of polynomial
+Refinement · BasicBSpline.jl

Refinement

Documentation

Example

Define original manifold

p = 2 # degree of polynomial
 k = KnotVector(1:8) # knot vector
 P = BSplineSpace{p}(k) # B-spline space
 rand_a = [SVector(rand(), rand()) for i in 1:dim(P), j in 1:dim(P)]
 a = [SVector(2*i-6.5, 2*j-6.5) for i in 1:dim(P), j in 1:dim(P)] + rand_a # random
-M = BSplineManifold(a,(P,P)) # Define B-spline manifold

h-refinement

Insert additional knots to knot vector.

julia> k₊ = (KnotVector([3.3,4.2]),KnotVector([3.8,3.2,5.3])) # additional knot vectors(KnotVector([3.3, 4.2]), KnotVector([3.2, 3.8, 5.3]))
julia> M_h = refinement(M, k₊) # refinement of B-spline manifoldBSplineManifold{2, (2, 2), StaticArraysCore.SVector{2, Float64}, Tuple{BSplineSpace{2, Float64, KnotVector{Float64}}, BSplineSpace{2, Float64, KnotVector{Float64}}}}((BSplineSpace{2, Float64, KnotVector{Float64}}(KnotVector([1.0, 2.0, 3.0, 3.3, 4.0, 4.2, 5.0, 6.0, 7.0, 8.0])), BSplineSpace{2, Float64, KnotVector{Float64}}(KnotVector([1.0, 2.0, 3.0, 3.2, 3.8, 4.0, 5.0, 5.3, 6.0, 7.0, 8.0]))), StaticArraysCore.SVector{2, Float64}[[-3.7392559679567654, -3.783078079871714] [-3.597411705002145, -2.6270907448400385] … [-4.27252342702906, 2.44794251443626] [-4.010429310201709, 3.869439330221196]; [-2.328731904641716, -4.1480930630807595] [-2.275419510381314, -2.8615581264721692] … [-2.736955136391798, 2.5020454657912223] [-2.786990222003846, 3.8096177268489324]; … ; [2.359972932445208, -3.6129585850258517] [2.373167856283101, -2.9446206124413257] … [2.210716406024899, 2.602631448306355] [2.3997592455372003, 3.5324898804805147]; [4.093841853317975, -3.9061261483801712] [3.8504632555175444, -2.9860983311743827] … [4.331025079311032, 2.333423772424664] [4.480663191353303, 4.436571553462537]])
julia> save_png("2dim_h-refinement.png", M_h) # save image

Note that this shape and the last shape are equivalent.

p-refinement

Increase the polynomial degree of B-spline manifold.

julia> p₊ = (Val(1), Val(2)) # additional degrees(Val{1}(), Val{2}())
julia> M_p = refinement(M, p₊) # refinement of B-spline manifoldBSplineManifold{2, (3, 4), StaticArraysCore.SVector{2, Float64}, Tuple{BSplineSpace{3, Int64, KnotVector{Int64}}, BSplineSpace{4, Int64, KnotVector{Int64}}}}((BSplineSpace{3, Int64, KnotVector{Int64}}(KnotVector([1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8])), BSplineSpace{4, Int64, KnotVector{Int64}}(KnotVector([1, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8]))), StaticArraysCore.SVector{2, Float64}[[-3.327939887958376, -3.3810628823825324] [-3.2286534014564956, -2.3898453165277362] … [-3.857369028126979, 2.625613347418197] [-3.750274329305369, 3.444604754180493]; [-1.9190826728891883, -3.6996476508119316] [-1.8954644502285198, -2.596850938310199] … [-2.320089840437407, 2.6673570013295036] [-2.4013083859231266, 3.4176156450587825]; … ; [2.63663136518713, -3.36586722890932] [2.6119919237133846, -2.773961995558151] … [2.5855688772510934, 2.690164285500753] [2.692907338976954, 3.352168201374152]; [3.721273556424996, -3.4913984254174055] [3.554093269596626, -2.7596655006099793] … [3.996017425914788, 2.6027151956081527] [4.087903053338675, 3.724832581624184]])
julia> save_png("2dim_p-refinement.png", M_p) # save image

Note that this shape and the last shape are equivalent.

+M = BSplineManifold(a,(P,P)) # Define B-spline manifold

h-refinement

Insert additional knots to knot vector.

julia> k₊ = (KnotVector([3.3,4.2]),KnotVector([3.8,3.2,5.3])) # additional knot vectors(KnotVector([3.3, 4.2]), KnotVector([3.2, 3.8, 5.3]))
julia> M_h = refinement(M, k₊) # refinement of B-spline manifoldBSplineManifold{2, (2, 2), StaticArraysCore.SVector{2, Float64}, Tuple{BSplineSpace{2, Float64, KnotVector{Float64}}, BSplineSpace{2, Float64, KnotVector{Float64}}}}((BSplineSpace{2, Float64, KnotVector{Float64}}(KnotVector([1.0, 2.0, 3.0, 3.3, 4.0, 4.2, 5.0, 6.0, 7.0, 8.0])), BSplineSpace{2, Float64, KnotVector{Float64}}(KnotVector([1.0, 2.0, 3.0, 3.2, 3.8, 4.0, 5.0, 5.3, 6.0, 7.0, 8.0]))), StaticArraysCore.SVector{2, Float64}[[-3.7392559679567654, -3.783078079871714] [-3.597411705002145, -2.6270907448400385] … [-4.27252342702906, 2.44794251443626] [-4.010429310201709, 3.869439330221196]; [-2.328731904641716, -4.1480930630807595] [-2.275419510381314, -2.8615581264721692] … [-2.736955136391798, 2.5020454657912223] [-2.786990222003846, 3.8096177268489324]; … ; [2.359972932445208, -3.6129585850258517] [2.373167856283101, -2.9446206124413257] … [2.210716406024899, 2.602631448306355] [2.3997592455372003, 3.5324898804805147]; [4.093841853317975, -3.9061261483801712] [3.8504632555175444, -2.9860983311743827] … [4.331025079311032, 2.333423772424664] [4.480663191353303, 4.436571553462537]])
julia> save_png("2dim_h-refinement.png", M_h) # save image

Note that this shape and the last shape are equivalent.

p-refinement

Increase the polynomial degree of B-spline manifold.

julia> p₊ = (Val(1), Val(2)) # additional degrees(Val{1}(), Val{2}())
julia> M_p = refinement(M, p₊) # refinement of B-spline manifoldBSplineManifold{2, (3, 4), StaticArraysCore.SVector{2, Float64}, Tuple{BSplineSpace{3, Int64, KnotVector{Int64}}, BSplineSpace{4, Int64, KnotVector{Int64}}}}((BSplineSpace{3, Int64, KnotVector{Int64}}(KnotVector([1, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8])), BSplineSpace{4, Int64, KnotVector{Int64}}(KnotVector([1, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 8]))), StaticArraysCore.SVector{2, Float64}[[-3.327939887958376, -3.381062882382532] [-3.2286534014564956, -2.3898453165277354] … [-3.857369028126979, 2.625613347418197] [-3.750274329305369, 3.444604754180493]; [-1.9190826728891883, -3.6996476508119316] [-1.8954644502285198, -2.596850938310199] … [-2.320089840437407, 2.6673570013295036] [-2.4013083859231266, 3.417615645058782]; … ; [2.63663136518713, -3.36586722890932] [2.6119919237133846, -2.773961995558151] … [2.5855688772510934, 2.690164285500753] [2.692907338976954, 3.352168201374152]; [3.7212735564249955, -3.491398425417405] [3.554093269596626, -2.759665500609979] … [3.9960174259147876, 2.6027151956081522] [4.087903053338675, 3.7248325816241836]])
julia> save_png("2dim_p-refinement.png", M_p) # save image

Note that this shape and the last shape are equivalent.

diff --git a/dev/math/index.html b/dev/math/index.html index 8228927fc..af67c4d1d 100644 --- a/dev/math/index.html +++ b/dev/math/index.html @@ -1,3 +1,3 @@ -Introduction · BasicBSpline.jl

Mathematical properties of B-spline

Introduction

B-spline is a mathematical object, and it has a lot of application. (e.g. Geometric representation: NURBS, Interpolation, Numerical analysis: IGA)

In this page, we'll explain the mathematical definitions and properties of B-spline with Julia code. Before running the code in the following section, you need to import packages:

using BasicBSpline
-using Plots; plotly()
Plots.PlotlyBackend()

Notice

Some of notations in this page are our original, but these are well-considered results.

References

Most of this documentation around B-spline is self-contained. If you want to learn more, the following resources are recommended.

日本語の文献では以下がおすすめです。

+Introduction · BasicBSpline.jl

Mathematical properties of B-spline

Introduction

B-spline is a mathematical object, and it has a lot of application. (e.g. Geometric representation: NURBS, Interpolation, Numerical analysis: IGA)

In this page, we'll explain the mathematical definitions and properties of B-spline with Julia code. Before running the code in the following section, you need to import packages:

using BasicBSpline
+using Plots; plotly()
Plots.PlotlyBackend()

Notice

Some of notations in this page are our original, but these are well-considered results.

References

Most of this documentation around B-spline is self-contained. If you want to learn more, the following resources are recommended.

日本語の文献では以下がおすすめです。

diff --git a/dev/plotlyjs/index.html b/dev/plotlyjs/index.html index e0046d609..b1d7635d3 100644 --- a/dev/plotlyjs/index.html +++ b/dev/plotlyjs/index.html @@ -1,5 +1,5 @@ -PlotlyJS.jl · BasicBSpline.jl

PlotlyJS.jl

Cardioid

using BasicBSpline
+PlotlyJS.jl · BasicBSpline.jl

PlotlyJS.jl

Cardioid

using BasicBSpline
 using BasicBSplineFitting
 using StaticArrays
 using PlotlyJS
@@ -37,4 +37,4 @@
 zs_f = getindex.(M.(ts),3)
 fig = Plot(scatter3d(x=xs_a, y=ys_a, z=zs_a, name="control points", line_color="blue", marker_size=8))
 addtraces!(fig, scatter3d(x=xs_f, y=ys_f, z=zs_f, name="B-spline curve", mode="lines", line_color="red"))
-relayout!(fig, width=500, height=500)
+relayout!(fig, width=500, height=500)
diff --git a/dev/plots-arc.html b/dev/plots-arc.html index 5094e08b6..89fd2078b 100644 --- a/dev/plots-arc.html +++ b/dev/plots-arc.html @@ -1,7 +1,7 @@ -
+
+
+
+
+
+
+

Plots.jl

BasicBSpline.jl has a dependency on RecipesBase.jl. This means, users can easily visalize instances defined in BasicBSpline. In this section, we will provide some plottig examples.

BSplineSpace

k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])
+Plots.jl · BasicBSpline.jl

Plots.jl

BasicBSpline.jl has a dependency on RecipesBase.jl. This means, users can easily visalize instances defined in BasicBSpline. In this section, we will provide some plottig examples.

BSplineSpace

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
@@ -58,4 +58,4 @@
 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")
+plot!(R, label="Rational B-spline curve")
diff --git a/dev/search/index.html b/dev/search/index.html deleted file mode 100644 index 734b1ad94..000000000 --- a/dev/search/index.html +++ /dev/null @@ -1,2 +0,0 @@ - -Search · BasicBSpline.jl

Loading search...

    diff --git a/dev/search_index.js b/dev/search_index.js index afd360df0..e9b2db535 100644 --- a/dev/search_index.js +++ b/dev/search_index.js @@ -1,3 +1,3 @@ var documenterSearchIndex = {"docs": -[{"location":"math-fitting/#Fitting-with-B-spline-manifold","page":"Fitting","title":"Fitting with B-spline manifold","text":"","category":"section"},{"location":"math-fitting/","page":"Fitting","title":"Fitting","text":"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.","category":"page"},{"location":"math-fitting/","page":"Fitting","title":"Fitting","text":"using BasicBSpline\nusing BasicBSplineFitting\nusing BasicBSplineExporter\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"math-fitting/","page":"Fitting","title":"Fitting","text":"Fitting with least squares method.","category":"page"},{"location":"math-fitting/","page":"Fitting","title":"Fitting","text":"fittingcontrolpoints","category":"page"},{"location":"math-fitting/#BasicBSplineFitting.fittingcontrolpoints","page":"Fitting","title":"BasicBSplineFitting.fittingcontrolpoints","text":"Fitting controlpoints with least squares method.\n\nfittingcontrolpoints(func, Ps::Tuple)\n\nThis function will calculate bma_i to minimize the following integral.\n\nint_I leftf(t)-sum_i B_(ipk)(t) bma_iright^2 dt\n\nSimilarly, for the two-dimensional case, minimize the following integral.\n\nint_I^1 times I^2 leftf(t^1 t^2)-sum_ij B_(ip^1k^1)(t^1)B_(jp^2k^2)(t^2) bma_ijright^2 dt^1dt^2\n\nCurrently, this function supports up to three dimensions.\n\nExamples\n\njulia> f(t) = SVector(cos(t),sin(t),t);\n\njulia> P = BSplineSpace{3}(KnotVector(range(0,2π,30)) + 3*KnotVector([0,2π]));\n\njulia> a = fittingcontrolpoints(f, P);\n\njulia> M = BSplineManifold(a, P);\n\njulia> norm(M(1) - f(1)) < 1e-5\ntrue\n\n\n\n\n\n","category":"function"},{"location":"math-fitting/","page":"Fitting","title":"Fitting","text":"p1 = 2\np2 = 2\nk1 = KnotVector(-10:10)+p1*KnotVector([-10,10])\nk2 = KnotVector(-10:10)+p2*KnotVector([-10,10])\nP1 = BSplineSpace{p1}(k1)\nP2 = BSplineSpace{p2}(k2)\n\nf(u1, u2) = SVector(2u1 + sin(u1) + cos(u2) + u2 / 2, 3u2 + sin(u2) + sin(u1) / 2 + u1^2 / 6) / 5\n\na = fittingcontrolpoints(f, (P1, P2))\nM = BSplineManifold(a, (P1, P2))\nsave_png(\"fitting.png\", M, unitlength=50, xlims=(-10,10), ylims=(-10,10))","category":"page"},{"location":"math-fitting/","page":"Fitting","title":"Fitting","text":"(Image: )","category":"page"},{"location":"math-fitting/","page":"Fitting","title":"Fitting","text":"Try on Desmos graphing graphing calculator! (Image: )","category":"page"},{"location":"math-refinement/#Refinement","page":"Refinement","title":"Refinement","text":"","category":"section"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"math-refinement/#Documentation","page":"Refinement","title":"Documentation","text":"","category":"section"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"refinement","category":"page"},{"location":"math-refinement/#BasicBSpline.refinement","page":"Refinement","title":"BasicBSpline.refinement","text":"Refinement of B-spline manifold with given B-spline spaces.\n\n\n\n\n\n","category":"function"},{"location":"math-refinement/#Example","page":"Refinement","title":"Example","text":"","category":"section"},{"location":"math-refinement/#Define-original-manifold","page":"Refinement","title":"Define original manifold","text":"","category":"section"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"p = 2 # degree of polynomial\nk = KnotVector(1:8) # knot vector\nP = BSplineSpace{p}(k) # B-spline space\nrand_a = [SVector(rand(), rand()) for i in 1:dim(P), j in 1:dim(P)]\na = [SVector(2*i-6.5, 2*j-6.5) for i in 1:dim(P), j in 1:dim(P)] + rand_a # random \nM = BSplineManifold(a,(P,P)) # Define B-spline manifold\nnothing # hide","category":"page"},{"location":"math-refinement/#h-refinement","page":"Refinement","title":"h-refinement","text":"","category":"section"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"Insert additional knots to knot vector.","category":"page"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"k₊ = (KnotVector([3.3,4.2]),KnotVector([3.8,3.2,5.3])) # additional knot vectors\nM_h = refinement(M, k₊) # refinement of B-spline manifold\nsave_png(\"2dim_h-refinement.png\", M_h) # save image","category":"page"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"(Image: )","category":"page"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"Note that this shape and the last shape are equivalent.","category":"page"},{"location":"math-refinement/#p-refinement","page":"Refinement","title":"p-refinement","text":"","category":"section"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"Increase the polynomial degree of B-spline manifold.","category":"page"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"p₊ = (Val(1), Val(2)) # additional degrees\nM_p = refinement(M, p₊) # refinement of B-spline manifold\nsave_png(\"2dim_p-refinement.png\", M_p) # save image","category":"page"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"(Image: )","category":"page"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"Note that this shape and the last shape are equivalent.","category":"page"},{"location":"interpolations/#Interpolations","page":"Interpolations","title":"Interpolations","text":"","category":"section"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"Currently, BasicBSpline.jl doesn't have APIs for interpolations, but it is not hard to implement some basic interpolation algorithms with this package.","category":"page"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"using BasicBSpline\nusing IntervalSets\nusing Random; Random.seed!(42)\nusing Plots; plotly()","category":"page"},{"location":"interpolations/#Interpolation-with-cubic-B-spline","page":"Interpolations","title":"Interpolation with cubic B-spline","text":"","category":"section"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"function interpolate(xs::AbstractVector, fs::AbstractVector{T}) where T\n # Cubic open B-spline space\n p = 3\n k = KnotVector(xs) + KnotVector([xs[1],xs[end]]) * p\n P = BSplineSpace{p}(k)\n\n # dimensions\n m = length(xs)\n n = dim(P)\n\n # The interpolant function has a f''=0 property at bounds.\n ddP = BSplineDerivativeSpace{2}(P)\n dda = [bsplinebasis(ddP,j,xs[1]) for j in 1:n]\n ddb = [bsplinebasis(ddP,j,xs[m]) for j in 1:n]\n\n # Compute the interpolant function (1-dim B-spline manifold)\n M = [bsplinebasis(P,j,xs[i]) for i in 1:m, j in 1:n]\n M = vcat(dda', M, ddb')\n y = vcat(zero(T), fs, zero(T))\n return BSplineManifold(M\\y, P)\nend\n\n# Example inputs\nxs = [1, 2, 3, 4, 6, 7]\nfs = [1.3, 1.5, 2, 2.1, 1.9, 1.3]\nf = interpolate(xs,fs)\n\n# Plot\nscatter(xs, fs)\nplot!(t->f(t))\nsavefig(\"interpolation_cubic.html\") # hide\nnothing # hide","category":"page"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"","category":"page"},{"location":"interpolations/#Interpolation-with-linear-B-spline","page":"Interpolations","title":"Interpolation with linear B-spline","text":"","category":"section"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"function interpolate_linear(xs::AbstractVector, fs::AbstractVector{T}) where T\n # Linear open B-spline space\n p = 1\n k = KnotVector(xs) + KnotVector([xs[1],xs[end]])\n P = BSplineSpace{p}(k)\n\n # dimensions\n m = length(xs)\n n = dim(P)\n\n # Compute the interpolant function (1-dim B-spline manifold)\n return BSplineManifold(fs, P)\nend\n\n# Example inputs\nxs = [1, 2, 3, 4, 6, 7]\nfs = [1.3, 1.5, 2, 2.1, 1.9, 1.3]\n\nf = interpolate_linear(xs,fs)\n\n# Plot\nscatter(xs, fs)\nplot!(t->f(t))\nsavefig(\"interpolation_linear.html\") # hide\nnothing # hide","category":"page"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"","category":"page"},{"location":"interpolations/#Interpolation-with-periodic-B-spline","page":"Interpolations","title":"Interpolation with periodic B-spline","text":"","category":"section"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"function interpolate_periodic(xs::AbstractVector, fs::AbstractVector, ::Val{p}) where p\n # Closed B-spline space, any polynomial degrees can be accepted\n n = length(xs) - 1\n period = xs[end]-xs[begin]\n k = KnotVector(vcat(\n xs[end-p:end-1] .- period,\n xs,\n xs[begin+1:begin+p] .+ period\n ))\n P = BSplineSpace{p}(k)\n A = [bsplinebasis(P,j,xs[i]) for i in 1:n, j in 1:n]\n for i in 1:p-1, j in 1:i\n A[n+i-p+1,j] += bsplinebasis(P,j+n,xs[i+n-p+1])\n end\n b = A \\ fs[begin:end-1]\n # Compute the interpolant function (1-dim B-spline manifold)\n return BSplineManifold(vcat(b,b[1:p]), P)\nend\n\n# Example inputs\nxs = [1, 2, 3, 4, 6, 7]\nfs = [1.3, 1.5, 2, 2.1, 1.9, 1.3] # fs[1] == fs[end]\n\nf = interpolate_periodic(xs,fs,Val(2))\n\n# Plot\nscatter(xs, fs)\nplot!(t->f(mod(t-1,6)+1),1,14)\nplot!(t->f(t))\nsavefig(\"interpolation_periodic.html\") # hide\nnothing # hide","category":"page"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"","category":"page"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"Note that the periodic interpolation supports any degree of polynomial.","category":"page"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"xs = 2π*rand(10)\nsort!(push!(xs, 0, 2π))\nfs = sin.(xs)\nf1 = interpolate_periodic(xs,fs,Val(1))\nf2 = interpolate_periodic(xs,fs,Val(2))\nf3 = interpolate_periodic(xs,fs,Val(3))\nf4 = interpolate_periodic(xs,fs,Val(4))\nf5 = interpolate_periodic(xs,fs,Val(5))\nscatter(xs, fs, label=\"sampling points\")\nplot!(sin, label=\"sine curve\", color=:black)\nplot!(t->f1(t), label=\"polynomial degree 1\")\nplot!(t->f2(t), label=\"polynomial degree 2\")\nplot!(t->f3(t), label=\"polynomial degree 3\")\nplot!(t->f4(t), label=\"polynomial degree 4\")\nplot!(t->f5(t), label=\"polynomial degree 5\")\nsavefig(\"interpolation_periodic_sin.html\") # hide\nnothing # hide","category":"page"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"","category":"page"},{"location":"contributing/#Contributing","page":"Contributing","title":"Contributing","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"The main contributer Hyrodium is not native English speaker. So, English corrections would be really helpful. Of course, other code improvement are welcomed!","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Feel free to open issues and pull requests!","category":"page"},{"location":"math-bsplinebasis/#B-spline-basis-function","page":"B-spline basis function","title":"B-spline basis function","text":"","category":"section"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"math-bsplinebasis/#Basic-properties-of-B-spline-basis-function","page":"B-spline basis function","title":"Basic properties of B-spline basis function","text":"","category":"section"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"tip: Def. B-spline space\nB-spline basis function is defined by Cox–de Boor recursion formula.beginaligned\nB_(ipk)(t)\n=\nfract-k_ik_i+p-k_iB_(ip-1k)(t)\n+frack_i+p+1-tk_i+p+1-k_i+1B_(i+1p-1k)(t) \nB_(i0k)(t)\n=\nbegincases\n 1quad (k_ile t k_i+1)\n 0quad (textotherwise)\nendcases\nendalignedIf the denominator is zero, then the term is assumed to be zero.","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"The next figure shows the plot of B-spline basis functions. You can manipulate these plots on desmos graphing calculator!","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"(Image: )","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"info: Thm. Basis of B-spline space\nThe set of functions B_(ipk)_i is a basis of B-spline space mathcalPpk.","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"p = 2\nk = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\nP = BSplineSpace{p}(k)\nplot([t->bsplinebasis₊₀(P,i,t) for i in 1:dim(P)], 0, 10, ylims=(0,1), label=false)\nsavefig(\"bsplinebasisplot.html\") # hide\nnothing # hide","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"You can choose the first terms in different ways.","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"beginaligned\nB_(i0k)(t)\n=\nbegincases\n 1quad (k_i t le k_i+1) \n 0quad (textotherwise)\nendcases\nendaligned","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"p = 2\nk = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\nP = BSplineSpace{p}(k)\nplot([t->bsplinebasis₋₀(P,i,t) for i in 1:dim(P)], 0, 10, ylims=(0,1), label=false)\nsavefig(\"bsplinebasisplot2.html\") # hide\nnothing # hide","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"In these cases, each B-spline basis function B_(i2k) is coninuous, so bsplinebasis₊₀ and bsplinebasis₋₀ are equal.","category":"page"},{"location":"math-bsplinebasis/#Support-of-B-spline-basis-function","page":"B-spline basis function","title":"Support of B-spline basis function","text":"","category":"section"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"info: Thm. Support of B-spline basis function\nIf a B-spline spacemathcalPpk is non-degenerate, the support of its basis function is calculated as follows:operatornamesupp(B_(ipk))=k_ik_i+p+1","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"[TODO: fig]","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"bsplinesupport","category":"page"},{"location":"math-bsplinebasis/#BasicBSpline.bsplinesupport","page":"B-spline basis function","title":"BasicBSpline.bsplinesupport","text":"Return the support of i-th B-spline basis function.\n\noperatornamesupp(B_(ipk))=k_ik_i+p+1\n\nExamples\n\njulia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\nKnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\n\njulia> P = BSplineSpace{2}(k)\nBSplineSpace{2, Float64, KnotVector{Float64}}(KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]))\n\njulia> bsplinesupport(P,1)\n0.0..5.5\n\njulia> bsplinesupport(P,2)\n1.5..8.0\n\n\n\n\n\n","category":"function"},{"location":"math-bsplinebasis/#Partition-of-unity","page":"B-spline basis function","title":"Partition of unity","text":"","category":"section"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"info: Thm. Partition of unity\nLet B_(ipk) be a B-spline basis function, then the following equation is satisfied.beginaligned\nsum_iB_(ipk)(t) = 1 (k_p+1 le t k_l-p) \n0 le B_(ipk)(t) le 1\nendaligned","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"p = 2\nk = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\nP = BSplineSpace{p}(k)\nplot(t->sum(bsplinebasis₊₀(P,i,t) for i in 1:dim(P)), 0, 10, ylims=(0,1.1), label=false)\nsavefig(\"sumofbsplineplot.html\") # hide\nnothing # hide","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"To satisfy the partition of unity on whole interval 18, sometimes more knots will be inserted to the endpoints of the interval.","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"p = 2\nk = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]) + p * KnotVector([0,10])\nP = BSplineSpace{p}(k)\nplot(t->sum(bsplinebasis₊₀(P,i,t) for i in 1:dim(P)), 0, 10, ylims=(0,1.1), label=false)\nsavefig(\"sumofbsplineplot2.html\") # hide\nnothing # hide","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"But, the sum sum_i B_(ipk)(t) is not equal to 1 at t=8. Therefore, to satisfy partition of unity on closed interval k_p+1 k_l-p, the definition of first terms of B-spline basis functions are sometimes replaced:","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"beginaligned\nB_(i0k)(t)\n=\nbegincases\n 1quad (k_i le tk_i+1)\n 1quad (k_i t = k_i+1=k_l)\n 0quad (textotherwise)\nendcases\nendaligned","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"p = 2\nk = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]) + p * KnotVector([0,10])\nP = BSplineSpace{p}(k)\nplot(t->sum(bsplinebasis(P,i,t) for i in 1:dim(P)), 0, 10, ylims=(0,1.1), label=false)\nsavefig(\"sumofbsplineplot3.html\") # hide\nnothing # hide","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"bsplinebasis₊₀","category":"page"},{"location":"math-bsplinebasis/#BasicBSpline.bsplinebasis₊₀","page":"B-spline basis function","title":"BasicBSpline.bsplinebasis₊₀","text":"i-th B-spline basis function. Right-sided limit version.\n\nbeginaligned\nB_(ipk)(t)\n=\nfract-k_ik_i+p-k_iB_(ip-1k)(t)\n+frack_i+p+1-tk_i+p+1-k_i+1B_(i+1p-1k)(t) \nB_(i0k)(t)\n=\nbegincases\n 1quad (k_ile t k_i+1)\n 0quad (textotherwise)\nendcases\nendaligned\n\nExamples\n\njulia> P = BSplineSpace{0}(KnotVector(1:6))\nBSplineSpace{0, Int64, KnotVector{Int64}}(KnotVector([1, 2, 3, 4, 5, 6]))\n\njulia> bsplinebasis₊₀.(P,1:5,(1:6)')\n5×6 Matrix{Float64}:\n 1.0 0.0 0.0 0.0 0.0 0.0\n 0.0 1.0 0.0 0.0 0.0 0.0\n 0.0 0.0 1.0 0.0 0.0 0.0\n 0.0 0.0 0.0 1.0 0.0 0.0\n 0.0 0.0 0.0 0.0 1.0 0.0\n\n\n\n\n\n","category":"function"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"bsplinebasis₋₀","category":"page"},{"location":"math-bsplinebasis/#BasicBSpline.bsplinebasis₋₀","page":"B-spline basis function","title":"BasicBSpline.bsplinebasis₋₀","text":"i-th B-spline basis function. Left-sided limit version.\n\nbeginaligned\nB_(ipk)(t)\n=\nfract-k_ik_i+p-k_iB_(ip-1k)(t)\n+frack_i+p+1-tk_i+p+1-k_i+1B_(i+1p-1k)(t) \nB_(i0k)(t)\n=\nbegincases\n 1quad (k_i tle k_i+1)\n 0quad (textotherwise)\nendcases\nendaligned\n\nExamples\n\njulia> P = BSplineSpace{0}(KnotVector(1:6))\nBSplineSpace{0, Int64, KnotVector{Int64}}(KnotVector([1, 2, 3, 4, 5, 6]))\n\njulia> bsplinebasis₋₀.(P,1:5,(1:6)')\n5×6 Matrix{Float64}:\n 0.0 1.0 0.0 0.0 0.0 0.0\n 0.0 0.0 1.0 0.0 0.0 0.0\n 0.0 0.0 0.0 1.0 0.0 0.0\n 0.0 0.0 0.0 0.0 1.0 0.0\n 0.0 0.0 0.0 0.0 0.0 1.0\n\n\n\n\n\n","category":"function"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"bsplinebasis","category":"page"},{"location":"math-bsplinebasis/#BasicBSpline.bsplinebasis","page":"B-spline basis function","title":"BasicBSpline.bsplinebasis","text":"i-th B-spline basis function. Modified version.\n\nbeginaligned\nB_(ipk)(t)\n=\nfract-k_ik_i+p-k_iB_(ip-1k)(t)\n+frack_i+p+1-tk_i+p+1-k_i+1B_(i+1p-1k)(t) \nB_(i0k)(t)\n=\nbegincases\n 1quad (k_i le tk_i+1)\n 1quad (k_i t = k_i+1=k_l)\n 0quad (textotherwise)\nendcases\nendaligned\n\nExamples\n\njulia> P = BSplineSpace{0}(KnotVector(1:6))\nBSplineSpace{0, Int64, KnotVector{Int64}}(KnotVector([1, 2, 3, 4, 5, 6]))\n\njulia> bsplinebasis.(P,1:5,(1:6)')\n5×6 Matrix{Float64}:\n 1.0 0.0 0.0 0.0 0.0 0.0\n 0.0 1.0 0.0 0.0 0.0 0.0\n 0.0 0.0 1.0 0.0 0.0 0.0\n 0.0 0.0 0.0 1.0 0.0 0.0\n 0.0 0.0 0.0 0.0 1.0 1.0\n\n\n\n\n\n","category":"function"},{"location":"math-bsplinebasis/#B-spline-basis-functions-at-specific-point","page":"B-spline basis function","title":"B-spline basis functions at specific point","text":"","category":"section"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"Sometimes, you may need the non-zero values of B-spline basis functions at specific point. The bsplinebasisall function is much more efficient than evaluating B-spline functions one by one with bsplinebasis function.","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"using BenchmarkTools, BasicBSpline\nP = BSplineSpace{2}(KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]))\nt = 6.3\n(bsplinebasis(P, 2, t), bsplinebasis(P, 3, t), bsplinebasis(P, 4, t))\nbsplinebasisall(P, 2, t)\n@benchmark (bsplinebasis($P, 2, $t), bsplinebasis($P, 3, $t), bsplinebasis($P, 4, $t))\n@benchmark bsplinebasisall($P, 2, $t)","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"intervalindex","category":"page"},{"location":"math-bsplinebasis/#BasicBSpline.intervalindex","page":"B-spline basis function","title":"BasicBSpline.intervalindex","text":"Return an index of a interval in the domain of B-spline space\n\nExamples\n\njulia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]);\n\njulia> P = BSplineSpace{2}(k);\n\njulia> domain(P)\n2.5..9.0\n\njulia> intervalindex(P,2.6)\n1\n\njulia> intervalindex(P,5.6)\n2\n\njulia> intervalindex(P,8.5)\n3\n\njulia> intervalindex(P,9.5)\n3\n\n\n\n\n\n","category":"function"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"bsplinebasisall","category":"page"},{"location":"math-bsplinebasis/#BasicBSpline.bsplinebasisall","page":"B-spline basis function","title":"BasicBSpline.bsplinebasisall","text":"B-spline basis functions at point t on i-th interval.\n\nExamples\n\njulia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\nKnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\n\njulia> p = 2\n2\n\njulia> P = BSplineSpace{p}(k)\nBSplineSpace{2, Float64, KnotVector{Float64}}(KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]))\n\njulia> t = 5.7\n5.7\n\njulia> i = intervalindex(P,t)\n2\n\njulia> bsplinebasisall(P,i,t)\n3-element SVector{3, Float64} with indices SOneTo(3):\n 0.3847272727272727\n 0.6107012987012989\n 0.00457142857142858\n\njulia> bsplinebasis.(P,i:i+p,t)\n3-element Vector{Float64}:\n 0.38472727272727264\n 0.6107012987012989\n 0.00457142857142858\n\n\n\n\n\n","category":"function"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"The next figures illustlates the relation between domain(P), intervalindex(P,t) and bsplinebasisall(P,i,t).","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\n\nfor p in 1:3\n P = BSplineSpace{p}(k)\n plot(P, legend=:topleft, label=\"B-spline basis (p=1)\")\n plot!(t->intervalindex(P,t),0,10, label=\"Interval index\")\n plot!(t->sum(bsplinebasis(P,i,t) for i in 1:dim(P)),0,10, label=\"Sum of B-spline basis\")\n scatter!(k.vector,zero(k.vector), label=\"knot vector\")\n plot!([t->bsplinebasisall(P,1,t)[i] for i in 1:p+1],0,10, color=:black, label=\"bsplinebasisall (i=1)\", ylim=(-1,8-2p))\n savefig(\"bsplinebasisall-$(p).html\") # hide\n nothing # hide\nend","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"","category":"page"},{"location":"math-bsplinebasis/#Uniform-B-spline-basis-and-uniform-distribution","page":"B-spline basis function","title":"Uniform B-spline basis and uniform distribution","text":"","category":"section"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"Let X_1 dots X_n be i.i.d. random variables with X_i sim U(01), then the probability density function of X_1+cdots+X_n can be obtained via BasicBSpline.uniform_bsplinebasis_kernel(Val(n-1),t).","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"N = 100000\n# polynomial degree 0\nplot1 = histogram([rand() for _ in 1:N], normalize=true, label=false)\nplot!(t->BasicBSpline.uniform_bsplinebasis_kernel(Val(0),t), label=false)\n# polynomial degree 1\nplot2 = histogram([rand()+rand() for _ in 1:N], normalize=true, label=false)\nplot!(t->BasicBSpline.uniform_bsplinebasis_kernel(Val(1),t), label=false)\n# polynomial degree 2\nplot3 = histogram([rand()+rand()+rand() for _ in 1:N], normalize=true, label=false)\nplot!(t->BasicBSpline.uniform_bsplinebasis_kernel(Val(2),t), label=false)\n# polynomial degree 3\nplot4 = histogram([rand()+rand()+rand()+rand() for _ in 1:N], normalize=true, label=false)\nplot!(t->BasicBSpline.uniform_bsplinebasis_kernel(Val(3),t), label=false)\n# plot all\nplot(plot1,plot2,plot3,plot4)\nsavefig(\"histogram-uniform.html\") # hide\nnothing # hide","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"","category":"page"},{"location":"math-knotvector/#Knot-vector","page":"Knot vector","title":"Knot vector","text":"","category":"section"},{"location":"math-knotvector/#Definition","page":"Knot vector","title":"Definition","text":"","category":"section"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"tip: Def. Knot vector\nA finite sequencek = (k_1 dots k_l)is called knot vector if the sequence is broad monotonic increase, i.e. k_i le k_i+1.","category":"page"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"[TODO: fig]","category":"page"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"KnotVector","category":"page"},{"location":"math-knotvector/#BasicBSpline.KnotVector","page":"Knot vector","title":"BasicBSpline.KnotVector","text":"Construct knot vector from given array.\n\nk=(k_1dotsk_l)\n\nExamples\n\njulia> k = KnotVector([1,2,3])\nKnotVector([1, 2, 3])\n\njulia> k = KnotVector(1:3)\nKnotVector([1, 2, 3])\n\n\n\n\n\n","category":"type"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"UniformKnotVector","category":"page"},{"location":"math-knotvector/#BasicBSpline.UniformKnotVector","page":"Knot vector","title":"BasicBSpline.UniformKnotVector","text":"Construct uniform knot vector from given range.\n\nk=(k_1dotsk_l)\n\nExamples\n\njulia> k = UniformKnotVector(1:8)\nUniformKnotVector(1:8)\n\njulia> UniformKnotVector(8:-1:3)\nUniformKnotVector(3:1:8)\n\n\n\n\n\n","category":"type"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"EmptyKnotVector","category":"page"},{"location":"math-knotvector/#BasicBSpline.EmptyKnotVector","page":"Knot vector","title":"BasicBSpline.EmptyKnotVector","text":"Knot vector with zero-element.\n\nk=()\n\nThis struct is intended for internal use.\n\nExamples\n\njulia> EmptyKnotVector()\nEmptyKnotVector{Bool}()\n\njulia> EmptyKnotVector{Float64}()\nEmptyKnotVector{Float64}()\n\n\n\n\n\n","category":"type"},{"location":"math-knotvector/#Operations-for-knot-vectors","page":"Knot vector","title":"Operations for knot vectors","text":"","category":"section"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"length(k::AbstractKnotVector)","category":"page"},{"location":"math-knotvector/#Base.length-Tuple{AbstractKnotVector}","page":"Knot vector","title":"Base.length","text":"Length of knot vector\n\nbeginaligned\nk\n=(textnumber of knot elements of k) \nendaligned\n\nFor example, (1223)=4.\n\nExamples\n\njulia> k = KnotVector([1,2,2,3]);\n\njulia> length(k)\n4\n\n\n\n\n\n","category":"method"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"Although a knot vector is not a vector in linear algebra, but we introduce additional operator +.","category":"page"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"Base.:+(k1::KnotVector{T}, k2::KnotVector{T}) where T","category":"page"},{"location":"math-knotvector/#Base.:+-Union{Tuple{T}, Tuple{KnotVector{T}, KnotVector{T}}} where T","page":"Knot vector","title":"Base.:+","text":"Sum of knot vectors\n\nbeginaligned\nk^(1)+k^(2)\n=(k^(1)_1 dots k^(1)_l^(1)) + (k^(2)_1 dots k^(2)_l^(2)) \n=(textsort of union of k^(1) textand k^(2) text)\nendaligned\n\nFor example, (1235)+(458)=(1234558).\n\nExamples\n\njulia> k1 = KnotVector([1,2,3,5]);\n\njulia> k2 = KnotVector([4,5,8]);\n\njulia> k1 + k2\nKnotVector([1, 2, 3, 4, 5, 5, 8])\n\n\n\n\n\n","category":"method"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"Note that the operator +(::KnotVector, ::KnotVector) is commutative. This is why we choose the + sign. We also introduce product operator cdot for knot vector.","category":"page"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"*(m::Integer, k::AbstractKnotVector)","category":"page"},{"location":"math-knotvector/#Base.:*-Tuple{Integer, AbstractKnotVector}","page":"Knot vector","title":"Base.:*","text":"Product of integer and knot vector\n\nbeginaligned\nmcdot k=underbracek+cdots+k_m\nendaligned\n\nFor example, 2cdot (1225)=(11222255).\n\nExamples\n\njulia> k = KnotVector([1,2,2,5]);\n\njulia> 2 * k\nKnotVector([1, 1, 2, 2, 2, 2, 5, 5])\n\n\n\n\n\n","category":"method"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"Inclusive relationship between knot vectors.","category":"page"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"Base.issubset(k::KnotVector, k′::KnotVector)","category":"page"},{"location":"math-knotvector/#Base.issubset-Tuple{KnotVector, KnotVector}","page":"Knot vector","title":"Base.issubset","text":"Check a inclusive relationship ksubseteq k, for example:\n\nbeginaligned\n(12) subseteq (123) \n(122) notsubseteq (123) \n(123) subseteq (123) \nendaligned\n\nExamples\n\njulia> KnotVector([1,2]) ⊆ KnotVector([1,2,3])\ntrue\n\njulia> KnotVector([1,2,2]) ⊆ KnotVector([1,2,3])\nfalse\n\njulia> KnotVector([1,2,3]) ⊆ KnotVector([1,2,3])\ntrue\n\n\n\n\n\n","category":"method"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"unique(k::AbstractKnotVector)","category":"page"},{"location":"math-knotvector/#Base.unique-Tuple{AbstractKnotVector}","page":"Knot vector","title":"Base.unique","text":"Unique elements of knot vector.\n\nbeginaligned\nwidehatk\n=(textunique knot elements of k) \nendaligned\n\nFor example, widehat(1223)=(123).\n\nExamples\n\njulia> k = KnotVector([1,2,2,3]);\n\njulia> unique(k)\nKnotVector([1, 2, 3])\n\n\n\n\n\n","category":"method"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"countknots(k::AbstractKnotVector, t::Real)","category":"page"},{"location":"math-knotvector/#BasicBSpline.countknots-Tuple{AbstractKnotVector, Real}","page":"Knot vector","title":"BasicBSpline.countknots","text":"For given knot vector k, the following function mathfrakn_kmathbbRtomathbbZ represents the number of knots that duplicate the knot vector k.\n\nmathfrakn_k(t) = i mid k_i=t \n\nFor example, if k=(1223), then mathfrakn_k(03)=0, mathfrakn_k(1)=1, mathfrakn_k(2)=2.\n\njulia> k = KnotVector([1,2,2,3]);\n\njulia> countknots(k,0.3)\n0\n\njulia> countknots(k,1.0)\n1\n\njulia> countknots(k,2.0)\n2\n\n\n\n\n\n","category":"method"},{"location":"plots/#Plots.jl","page":"Plots.jl","title":"Plots.jl","text":"","category":"section"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"BasicBSpline.jl has a dependency on RecipesBase.jl. This means, users can easily visalize instances defined in BasicBSpline. In this section, we will provide some plottig examples.","category":"page"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"using BasicBSpline\nusing BasicBSplineFitting\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"plots/#BSplineSpace","page":"Plots.jl","title":"BSplineSpace","text":"","category":"section"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\nP0 = BSplineSpace{0}(k) # 0th degree piecewise polynomial space\nP1 = BSplineSpace{1}(k) # 1st degree piecewise polynomial space\nP2 = BSplineSpace{2}(k) # 2nd degree piecewise polynomial space\nP3 = BSplineSpace{3}(k) # 3rd degree piecewise polynomial space\nplot(\n plot([t->bsplinebasis(P0,i,t) for i in 1:dim(P0)], 0, 10, ylims=(0,1), legend=false, title=\"0th polynomial degree\"),\n plot([t->bsplinebasis(P1,i,t) for i in 1:dim(P1)], 0, 10, ylims=(0,1), legend=false, title=\"1st polynomial degree\"),\n plot([t->bsplinebasis(P2,i,t) for i in 1:dim(P2)], 0, 10, ylims=(0,1), legend=false, title=\"2nd polynomial degree\"),\n plot([t->bsplinebasis(P3,i,t) for i in 1:dim(P3)], 0, 10, ylims=(0,1), legend=false, title=\"3rd polynomial degree\"),\n)\nsavefig(\"plots-bsplinebasis-raw.html\") # hide\nnothing # hide","category":"page"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"","category":"page"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\nP0 = BSplineSpace{0}(k) # 0th degree piecewise polynomial space\nP1 = BSplineSpace{1}(k) # 1st degree piecewise polynomial space\nP2 = BSplineSpace{2}(k) # 2nd degree piecewise polynomial space\nP3 = BSplineSpace{3}(k) # 3rd degree piecewise polynomial space\nplot(\n plot(P0, ylims=(0,1), legend=false, title=\"0th polynomial degree\"),\n plot(P1, ylims=(0,1), legend=false, title=\"1st polynomial degree\"),\n plot(P2, ylims=(0,1), legend=false, title=\"2nd polynomial degree\"),\n plot(P3, ylims=(0,1), legend=false, title=\"3rd polynomial degree\"),\n layout=(2,2),\n)\nsavefig(\"plots-bsplinebasis.html\") # hide\nnothing # hide","category":"page"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"","category":"page"},{"location":"plots/#BSplineDerivativeSpace","page":"Plots.jl","title":"BSplineDerivativeSpace","text":"","category":"section"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\nP = BSplineSpace{3}(k)\nplot(\n plot(BSplineDerivativeSpace{0}(P), label=\"0th derivative\", color=:black),\n plot(BSplineDerivativeSpace{1}(P), label=\"1st derivative\", color=:red),\n plot(BSplineDerivativeSpace{2}(P), label=\"2nd derivative\", color=:green),\n plot(BSplineDerivativeSpace{3}(P), label=\"3rd derivative\", color=:blue),\n)\nsavefig(\"plots-bsplinebasisderivative.html\") # hide\nnothing # hide","category":"page"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"","category":"page"},{"location":"plots/#BSplineManifold","page":"Plots.jl","title":"BSplineManifold","text":"","category":"section"},{"location":"plots/#Cardioid-(planar-curve)","page":"Plots.jl","title":"Cardioid (planar curve)","text":"","category":"section"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"f(t) = SVector((1+cos(t))*cos(t),(1+cos(t))*sin(t))\np = 3\nk = KnotVector(range(0,2π,15)) + p * KnotVector([0,2π]) + 2 * KnotVector([π])\nP = BSplineSpace{p}(k)\na = fittingcontrolpoints(f, P)\nM = BSplineManifold(a, P)\n\nplot(M)\nsavefig(\"plots-cardioid.html\") # hide\nnothing # hide","category":"page"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"","category":"page"},{"location":"plots/#Helix-(spatial-curve)","page":"Plots.jl","title":"Helix (spatial curve)","text":"","category":"section"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"f(t) = SVector(cos(t),sin(t),t)\np = 3\nk = KnotVector(range(0,6π,15)) + p * KnotVector([0,6π])\nP = BSplineSpace{p}(k)\na = fittingcontrolpoints(f, P)\nM = BSplineManifold(a, P)\n\nplot(M)\nsavefig(\"plots-helix.html\") # hide\nnothing # hide","category":"page"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"","category":"page"},{"location":"plots/#B-spline-surface","page":"Plots.jl","title":"B-spline surface","text":"","category":"section"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"p1 = 2\np2 = 3\nk1 = KnotVector(1:10)\nk2 = KnotVector(1:20)\nP1 = BSplineSpace{p1}(k1)\nP2 = BSplineSpace{p2}(k2)\na = [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)]\nM = BSplineManifold(a,(P1,P2))\nplot(M)\n\nsavefig(\"plots-surface.html\") # hide\nnothing # hide","category":"page"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"","category":"page"},{"location":"plots/#RationalBSplineManifold","page":"Plots.jl","title":"RationalBSplineManifold","text":"","category":"section"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"k = KnotVector([0,0,0,1,1,1])\nP = BSplineSpace{2}(k)\na = [SVector(1,0),SVector(1,1),SVector(0,1)]\nw = [1,1/√2,1]\nM = BSplineManifold(a,P)\nR = RationalBSplineManifold(a,w,P)\nts = 0:0.01:2\nplot(cospi.(ts),sinpi.(ts), label=\"circle\")\nplot!(M, label=\"B-spline curve\")\nplot!(R, label=\"Rational B-spline curve\")\n\nsavefig(\"plots-arc.html\") # hide\nnothing # hide","category":"page"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"","category":"page"},{"location":"basicbsplineexporter/#BasicBSplineExporter.jl","page":"BasicBSplineExporter.jl","title":"BasicBSplineExporter.jl","text":"","category":"section"},{"location":"basicbsplineexporter/","page":"BasicBSplineExporter.jl","title":"BasicBSplineExporter.jl","text":"BasicBSplineExporter.jl supports export BasicBSpline.BSplineManifold{Dim,Deg,<:StaticVector} to:","category":"page"},{"location":"basicbsplineexporter/","page":"BasicBSplineExporter.jl","title":"BasicBSplineExporter.jl","text":"PNG image (.png)\nSVG image (.png)\nPOV-Ray mesh (.inc)","category":"page"},{"location":"basicbsplineexporter/#Installation","page":"BasicBSplineExporter.jl","title":"Installation","text":"","category":"section"},{"location":"basicbsplineexporter/","page":"BasicBSplineExporter.jl","title":"BasicBSplineExporter.jl","text":"] add https://github.com/hyrodium/BasicBSplineExporter.jl","category":"page"},{"location":"basicbsplineexporter/#First-example","page":"BasicBSplineExporter.jl","title":"First example","text":"","category":"section"},{"location":"basicbsplineexporter/","page":"BasicBSplineExporter.jl","title":"BasicBSplineExporter.jl","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\n\np = 2 # degree of polynomial\nk1 = KnotVector(1:8) # knot vector\nk2 = KnotVector(rand(7))+(p+1)*KnotVector([1])\nP1 = BSplineSpace{p}(k1) # B-spline space\nP2 = BSplineSpace{p}(k2)\nn1 = dim(P1) # dimension of B-spline space\nn2 = dim(P2)\na = [SVector(2i-6.5+rand(),1.5j-6.5+rand()) for i in 1:dim(P1), j in 1:dim(P2)] # random generated control points\nM = BSplineManifold(a,(P1,P2)) # Define B-spline manifold\nsave_png(\"BasicBSplineExporter_2dim.png\", M) # save image","category":"page"},{"location":"basicbsplineexporter/","page":"BasicBSplineExporter.jl","title":"BasicBSplineExporter.jl","text":"(Image: )","category":"page"},{"location":"basicbsplineexporter/#Other-examples","page":"BasicBSplineExporter.jl","title":"Other examples","text":"","category":"section"},{"location":"basicbsplineexporter/","page":"BasicBSplineExporter.jl","title":"BasicBSplineExporter.jl","text":"Here are some images rendared with POV-Ray.","category":"page"},{"location":"basicbsplineexporter/","page":"BasicBSplineExporter.jl","title":"BasicBSplineExporter.jl","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"basicbsplineexporter/","page":"BasicBSplineExporter.jl","title":"BasicBSplineExporter.jl","text":"See BasicBSplineExporter.jl/test for more examples.","category":"page"},{"location":"math-derivative/#Derivative-of-B-spline","page":"Derivative","title":"Derivative of B-spline","text":"","category":"section"},{"location":"math-derivative/","page":"Derivative","title":"Derivative","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"math-derivative/","page":"Derivative","title":"Derivative","text":"info: Thm. Derivative of B-spline basis function\nThe derivative of B-spline basis function can be expressed as follows:beginaligned\ndotB_(ipk)(t)\n=fracddtB_(ipk)(t) \n=pleft(frac1k_i+p-k_iB_(ip-1k)(t)-frac1k_i+p+1-k_i+1B_(i+1p-1k)(t)right)\nendalignedNote that dotB_(ipk)inmathcalPp-1k.","category":"page"},{"location":"math-derivative/","page":"Derivative","title":"Derivative","text":"k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\nP = BSplineSpace{3}(k)\nplot(\n plot(BSplineDerivativeSpace{0}(P), label=\"0th derivative\", color=:black),\n plot(BSplineDerivativeSpace{1}(P), label=\"1st derivative\", color=:red),\n plot(BSplineDerivativeSpace{2}(P), label=\"2nd derivative\", color=:green),\n plot(BSplineDerivativeSpace{3}(P), label=\"3rd derivative\", color=:blue),\n)\nsavefig(\"bsplinebasisderivativeplot.html\") # hide\nnothing # hide","category":"page"},{"location":"math-derivative/","page":"Derivative","title":"Derivative","text":"","category":"page"},{"location":"math-derivative/","page":"Derivative","title":"Derivative","text":"BSplineDerivativeSpace","category":"page"},{"location":"math-derivative/#BasicBSpline.BSplineDerivativeSpace","page":"Derivative","title":"BasicBSpline.BSplineDerivativeSpace","text":"BSplineDerivativeSpace{r}(P::BSplineSpace)\n\nConstruct derivative of B-spline space from given differential order and B-spline space.\n\nD^r(mathcalPpk)\n=leftt mapsto left fracd^r fdt^r(t) right f in mathcalPpk right\n\nExamples\n\njulia> P = BSplineSpace{2}(KnotVector([1,2,3,4,5,6]))\nBSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([1, 2, 3, 4, 5, 6]))\n\njulia> dP = BSplineDerivativeSpace{1}(P)\nBSplineDerivativeSpace{1, BSplineSpace{2, Int64, KnotVector{Int64}}, Int64}(BSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([1, 2, 3, 4, 5, 6])))\n\njulia> degree(P), degree(dP)\n(2, 1)\n\n\n\n\n\n","category":"type"},{"location":"math-derivative/","page":"Derivative","title":"Derivative","text":"BasicBSpline.derivative","category":"page"},{"location":"math-derivative/#BasicBSpline.derivative","page":"Derivative","title":"BasicBSpline.derivative","text":"derivative(::BSplineDerivativeSpace{r}) -> BSplineDerivativeSpace{r+1}\nderivative(::BSplineSpace) -> BSplineDerivativeSpace{1}\n\nDerivative of B-spline related space.\n\nExamples\n\njulia> BSplineSpace{2}(KnotVector(0:5))\nBSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([0, 1, 2, 3, 4, 5]))\n\njulia> BasicBSpline.derivative(ans)\nBSplineDerivativeSpace{1, BSplineSpace{2, Int64, KnotVector{Int64}}, Int64}(BSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([0, 1, 2, 3, 4, 5])))\n\njulia> BasicBSpline.derivative(ans)\nBSplineDerivativeSpace{2, BSplineSpace{2, Int64, KnotVector{Int64}}, Int64}(BSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([0, 1, 2, 3, 4, 5])))\n\n\n\n\n\n","category":"function"},{"location":"math-derivative/","page":"Derivative","title":"Derivative","text":"bsplinebasis′₊₀","category":"page"},{"location":"math-derivative/#BasicBSpline.bsplinebasis′₊₀","page":"Derivative","title":"BasicBSpline.bsplinebasis′₊₀","text":"bsplinebasis′₊₀(::AbstractFunctionSpace, ::Integer, ::Real) -> Real\n\n1st derivative of B-spline basis function. Right-sided limit version.\n\ndotB_(ipk)(t)\n=pleft(frac1k_i+p-k_iB_(ip-1k)(t)-frac1k_i+p+1-k_i+1B_(i+1p-1k)(t)right)\n\nbsplinebasis′₊₀(P, i, t) is equivalent to bsplinebasis₊₀(derivative(P), i, t).\n\n\n\n\n\n","category":"function"},{"location":"math-derivative/","page":"Derivative","title":"Derivative","text":"bsplinebasis′₋₀","category":"page"},{"location":"math-derivative/#BasicBSpline.bsplinebasis′₋₀","page":"Derivative","title":"BasicBSpline.bsplinebasis′₋₀","text":"bsplinebasis′₋₀(::AbstractFunctionSpace, ::Integer, ::Real) -> Real\n\n1st derivative of B-spline basis function. Left-sided limit version.\n\ndotB_(ipk)(t)\n=pleft(frac1k_i+p-k_iB_(ip-1k)(t)-frac1k_i+p+1-k_i+1B_(i+1p-1k)(t)right)\n\nbsplinebasis′₋₀(P, i, t) is equivalent to bsplinebasis₋₀(derivative(P), i, t).\n\n\n\n\n\n","category":"function"},{"location":"math-derivative/","page":"Derivative","title":"Derivative","text":"bsplinebasis′","category":"page"},{"location":"math-derivative/#BasicBSpline.bsplinebasis′","page":"Derivative","title":"BasicBSpline.bsplinebasis′","text":"bsplinebasis′(::AbstractFunctionSpace, ::Integer, ::Real) -> Real\n\n1st derivative of B-spline basis function. Modified version.\n\ndotB_(ipk)(t)\n=pleft(frac1k_i+p-k_iB_(ip-1k)(t)-frac1k_i+p+1-k_i+1B_(i+1p-1k)(t)right)\n\nbsplinebasis′(P, i, t) is equivalent to bsplinebasis(derivative(P), i, t).\n\n\n\n\n\n","category":"function"},{"location":"plotlyjs/#PlotlyJS.jl","page":"PlotlyJS.jl","title":"PlotlyJS.jl","text":"","category":"section"},{"location":"plotlyjs/#Cardioid","page":"PlotlyJS.jl","title":"Cardioid","text":"","category":"section"},{"location":"plotlyjs/","page":"PlotlyJS.jl","title":"PlotlyJS.jl","text":"using BasicBSpline\nusing BasicBSplineFitting\nusing StaticArrays\nusing PlotlyJS\nf(t) = SVector((1+cos(t))*cos(t),(1+cos(t))*sin(t))\np = 3\nk = KnotVector(range(0,2π,15)) + p * KnotVector([0,2π]) + 2 * KnotVector([π])\nP = BSplineSpace{p}(k)\na = fittingcontrolpoints(f, P)\nM = BSplineManifold(a, P)\n\nts = range(0,2π,250)\nxs_a = getindex.(a,1)\nys_a = getindex.(a,2)\nxs_f = getindex.(M.(ts),1)\nys_f = getindex.(M.(ts),2)\nfig = Plot(scatter(x=xs_a, y=ys_a, name=\"control points\", line_color=\"blue\", marker_size=8))\naddtraces!(fig, scatter(x=xs_f, y=ys_f, name=\"B-spline curve\", mode=\"lines\", line_color=\"red\"))\nrelayout!(fig, width=500, height=500)\nsavefig(fig,\"cardioid.html\") # hide\nnothing # hide","category":"page"},{"location":"plotlyjs/","page":"PlotlyJS.jl","title":"PlotlyJS.jl","text":"","category":"page"},{"location":"plotlyjs/#Helix","page":"PlotlyJS.jl","title":"Helix","text":"","category":"section"},{"location":"plotlyjs/","page":"PlotlyJS.jl","title":"PlotlyJS.jl","text":"using BasicBSpline\nusing BasicBSplineFitting\nusing StaticArrays\nusing PlotlyJS\nf(t) = SVector(cos(t),sin(t),t)\np = 3\nk = KnotVector(range(0,6π,15)) + p * KnotVector([0,6π])\nP = BSplineSpace{p}(k)\na = fittingcontrolpoints(f, P)\nM = BSplineManifold(a, P)\n\nts = range(0,6π,250)\nxs_a = getindex.(a,1)\nys_a = getindex.(a,2)\nzs_a = getindex.(a,3)\nxs_f = getindex.(M.(ts),1)\nys_f = getindex.(M.(ts),2)\nzs_f = getindex.(M.(ts),3)\nfig = Plot(scatter3d(x=xs_a, y=ys_a, z=zs_a, name=\"control points\", line_color=\"blue\", marker_size=8))\naddtraces!(fig, scatter3d(x=xs_f, y=ys_f, z=zs_f, name=\"B-spline curve\", mode=\"lines\", line_color=\"red\"))\nrelayout!(fig, width=500, height=500)\nsavefig(fig,\"helix.html\") # hide\nnothing # hide","category":"page"},{"location":"plotlyjs/","page":"PlotlyJS.jl","title":"PlotlyJS.jl","text":"","category":"page"},{"location":"internal/#Private-API","page":"Private API","title":"Private API","text":"","category":"section"},{"location":"internal/","page":"Private API","title":"Private API","text":"Note that the following methods are considered private methods, and changes in their behavior are not considered breaking changes.","category":"page"},{"location":"internal/","page":"Private API","title":"Private API","text":"BasicBSpline.r_nomial","category":"page"},{"location":"internal/#BasicBSpline.r_nomial","page":"Private API","title":"BasicBSpline.r_nomial","text":"Calculate r-nomial coefficient\n\nr_nomial(n, k, r)\n\n(1+x+cdots+x^r)^n = sum_k a_nkr x^k\n\n\n\n\n\n","category":"function"},{"location":"internal/","page":"Private API","title":"Private API","text":"BasicBSpline._vec","category":"page"},{"location":"internal/#BasicBSpline._vec","page":"Private API","title":"BasicBSpline._vec","text":"Convert AbstractKnotVector to AbstractVector\n\n\n\n\n\n","category":"function"},{"location":"internal/","page":"Private API","title":"Private API","text":"BasicBSpline._lower_R","category":"page"},{"location":"internal/#BasicBSpline._lower_R","page":"Private API","title":"BasicBSpline._lower_R","text":"Internal methods for obtaining a B-spline space with one degree lower.\n\nbeginaligned\nmathcalPpk mapsto mathcalPp-1k \nD^rmathcalPpk mapsto D^r-1mathcalPp-1k\nendaligned\n\n\n\n\n\n","category":"function"},{"location":"internal/","page":"Private API","title":"Private API","text":"BasicBSpline._changebasis_R","category":"page"},{"location":"internal/","page":"Private API","title":"Private API","text":"BasicBSpline._changebasis_I","category":"page"},{"location":"internal/","page":"Private API","title":"Private API","text":"BasicBSpline._changebasis_sim","category":"page"},{"location":"internal/#BasicBSpline._changebasis_sim","page":"Private API","title":"BasicBSpline._changebasis_sim","text":"Return a coefficient matrix A which satisfy\n\nB_(ip_1k_1) = sum_jA_ijB_(jp_2k_2)\n\nAssumption:\n\nP_1 P_2\n\n\n\n\n\n","category":"function"},{"location":"internal/","page":"Private API","title":"Private API","text":"BasicBSplineFitting.innerproduct_R","category":"page"},{"location":"internal/#BasicBSplineFitting.innerproduct_R","page":"Private API","title":"BasicBSplineFitting.innerproduct_R","text":"Calculate a matrix\n\nA_ij=int_mathbbR B_(ipk)(t) B_(jpk)(t) dt\n\n\n\n\n\n","category":"function"},{"location":"internal/","page":"Private API","title":"Private API","text":"BasicBSplineFitting.innerproduct_I","category":"page"},{"location":"internal/#BasicBSplineFitting.innerproduct_I","page":"Private API","title":"BasicBSplineFitting.innerproduct_I","text":"Calculate a matrix\n\nA_ij=int_I B_(ipk)(t) B_(jpk)(t) dt\n\n\n\n\n\n","category":"function"},{"location":"math-inclusive/#Inclusive-relation-between-B-spline-spaces","page":"Inclusive relationship","title":"Inclusive relation between B-spline spaces","text":"","category":"section"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"info: Thm. Inclusive relation between B-spline spaces\nFor non-degenerate B-spline spaces, the following relationship holds.mathcalPpk\nsubseteq mathcalPpk\nLeftrightarrow (m=p-p ge 0 textand k+mwidehatksubseteq k)","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"Base.issubset(P::BSplineSpace{p}, P′::BSplineSpace{p′}) where {p, p′}","category":"page"},{"location":"math-inclusive/#Base.issubset-Union{Tuple{p′}, Tuple{p}, Tuple{BSplineSpace{p, T} where T<:Real, BSplineSpace{p′, T} where T<:Real}} where {p, p′}","page":"Inclusive relationship","title":"Base.issubset","text":"Check inclusive relationship between B-spline spaces.\n\nmathcalPpk\nsubseteqmathcalPpk\n\nExamples\n\njulia> P1 = BSplineSpace{1}(KnotVector([1,3,5,8]));\n\njulia> P2 = BSplineSpace{1}(KnotVector([1,3,5,6,8,9]));\n\njulia> P3 = BSplineSpace{2}(KnotVector([1,1,3,3,5,5,8,8]));\n\njulia> P1 ⊆ P2\ntrue\n\njulia> P1 ⊆ P3\ntrue\n\njulia> P2 ⊆ P3\nfalse\n\njulia> P2 ⊈ P3\ntrue\n\n\n\n\n\n","category":"method"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"Here are plots of the B-spline basis functions of the spaces P1, P2, P3.","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"P1 = BSplineSpace{1}(KnotVector([1,3,5,8]))\nP2 = BSplineSpace{1}(KnotVector([1,3,5,6,8,9]))\nP3 = BSplineSpace{2}(KnotVector([1,1,3,3,5,5,8,8]))\nplot(\n plot([t->bsplinebasis₊₀(P1,i,t) for i in 1:dim(P1)], 1, 9, ylims=(0,1), legend=false),\n plot([t->bsplinebasis₊₀(P2,i,t) for i in 1:dim(P2)], 1, 9, ylims=(0,1), legend=false),\n plot([t->bsplinebasis₊₀(P3,i,t) for i in 1:dim(P3)], 1, 9, ylims=(0,1), legend=false),\n layout=(3,1),\n link=:x\n)\nsavefig(\"subbsplineplot.html\") # hide\nnothing # hide","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"This means, there exists a n times n matrix A which holds:","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"beginaligned\nB_(ipk)\n=sum_jA_ij B_(jpk) \nn=dim(mathcalPpk) \nn=dim(mathcalPpk)\nendaligned","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"You can calculate the change of basis matrix A with changebasis.","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"A12 = changebasis(P1,P2)\nA13 = changebasis(P1,P3)","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"plot(\n plot([t->bsplinebasis₊₀(P1,i,t) for i in 1:dim(P1)], 1, 9, ylims=(0,1), legend=false),\n plot([t->sum(A12[i,j]*bsplinebasis₊₀(P2,j,t) for j in 1:dim(P2)) for i in 1:dim(P1)], 1, 9, ylims=(0,1), legend=false),\n plot([t->sum(A13[i,j]*bsplinebasis₊₀(P3,j,t) for j in 1:dim(P3)) for i in 1:dim(P1)], 1, 9, ylims=(0,1), legend=false),\n layout=(3,1),\n link=:x\n)\nsavefig(\"subbsplineplot2.html\") # hide\nnothing # hide","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"issqsubset","category":"page"},{"location":"math-inclusive/#BasicBSpline.issqsubset","page":"Inclusive relationship","title":"BasicBSpline.issqsubset","text":"Check inclusive relationship between B-spline spaces.\n\nmathcalPpk\nsqsubseteqmathcalPpk\nLeftrightarrow\nmathcalPpk_k_p+1k_l-p\nsubseteqmathcalPpk_k_p+1k_l-p\n\n\n\n\n\n","category":"function"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"expandspace","category":"page"},{"location":"math-inclusive/#BasicBSpline.expandspace","page":"Inclusive relationship","title":"BasicBSpline.expandspace","text":"Expand B-spline space with given additional degree and knotvector. The behavior of expandspace is same as expandspace_I.\n\n\n\n\n\n","category":"function"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"expandspace_R","category":"page"},{"location":"math-inclusive/#BasicBSpline.expandspace_R","page":"Inclusive relationship","title":"BasicBSpline.expandspace_R","text":"Expand B-spline space with given additional degree and knotvector. This function is compatible with issubset (⊆).\n\nExamples\n\njulia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]);\n\njulia> P = BSplineSpace{2}(k);\n\njulia> P′ = expandspace_R(P, Val(1), KnotVector([6.0]))\nBSplineSpace{3, Float64, KnotVector{Float64}}(KnotVector([0.0, 0.0, 1.5, 1.5, 2.5, 2.5, 5.5, 5.5, 6.0, 8.0, 8.0, 9.0, 9.0, 9.5, 9.5, 10.0, 10.0]))\n\njulia> P ⊆ P′\ntrue\n\njulia> P ⊑ P′\nfalse\n\njulia> domain(P)\n2.5..9.0\n\njulia> domain(P′)\n1.5..9.5\n\n\n\n\n\n","category":"function"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"expandspace_I","category":"page"},{"location":"math-inclusive/#BasicBSpline.expandspace_I","page":"Inclusive relationship","title":"BasicBSpline.expandspace_I","text":"Expand B-spline space with given additional degree and knotvector. This function is compatible with issqsubset (⊑)\n\nExamples\n\njulia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]);\n\njulia> P = BSplineSpace{2}(k);\n\njulia> P′ = expandspace_I(P, Val(1), KnotVector([6.0]))\nBSplineSpace{3, Float64, KnotVector{Float64}}(KnotVector([0.0, 1.5, 2.5, 2.5, 5.5, 5.5, 6.0, 8.0, 8.0, 9.0, 9.0, 9.5, 10.0]))\n\njulia> P ⊆ P′\nfalse\n\njulia> P ⊑ P′\ntrue\n\njulia> domain(P)\n2.5..9.0\n\njulia> domain(P′)\n2.5..9.0\n\n\n\n\n\n","category":"function"},{"location":"math/#Mathematical-properties-of-B-spline","page":"Introduction","title":"Mathematical properties of B-spline","text":"","category":"section"},{"location":"math/#Introduction","page":"Introduction","title":"Introduction","text":"","category":"section"},{"location":"math/","page":"Introduction","title":"Introduction","text":"B-spline is a mathematical object, and it has a lot of application. (e.g. Geometric representation: NURBS, Interpolation, Numerical analysis: IGA)","category":"page"},{"location":"math/","page":"Introduction","title":"Introduction","text":"In this page, we'll explain the mathematical definitions and properties of B-spline with Julia code. Before running the code in the following section, you need to import packages:","category":"page"},{"location":"math/","page":"Introduction","title":"Introduction","text":"using BasicBSpline\nusing Plots; plotly()","category":"page"},{"location":"math/#Notice","page":"Introduction","title":"Notice","text":"","category":"section"},{"location":"math/","page":"Introduction","title":"Introduction","text":"Some of notations in this page are our original, but these are well-considered results.","category":"page"},{"location":"math/#References","page":"Introduction","title":"References","text":"","category":"section"},{"location":"math/","page":"Introduction","title":"Introduction","text":"Most of this documentation around B-spline is self-contained. If you want to learn more, the following resources are recommended.","category":"page"},{"location":"math/","page":"Introduction","title":"Introduction","text":"\"Geometric Modeling with Splines\" by Elaine Cohen, Richard F. Riesenfeld, Gershon Elber\n\"Spline Functions: Basic Theory\" by Larry Schumaker","category":"page"},{"location":"math/","page":"Introduction","title":"Introduction","text":"日本語の文献では以下がおすすめです。","category":"page"},{"location":"math/","page":"Introduction","title":"Introduction","text":"スプライン関数とその応用 by 市田浩三, 吉本富士市\nNURBS多様体による形状表現\nBasicBSpline.jlを作ったので宣伝です!\nB-spline入門(線形代数がすこし分かる人向け)","category":"page"},{"location":"math-bsplinemanifold/#B-spline-manifold","page":"B-spline manifold","title":"B-spline manifold","text":"","category":"section"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"math-bsplinemanifold/#Multi-dimensional-B-spline","page":"B-spline manifold","title":"Multi-dimensional B-spline","text":"","category":"section"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"info: Thm. Basis of tensor product of B-spline spaces\nThe tensor product of B-spline spaces mathcalPp^1k^1otimesmathcalPp^2k^2 is a linear space with the following basis.mathcalPp^1k^1otimesmathcalPp^2k^2\n= operatorname*span_ij (B_(ip^1k^1) otimes B_(jp^2k^2))where the basis are defined as(B_(ip^1k^1) otimes B_(jp^2k^2))(t^1 t^2)\n= B_(ip^1k^1)(t^1) cdot B_(jp^2k^2)(t^2)","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"Higher dimensional tensor products mathcalPp^1k^1otimescdotsotimesmathcalPp^dk^d are defined similarly.","category":"page"},{"location":"math-bsplinemanifold/#B-spline-manifold-2","page":"B-spline manifold","title":"B-spline manifold","text":"","category":"section"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"B-spline manifold is a parametric representation of a shape.","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"tip: Def. B-spline manifold\nFor given d-dimensional B-spline basis functions B_(i^1p^1k^1) otimes cdots otimes B_(i^dp^dk^d) and given points bma_i^1 dots i^d in V, B-spline manifold is defined by the following equality:bmp(t^1dotst^dbma_i^1 dots i^d)\n=sum_i^1dotsi^d(B_(i^1p^1k^1) otimes cdots otimes B_(i^dp^dk^d))(t^1dotst^d) bma_i^1 dots i^dWhere bma_i^1 dots i^d are called control points.","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"We will also write bmp(t^1dotst^d bma), bmp(t^1dotst^d), bmp(t bma) or bmp(t) for simplicity.","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"Note that the BSplineManifold objects are callable, and the arguments will be checked if it fits in the domain of BSplineSpace.","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"BSplineManifold","category":"page"},{"location":"math-bsplinemanifold/#BasicBSpline.BSplineManifold","page":"B-spline manifold","title":"BasicBSpline.BSplineManifold","text":"Construct B-spline manifold from given control points and B-spline spaces.\n\nExamples\n\njulia> using StaticArrays\n\njulia> P = BSplineSpace{2}(KnotVector([0,0,0,1,1,1]))\nBSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([0, 0, 0, 1, 1, 1]))\n\njulia> a = [SVector(1,0), SVector(1,1), SVector(0,1)]\n3-element Vector{SVector{2, Int64}}:\n [1, 0]\n [1, 1]\n [0, 1]\n\njulia> M = BSplineManifold(a, P);\n\njulia> M(0.4)\n2-element SVector{2, Float64} with indices SOneTo(2):\n 0.84\n 0.64\n\njulia> M(1.2)\nERROR: DomainError with 1.2:\nThe input 1.2 is out of range.\n\n\n\n\n\n","category":"type"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"If you need extension of BSplineManifold or don't need the arguments check, you can call unbounded_mapping.","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"unbounded_mapping","category":"page"},{"location":"math-bsplinemanifold/#BasicBSpline.unbounded_mapping","page":"B-spline manifold","title":"BasicBSpline.unbounded_mapping","text":"unbounded_mapping(M::BSplineManifold{Dim}, t::Vararg{Real,Dim})\n\nExamples\n\njulia> P = BSplineSpace{1}(KnotVector([0,0,1,1]))\nBSplineSpace{1, Int64, KnotVector{Int64}}(KnotVector([0, 0, 1, 1]))\n\njulia> domain(P)\n0..1\n\njulia> M = BSplineManifold([0,1], P);\n\njulia> unbounded_mapping(M, 0.1)\n0.1\n\njulia> M(0.1)\n0.1\n\njulia> unbounded_mapping(M, 1.2)\n1.2\n\njulia> M(1.2)\nERROR: DomainError with 1.2:\nThe input 1.2 is out of range.\n\n\n\n\n\n","category":"function"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"unbounded_mapping(M,t...) is a little bit faster than M(t...) because it does not check the domain.","category":"page"},{"location":"math-bsplinemanifold/#B-spline-curve","page":"B-spline manifold","title":"B-spline curve","text":"","category":"section"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"## 1-dim B-spline manifold\np = 2 # degree of polynomial\nk = KnotVector(1:12) # knot vector\nP = BSplineSpace{p}(k) # B-spline space\na = [SVector(i-5, 3*sin(i^2)) for i in 1:dim(P)] # control points\nM = BSplineManifold(a, P) # Define B-spline manifold\nplot(M)\nsavefig(\"1dim-manifold.html\") # hide\nnothing # hide","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"","category":"page"},{"location":"math-bsplinemanifold/#B-spline-surface","page":"B-spline manifold","title":"B-spline surface","text":"","category":"section"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"## 2-dim B-spline manifold\np = 2 # degree of polynomial\nk = KnotVector(1:8) # knot vector\nP = BSplineSpace{p}(k) # B-spline space\nrand_a = [SVector(rand(), rand(), rand()) for i in 1:dim(P), j in 1:dim(P)]\na = [SVector(2*i-6.5, 2*j-6.5, 0) for i in 1:dim(P), j in 1:dim(P)] + rand_a # random generated control points\nM = BSplineManifold(a,(P,P)) # Define B-spline manifold\nplot(M)\nsavefig(\"2dim-manifold.html\") # hide\nnothing # hide","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"","category":"page"},{"location":"math-bsplinemanifold/#Affine-commutativity","page":"B-spline manifold","title":"Affine commutativity","text":"","category":"section"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"info: Thm. Affine commutativity\nLet T be a affine transform V to W, then the following equality holds.T(bmp(t bma))\n=bmp(t T(bma))","category":"page"},{"location":"math-bsplinemanifold/#Fixing-arguments-(currying)","page":"B-spline manifold","title":"Fixing arguments (currying)","text":"","category":"section"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"Just like fixing first index such as A[3,:]::Array{1} for matrix A::Array{2}, fixing first argument M(4.3,:) will create BSplineManifold{1} for B-spline surface M::BSplineManifold{2}.","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"p = 2;\nk = KnotVector(1:8);\nP = BSplineSpace{p}(k);\na = [SVector(5i+5j+rand(), 5i-5j+rand(), rand()) for i in 1:dim(P), j in 1:dim(P)];\nM = BSplineManifold(a,(P,P));\nM isa BSplineManifold{2}\nM(:,:) isa BSplineManifold{2}\nM(4.3,:) isa BSplineManifold{1} # Fix first argument","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"plot(M)\nplot!(M(4.3,:), linewidth = 5, color=:cyan)\nplot!(M(4.4,:), linewidth = 5, color=:red)\nplot!(M(:,5.2), linewidth = 5, color=:green)\nsavefig(\"2dim-manifold-currying.html\") # hide\nnothing # hide","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"","category":"page"},{"location":"math-bsplinespace/#B-spline-space","page":"B-spline space","title":"B-spline space","text":"","category":"section"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"math-bsplinespace/#Defnition","page":"B-spline space","title":"Defnition","text":"","category":"section"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"Before defining B-spline space, we'll define polynomial space with degree p.","category":"page"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"tip: Def. Polynomial space\nPolynomial space with degree p.mathcalPp\n=leftfmathbbRtomathbbR tmapsto a_0+a_1t^1+cdots+a_pt^p left \n a_iin mathbbR\n right\nrightThis space mathcalPp is a (p+1)-dimensional linear space.","category":"page"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"Note that tmapsto t^i_0 le i le p is a basis of mathcalPp, and also the set of Bernstein polynomial B_(ip)_i is a basis of mathcalPp.","category":"page"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"beginaligned\nB_(ip)(t)\n=binompi-1t^i-1(1-t)^p-i+1\n(i=1 dots p+1)\nendaligned","category":"page"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"Where binompi-1 is a binomial coefficient. You can try Bernstein polynomial on desmos graphing calculator!","category":"page"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"tip: Def. B-spline space\nFor given polynomial degree pge 0 and knot vector k=(k_1dotsk_l), B-spline space mathcalPpk is defined as follows:mathcalPpk\n=leftfmathbbRtomathbbR left \n begingathered\n operatornamesupp(f)subseteq k_1 k_l \n exists tildefinmathcalPp f_k_i k_i+1) = tildef_k_i k_i+1) \n forall t in mathbbR exists delta 0 f_(t-deltat+delta)in C^p-mathfrakn_k(t)\n endgathered right\nright","category":"page"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"Note that each element of the space mathcalPpk is a piecewise polynomial.","category":"page"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"[TODO: fig]","category":"page"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"BSplineSpace","category":"page"},{"location":"math-bsplinespace/#BasicBSpline.BSplineSpace","page":"B-spline space","title":"BasicBSpline.BSplineSpace","text":"Construct B-spline space from given polynominal degree and knot vector.\n\nmathcalPpk\n\nExamples\n\njulia> p = 2\n2\n\njulia> k = KnotVector([1,3,5,6,8,9])\nKnotVector([1, 3, 5, 6, 8, 9])\n\njulia> BSplineSpace{p}(k)\nBSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([1, 3, 5, 6, 8, 9]))\n\n\n\n\n\n","category":"type"},{"location":"math-bsplinespace/#Degeneration","page":"B-spline space","title":"Degeneration","text":"","category":"section"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"tip: Def. Degeneration\nA B-spline space is said to be non-degenerate if its degree and knot vector satisfies following property:beginaligned\nk_ik_i+p+1 (1 le i le l-p-1)\nendaligned","category":"page"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"isnondegenerate","category":"page"},{"location":"math-bsplinespace/#BasicBSpline.isnondegenerate","page":"B-spline space","title":"BasicBSpline.isnondegenerate","text":"Check if given B-spline space is non-degenerate.\n\nExamples\n\njulia> isnondegenerate(BSplineSpace{2}(KnotVector([1,3,5,6,8,9])))\ntrue\n\njulia> isnondegenerate(BSplineSpace{1}(KnotVector([1,3,3,3,8,9])))\nfalse\n\n\n\n\n\n","category":"function"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"isdegenerate(P::BSplineSpace)","category":"page"},{"location":"math-bsplinespace/#BasicBSpline.isdegenerate-Tuple{BSplineSpace}","page":"B-spline space","title":"BasicBSpline.isdegenerate","text":"Check if given B-spline space is degenerate.\n\nExamples\n\njulia> isdegenerate(BSplineSpace{2}(KnotVector([1,3,5,6,8,9])))\nfalse\n\njulia> isdegenerate(BSplineSpace{1}(KnotVector([1,3,3,3,8,9])))\ntrue\n\n\n\n\n\n","category":"method"},{"location":"math-bsplinespace/#Dimensions","page":"B-spline space","title":"Dimensions","text":"","category":"section"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"info: Thm. Dimension of B-spline space\nThe B-spline space is a linear space, and if a B-spline space is non-degenerate, its dimension is calculated by:dim(mathcalPpk)= k - p -1","category":"page"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"dim","category":"page"},{"location":"math-bsplinespace/#BasicBSpline.dim","page":"B-spline space","title":"BasicBSpline.dim","text":"Return dimention of a B-spline space.\n\ndim(mathcalPpk)\n= k - p -1\n\nExamples\n\njulia> dim(BSplineSpace{1}(KnotVector([1,2,3,4,5,6,7])))\n5\n\njulia> dim(BSplineSpace{1}(KnotVector([1,2,4,4,4,6,7])))\n5\n\njulia> dim(BSplineSpace{1}(KnotVector([1,2,3,5,5,5,7])))\n5\n\n\n\n\n\n","category":"function"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"exactdim_R(P::BSplineSpace)","category":"page"},{"location":"math-bsplinespace/#BasicBSpline.exactdim_R-Tuple{BSplineSpace}","page":"B-spline space","title":"BasicBSpline.exactdim_R","text":"Exact dimension of a B-spline space.\n\nExamples\n\njulia> exactdim_R(BSplineSpace{1}(KnotVector([1,2,3,4,5,6,7])))\n5\n\njulia> exactdim_R(BSplineSpace{1}(KnotVector([1,2,4,4,4,6,7])))\n4\n\njulia> exactdim_R(BSplineSpace{1}(KnotVector([1,2,3,5,5,5,7])))\n4\n\n\n\n\n\n","category":"method"},{"location":"math-rationalbsplinemanifold/#Rational-B-spline-manifold","page":"Rational B-spline manifold","title":"Rational B-spline manifold","text":"","category":"section"},{"location":"math-rationalbsplinemanifold/","page":"Rational B-spline manifold","title":"Rational B-spline manifold","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"math-rationalbsplinemanifold/","page":"Rational B-spline manifold","title":"Rational B-spline manifold","text":"Non-uniform rational basis spline (NURBS) is also supported in BasicBSpline.jl package.","category":"page"},{"location":"math-rationalbsplinemanifold/#Rational-B-spline-manifold-2","page":"Rational B-spline manifold","title":"Rational B-spline manifold","text":"","category":"section"},{"location":"math-rationalbsplinemanifold/","page":"Rational B-spline manifold","title":"Rational B-spline manifold","text":"Rational B-spline manifold is a parametric representation of a shape.","category":"page"},{"location":"math-rationalbsplinemanifold/","page":"Rational B-spline manifold","title":"Rational B-spline manifold","text":"tip: Def. Rational B-spline manifold\nFor given d-dimensional B-spline basis functions B_(i^1p^1k^1) otimes cdots otimes B_(i^dp^dk^d), given points bma_i^1 dots i^d in V and real numbers w_i^1 dots i^d 0, rational B-spline manifold is defined by the following equality:bmp(t^1dotst^d bma_i^1 dots i^d w_i^1 dots i^d)\n=sum_i^1dotsi^d\nfrac(B_(i^1p^1k^1) otimes cdots otimes B_(i^dp^dk^d))(t^1dotst^d) w_i^1 dots i^d\nsumlimits_j^1dotsj^d(B_(j^1p^1k^1) otimes cdots otimes B_(j^dp^dk^d))(t^1dotst^d) w_j^1 dots j^d\nbma_i^1 dots i^dWhere bma_i^1dotsi^d are called control points, and w_i^1 dots i^d are called weights.","category":"page"},{"location":"math-rationalbsplinemanifold/","page":"Rational B-spline manifold","title":"Rational B-spline manifold","text":"RationalBSplineManifold","category":"page"},{"location":"math-rationalbsplinemanifold/#BasicBSpline.RationalBSplineManifold","page":"Rational B-spline manifold","title":"BasicBSpline.RationalBSplineManifold","text":"Construct Rational B-spline manifold from given control points, weights and B-spline spaces.\n\nExamples\n\njulia> using StaticArrays, LinearAlgebra\n\njulia> P = BSplineSpace{2}(KnotVector([0,0,0,1,1,1]))\nBSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([0, 0, 0, 1, 1, 1]))\n\njulia> w = [1, 1/√2, 1]\n3-element Vector{Float64}:\n 1.0\n 0.7071067811865475\n 1.0\n\njulia> a = [SVector(1,0), SVector(1,1), SVector(0,1)]\n3-element Vector{SVector{2, Int64}}:\n [1, 0]\n [1, 1]\n [0, 1]\n\njulia> M = RationalBSplineManifold(a,w,P); # 1/4 arc\n\njulia> M(0.3)\n2-element SVector{2, Float64} with indices SOneTo(2):\n 0.8973756499953727\n 0.4412674277525845\n\njulia> norm(M(0.3))\n1.0\n\n\n\n\n\n","category":"type"},{"location":"math-rationalbsplinemanifold/#Properties","page":"Rational B-spline manifold","title":"Properties","text":"","category":"section"},{"location":"math-rationalbsplinemanifold/","page":"Rational B-spline manifold","title":"Rational B-spline manifold","text":"Similar to BSplineManifold, RationalBSplineManifold supports the following methods and properties.","category":"page"},{"location":"math-rationalbsplinemanifold/","page":"Rational B-spline manifold","title":"Rational B-spline manifold","text":"currying\nrefinement\nAffine commutativity","category":"page"},{"location":"geometricmodeling/#Geometric-modeling","page":"Geometric modeling","title":"Geometric modeling","text":"","category":"section"},{"location":"geometricmodeling/#Load-packages","page":"Geometric modeling","title":"Load packages","text":"","category":"section"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"using BasicBSpline\nusing StaticArrays\nusing Plots\nusing LinearAlgebra\nplotly()","category":"page"},{"location":"geometricmodeling/#Arc","page":"Geometric modeling","title":"Arc","text":"","category":"section"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"p = 2\nk = KnotVector([0,0,0,1,1,1])\nP = BSplineSpace{p}(k)\nt = 1 # angle in radians\na = [SVector(1,0), SVector(1,tan(t/2)), SVector(cos(t),sin(t))]\nw = [1,cos(t/2),1]\nM = RationalBSplineManifold(a,w,P)\nplot(M, xlims=(0,1.1), ylims=(0,1.1), aspectratio=1)\nsavefig(\"geometricmodeling-arc.html\") # hide\nnothing # hide","category":"page"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"","category":"page"},{"location":"geometricmodeling/#Circle","page":"Geometric modeling","title":"Circle","text":"","category":"section"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"p = 2\nk = KnotVector([0,0,0,1,1,2,2,3,3,4,4,4])\nP = BSplineSpace{p}(k)\na = [\n SVector( 1, 0),\n SVector( 1, 1),\n SVector( 0, 1),\n SVector(-1, 1),\n SVector(-1, 0),\n SVector(-1,-1),\n SVector( 0,-1),\n SVector( 1,-1),\n SVector( 1, 0)\n]\nw = [1,1/√2,1,1/√2,1,1/√2,1,1/√2,1]\nM = RationalBSplineManifold(a,w,P)\nplot(M, xlims=(-1.2,1.2), ylims=(-1.2,1.2), aspectratio=1)\nsavefig(\"geometricmodeling-circle.html\") # hide\nnothing # hide","category":"page"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"","category":"page"},{"location":"geometricmodeling/#Torus","page":"Geometric modeling","title":"Torus","text":"","category":"section"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"R = 3\nr = 1\n\na0 = [\n SVector( 1, 0, 0),\n SVector( 1, 1, 0),\n SVector( 0, 1, 0),\n SVector(-1, 1, 0),\n SVector(-1, 0, 0),\n SVector(-1,-1, 0),\n SVector( 0,-1, 0),\n SVector( 1,-1, 0),\n SVector( 1, 0, 0)\n]\n\na1 = (R+r)*a0\na5 = (R-r)*a0\na2 = [p+r*SVector(0,0,1) for p in a1]\na3 = [p+r*SVector(0,0,1) for p in R*a0]\na4 = [p+r*SVector(0,0,1) for p in a5]\na6 = [p-r*SVector(0,0,1) for p in a5]\na7 = [p-r*SVector(0,0,1) for p in R*a0]\na8 = [p-r*SVector(0,0,1) for p in a1]\na9 = a1\n\na = hcat(a1,a2,a3,a4,a5,a6,a7,a8,a9)\nM = RationalBSplineManifold(a,w*w',P,P)\nplot(M)\nsavefig(\"geometricmodeling-torus.html\") # hide\nnothing # hide","category":"page"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"","category":"page"},{"location":"geometricmodeling/#Paraboloid","page":"Geometric modeling","title":"Paraboloid","text":"","category":"section"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"p = 2\nk = KnotVector([-1,-1,-1,1,1,1])\nP = BSplineSpace{p}(k)\na = [SVector(i,j,2i^2+2j^2-2) for i in -1:1, j in -1:1]\nM = BSplineManifold(a,P,P)\nplot(M)\nsavefig(\"geometricmodeling-paraboloid.html\") # hide\nnothing # hide","category":"page"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"","category":"page"},{"location":"geometricmodeling/#Hyperbolic-paraboloid","page":"Geometric modeling","title":"Hyperbolic paraboloid","text":"","category":"section"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"a = [SVector(i,j,2i^2-2j^2) for i in -1:1, j in -1:1]\nM = BSplineManifold(a,P,P)\nplot(M)\nsavefig(\"geometricmodeling-hyperbolicparaboloid.html\") # hide\nnothing # hide","category":"page"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"","category":"page"},{"location":"#BasicBSpline.jl","page":"Home","title":"BasicBSpline.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Basic (mathematical) operations for B-spline functions and related things with Julia.","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: Stable) (Image: Dev) (Image: Build Status) (Image: Coverage) (Image: Aqua QA) (Image: DOI) (Image: BasicBSpline Downloads).","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: )","category":"page"},{"location":"#Summary","page":"Home","title":"Summary","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"This package provides basic mathematical operations for B-spline.","category":"page"},{"location":"","page":"Home","title":"Home","text":"B-spline basis function\nSome operations for knot vector\nSome operations for B-spline space (piecewise polynomial space)\nB-spline manifold (includes curve, surface and solid)\nRefinement algorithm for B-spline manifold\nFitting control points for a given function","category":"page"},{"location":"#Comparison-to-other-Julia-packages-for-B-spline","page":"Home","title":"Comparison to other Julia packages for B-spline","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"There are several Julia packages for B-spline, and this package distinguishes itself with the following key benefits:","category":"page"},{"location":"","page":"Home","title":"Home","text":"Supports all degrees of polynomials.\nIncludes a refinement algorithm for B-spline manifolds.\nOffers a fitting algorithm using least squares. (BasicBSplineFitting.jl)\nDelivers high-speed performance.\nIs mathematically oriented.","category":"page"},{"location":"","page":"Home","title":"Home","text":"If you have any thoughts, please comment in:","category":"page"},{"location":"","page":"Home","title":"Home","text":"Issue#161\nDiscourse post about BasicBSpline.jl.","category":"page"},{"location":"#Installation","page":"Home","title":"Installation","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Install this package","category":"page"},{"location":"","page":"Home","title":"Home","text":"]add BasicBSpline","category":"page"},{"location":"","page":"Home","title":"Home","text":"To export graphics, use BasicBSplineExporter.jl.","category":"page"},{"location":"","page":"Home","title":"Home","text":"]add https://github.com/hyrodium/BasicBSplineExporter.jl","category":"page"},{"location":"#Example","page":"Home","title":"Example","text":"","category":"section"},{"location":"#B-spline-function","page":"Home","title":"B-spline function","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"using BasicBSpline\nusing Plots\n\nk = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\nP0 = BSplineSpace{0}(k) # 0th degree piecewise polynomial space\nP1 = BSplineSpace{1}(k) # 1st degree piecewise polynomial space\nP2 = BSplineSpace{2}(k) # 2nd degree piecewise polynomial space\nP3 = BSplineSpace{3}(k) # 3rd degree piecewise polynomial space\nplot(\n plot([t->bsplinebasis(P0,i,t) for i in 1:dim(P0)], 0, 10, ylims=(0,1), legend=false),\n plot([t->bsplinebasis(P1,i,t) for i in 1:dim(P1)], 0, 10, ylims=(0,1), legend=false),\n plot([t->bsplinebasis(P2,i,t) for i in 1:dim(P2)], 0, 10, ylims=(0,1), legend=false),\n plot([t->bsplinebasis(P3,i,t) for i in 1:dim(P3)], 0, 10, ylims=(0,1), legend=false),\n layout=(2,2),\n)","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: )","category":"page"},{"location":"","page":"Home","title":"Home","text":"Try an interactive graph with Desmos graphing calculator!","category":"page"},{"location":"#B-spline-manifold","page":"Home","title":"B-spline manifold","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\n\np = 2 # degree of polynomial\nk1 = KnotVector(1:8) # knot vector\nk2 = KnotVector(rand(7))+(p+1)*KnotVector([1])\nP1 = BSplineSpace{p}(k1) # B-spline space\nP2 = BSplineSpace{p}(k2)\nn1 = dim(P1) # dimension of B-spline space\nn2 = dim(P2)\na = [SVector(2i-6.5+rand(),1.5j-6.5+rand()) for i in 1:dim(P1), j in 1:dim(P2)] # random generated control points\nM = BSplineManifold(a,(P1,P2)) # Define B-spline manifold\nsave_png(\"2dim.png\", M) # save image","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: )","category":"page"},{"location":"#Refinement","page":"Home","title":"Refinement","text":"","category":"section"},{"location":"#h-refinement","page":"Home","title":"h-refinement","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"k₊=(KnotVector([3.3,4.2]),KnotVector([0.3,0.5])) # additional knot vectors\nM_h = refinement(M, k₊) # refinement of B-spline manifold\nsave_png(\"2dim_h-refinement.png\", M_h) # save image","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: )","category":"page"},{"location":"","page":"Home","title":"Home","text":"Note that this shape and the last shape are equivalent.","category":"page"},{"location":"#p-refinement","page":"Home","title":"p-refinement","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"p₊=(Val(1),Val(2)) # additional degrees\nM_p = refinement(M, p₊) # refinement of B-spline manifold\nsave_png(\"2dim_p-refinement.png\", M_p) # save image","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: )","category":"page"},{"location":"","page":"Home","title":"Home","text":"Note that this shape and the last shape are equivalent.","category":"page"},{"location":"#Fitting-B-spline-manifold","page":"Home","title":"Fitting B-spline manifold","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Try on Desmos graphing calculator!","category":"page"},{"location":"","page":"Home","title":"Home","text":"using BasicBSplineFitting\n\np1 = 2\np2 = 2\nk1 = KnotVector(-10:10)+p1*KnotVector([-10,10])\nk2 = KnotVector(-10:10)+p2*KnotVector([-10,10])\nP1 = BSplineSpace{p1}(k1)\nP2 = BSplineSpace{p2}(k2)\n\nf(u1, u2) = SVector(2u1 + sin(u1) + cos(u2) + u2 / 2, 3u2 + sin(u2) + sin(u1) / 2 + u1^2 / 6) / 5\n\na = fittingcontrolpoints(f, (P1, P2))\nM = BSplineManifold(a, (P1, P2))\nsave_png(\"fitting.png\", M, unitlength=50, xlims=(-10,10), ylims=(-10,10))","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: ) (Image: )","category":"page"},{"location":"","page":"Home","title":"Home","text":"If the knot vector span is too coarse, the approximation will be coarse.","category":"page"},{"location":"","page":"Home","title":"Home","text":"p1 = 2\np2 = 2\nk1 = KnotVector(-10:5:10)+p1*KnotVector([-10,10])\nk2 = KnotVector(-10:5:10)+p2*KnotVector([-10,10])\nP1 = BSplineSpace{p1}(k1)\nP2 = BSplineSpace{p2}(k2)\n\nf(u1, u2) = SVector(2u1 + sin(u1) + cos(u2) + u2 / 2, 3u2 + sin(u2) + sin(u1) / 2 + u1^2 / 6) / 5\n\na = fittingcontrolpoints(f, (P1, P2))\nM = BSplineManifold(a, (P1, P2))\nsave_png(\"fitting_coarse.png\", M, unitlength=50, xlims=(-10,10), ylims=(-10,10))","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: )","category":"page"},{"location":"#Draw-smooth-vector-graphics","page":"Home","title":"Draw smooth vector graphics","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"p = 3\nk = KnotVector(range(-2π,2π,length=8))+p*KnotVector(-2π,2π)\nP = BSplineSpace{p}(k)\n\nf(u) = SVector(u,sin(u))\n\na = fittingcontrolpoints(f, P)\nM = BSplineManifold(a, P)\nsave_svg(\"sine-curve.svg\", M, unitlength=50, xlims=(-2,2), ylims=(-8,8))\nsave_svg(\"sine-curve_no-points.svg\", M, unitlength=50, xlims=(-2,2), ylims=(-8,8), points=false)","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: ) (Image: )","category":"page"},{"location":"","page":"Home","title":"Home","text":"This is useful when you edit graphs (or curves) with your favorite vector graphics editor.","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: )","category":"page"},{"location":"","page":"Home","title":"Home","text":"See Plotting smooth graphs with Julia for more tutorials.","category":"page"}] +[{"location":"math-fitting/#Fitting-with-B-spline-manifold","page":"Fitting","title":"Fitting with B-spline manifold","text":"","category":"section"},{"location":"math-fitting/","page":"Fitting","title":"Fitting","text":"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.","category":"page"},{"location":"math-fitting/","page":"Fitting","title":"Fitting","text":"using BasicBSpline\nusing BasicBSplineFitting\nusing BasicBSplineExporter\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"math-fitting/","page":"Fitting","title":"Fitting","text":"Fitting with least squares method.","category":"page"},{"location":"math-fitting/","page":"Fitting","title":"Fitting","text":"fittingcontrolpoints","category":"page"},{"location":"math-fitting/#BasicBSplineFitting.fittingcontrolpoints","page":"Fitting","title":"BasicBSplineFitting.fittingcontrolpoints","text":"Fitting controlpoints with least squares method.\n\nfittingcontrolpoints(func, Ps::Tuple)\n\nThis function will calculate bma_i to minimize the following integral.\n\nint_I leftf(t)-sum_i B_(ipk)(t) bma_iright^2 dt\n\nSimilarly, for the two-dimensional case, minimize the following integral.\n\nint_I^1 times I^2 leftf(t^1 t^2)-sum_ij B_(ip^1k^1)(t^1)B_(jp^2k^2)(t^2) bma_ijright^2 dt^1dt^2\n\nCurrently, this function supports up to three dimensions.\n\nExamples\n\njulia> f(t) = SVector(cos(t),sin(t),t);\n\njulia> P = BSplineSpace{3}(KnotVector(range(0,2π,30)) + 3*KnotVector([0,2π]));\n\njulia> a = fittingcontrolpoints(f, P);\n\njulia> M = BSplineManifold(a, P);\n\njulia> norm(M(1) - f(1)) < 1e-5\ntrue\n\n\n\n\n\n","category":"function"},{"location":"math-fitting/","page":"Fitting","title":"Fitting","text":"p1 = 2\np2 = 2\nk1 = KnotVector(-10:10)+p1*KnotVector([-10,10])\nk2 = KnotVector(-10:10)+p2*KnotVector([-10,10])\nP1 = BSplineSpace{p1}(k1)\nP2 = BSplineSpace{p2}(k2)\n\nf(u1, u2) = SVector(2u1 + sin(u1) + cos(u2) + u2 / 2, 3u2 + sin(u2) + sin(u1) / 2 + u1^2 / 6) / 5\n\na = fittingcontrolpoints(f, (P1, P2))\nM = BSplineManifold(a, (P1, P2))\nsave_png(\"fitting.png\", M, unitlength=50, xlims=(-10,10), ylims=(-10,10))","category":"page"},{"location":"math-fitting/","page":"Fitting","title":"Fitting","text":"(Image: )","category":"page"},{"location":"math-fitting/","page":"Fitting","title":"Fitting","text":"Try on Desmos graphing graphing calculator! (Image: )","category":"page"},{"location":"math-refinement/#Refinement","page":"Refinement","title":"Refinement","text":"","category":"section"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"math-refinement/#Documentation","page":"Refinement","title":"Documentation","text":"","category":"section"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"refinement","category":"page"},{"location":"math-refinement/#BasicBSpline.refinement","page":"Refinement","title":"BasicBSpline.refinement","text":"Refinement of B-spline manifold with given B-spline spaces.\n\n\n\n\n\n","category":"function"},{"location":"math-refinement/#Example","page":"Refinement","title":"Example","text":"","category":"section"},{"location":"math-refinement/#Define-original-manifold","page":"Refinement","title":"Define original manifold","text":"","category":"section"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"p = 2 # degree of polynomial\nk = KnotVector(1:8) # knot vector\nP = BSplineSpace{p}(k) # B-spline space\nrand_a = [SVector(rand(), rand()) for i in 1:dim(P), j in 1:dim(P)]\na = [SVector(2*i-6.5, 2*j-6.5) for i in 1:dim(P), j in 1:dim(P)] + rand_a # random \nM = BSplineManifold(a,(P,P)) # Define B-spline manifold\nnothing # hide","category":"page"},{"location":"math-refinement/#h-refinement","page":"Refinement","title":"h-refinement","text":"","category":"section"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"Insert additional knots to knot vector.","category":"page"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"k₊ = (KnotVector([3.3,4.2]),KnotVector([3.8,3.2,5.3])) # additional knot vectors\nM_h = refinement(M, k₊) # refinement of B-spline manifold\nsave_png(\"2dim_h-refinement.png\", M_h) # save image","category":"page"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"(Image: )","category":"page"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"Note that this shape and the last shape are equivalent.","category":"page"},{"location":"math-refinement/#p-refinement","page":"Refinement","title":"p-refinement","text":"","category":"section"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"Increase the polynomial degree of B-spline manifold.","category":"page"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"p₊ = (Val(1), Val(2)) # additional degrees\nM_p = refinement(M, p₊) # refinement of B-spline manifold\nsave_png(\"2dim_p-refinement.png\", M_p) # save image","category":"page"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"(Image: )","category":"page"},{"location":"math-refinement/","page":"Refinement","title":"Refinement","text":"Note that this shape and the last shape are equivalent.","category":"page"},{"location":"interpolations/#Interpolations","page":"Interpolations","title":"Interpolations","text":"","category":"section"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"Currently, BasicBSpline.jl doesn't have APIs for interpolations, but it is not hard to implement some basic interpolation algorithms with this package.","category":"page"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"using BasicBSpline\nusing IntervalSets\nusing Random; Random.seed!(42)\nusing Plots; plotly()","category":"page"},{"location":"interpolations/#Interpolation-with-cubic-B-spline","page":"Interpolations","title":"Interpolation with cubic B-spline","text":"","category":"section"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"function interpolate(xs::AbstractVector, fs::AbstractVector{T}) where T\n # Cubic open B-spline space\n p = 3\n k = KnotVector(xs) + KnotVector([xs[1],xs[end]]) * p\n P = BSplineSpace{p}(k)\n\n # dimensions\n m = length(xs)\n n = dim(P)\n\n # The interpolant function has a f''=0 property at bounds.\n ddP = BSplineDerivativeSpace{2}(P)\n dda = [bsplinebasis(ddP,j,xs[1]) for j in 1:n]\n ddb = [bsplinebasis(ddP,j,xs[m]) for j in 1:n]\n\n # Compute the interpolant function (1-dim B-spline manifold)\n M = [bsplinebasis(P,j,xs[i]) for i in 1:m, j in 1:n]\n M = vcat(dda', M, ddb')\n y = vcat(zero(T), fs, zero(T))\n return BSplineManifold(M\\y, P)\nend\n\n# Example inputs\nxs = [1, 2, 3, 4, 6, 7]\nfs = [1.3, 1.5, 2, 2.1, 1.9, 1.3]\nf = interpolate(xs,fs)\n\n# Plot\nscatter(xs, fs)\nplot!(t->f(t))\nsavefig(\"interpolation_cubic.html\") # hide\nnothing # hide","category":"page"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"","category":"page"},{"location":"interpolations/#Interpolation-with-linear-B-spline","page":"Interpolations","title":"Interpolation with linear B-spline","text":"","category":"section"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"function interpolate_linear(xs::AbstractVector, fs::AbstractVector{T}) where T\n # Linear open B-spline space\n p = 1\n k = KnotVector(xs) + KnotVector([xs[1],xs[end]])\n P = BSplineSpace{p}(k)\n\n # dimensions\n m = length(xs)\n n = dim(P)\n\n # Compute the interpolant function (1-dim B-spline manifold)\n return BSplineManifold(fs, P)\nend\n\n# Example inputs\nxs = [1, 2, 3, 4, 6, 7]\nfs = [1.3, 1.5, 2, 2.1, 1.9, 1.3]\n\nf = interpolate_linear(xs,fs)\n\n# Plot\nscatter(xs, fs)\nplot!(t->f(t))\nsavefig(\"interpolation_linear.html\") # hide\nnothing # hide","category":"page"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"","category":"page"},{"location":"interpolations/#Interpolation-with-periodic-B-spline","page":"Interpolations","title":"Interpolation with periodic B-spline","text":"","category":"section"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"function interpolate_periodic(xs::AbstractVector, fs::AbstractVector, ::Val{p}) where p\n # Closed B-spline space, any polynomial degrees can be accepted\n n = length(xs) - 1\n period = xs[end]-xs[begin]\n k = KnotVector(vcat(\n xs[end-p:end-1] .- period,\n xs,\n xs[begin+1:begin+p] .+ period\n ))\n P = BSplineSpace{p}(k)\n A = [bsplinebasis(P,j,xs[i]) for i in 1:n, j in 1:n]\n for i in 1:p-1, j in 1:i\n A[n+i-p+1,j] += bsplinebasis(P,j+n,xs[i+n-p+1])\n end\n b = A \\ fs[begin:end-1]\n # Compute the interpolant function (1-dim B-spline manifold)\n return BSplineManifold(vcat(b,b[1:p]), P)\nend\n\n# Example inputs\nxs = [1, 2, 3, 4, 6, 7]\nfs = [1.3, 1.5, 2, 2.1, 1.9, 1.3] # fs[1] == fs[end]\n\nf = interpolate_periodic(xs,fs,Val(2))\n\n# Plot\nscatter(xs, fs)\nplot!(t->f(mod(t-1,6)+1),1,14)\nplot!(t->f(t))\nsavefig(\"interpolation_periodic.html\") # hide\nnothing # hide","category":"page"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"","category":"page"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"Note that the periodic interpolation supports any degree of polynomial.","category":"page"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"xs = 2π*rand(10)\nsort!(push!(xs, 0, 2π))\nfs = sin.(xs)\nf1 = interpolate_periodic(xs,fs,Val(1))\nf2 = interpolate_periodic(xs,fs,Val(2))\nf3 = interpolate_periodic(xs,fs,Val(3))\nf4 = interpolate_periodic(xs,fs,Val(4))\nf5 = interpolate_periodic(xs,fs,Val(5))\nscatter(xs, fs, label=\"sampling points\")\nplot!(sin, label=\"sine curve\", color=:black)\nplot!(t->f1(t), label=\"polynomial degree 1\")\nplot!(t->f2(t), label=\"polynomial degree 2\")\nplot!(t->f3(t), label=\"polynomial degree 3\")\nplot!(t->f4(t), label=\"polynomial degree 4\")\nplot!(t->f5(t), label=\"polynomial degree 5\")\nsavefig(\"interpolation_periodic_sin.html\") # hide\nnothing # hide","category":"page"},{"location":"interpolations/","page":"Interpolations","title":"Interpolations","text":"","category":"page"},{"location":"contributing/#Contributing","page":"Contributing","title":"Contributing","text":"","category":"section"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"The main contributer Hyrodium is not native English speaker. So, English corrections would be really helpful. Of course, other code improvement are welcomed!","category":"page"},{"location":"contributing/","page":"Contributing","title":"Contributing","text":"Feel free to open issues and pull requests!","category":"page"},{"location":"math-bsplinebasis/#B-spline-basis-function","page":"B-spline basis function","title":"B-spline basis function","text":"","category":"section"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"math-bsplinebasis/#Basic-properties-of-B-spline-basis-function","page":"B-spline basis function","title":"Basic properties of B-spline basis function","text":"","category":"section"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"tip: Def. B-spline space\nB-spline basis function is defined by Cox–de Boor recursion formula.beginaligned\nB_(ipk)(t)\n=\nfract-k_ik_i+p-k_iB_(ip-1k)(t)\n+frack_i+p+1-tk_i+p+1-k_i+1B_(i+1p-1k)(t) \nB_(i0k)(t)\n=\nbegincases\n 1quad (k_ile t k_i+1)\n 0quad (textotherwise)\nendcases\nendalignedIf the denominator is zero, then the term is assumed to be zero.","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"The next figure shows the plot of B-spline basis functions. You can manipulate these plots on desmos graphing calculator!","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"(Image: )","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"info: Thm. Basis of B-spline space\nThe set of functions B_(ipk)_i is a basis of B-spline space mathcalPpk.","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"p = 2\nk = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\nP = BSplineSpace{p}(k)\nplot([t->bsplinebasis₊₀(P,i,t) for i in 1:dim(P)], 0, 10, ylims=(0,1), label=false)\nsavefig(\"bsplinebasisplot.html\") # hide\nnothing # hide","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"You can choose the first terms in different ways.","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"beginaligned\nB_(i0k)(t)\n=\nbegincases\n 1quad (k_i t le k_i+1) \n 0quad (textotherwise)\nendcases\nendaligned","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"p = 2\nk = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\nP = BSplineSpace{p}(k)\nplot([t->bsplinebasis₋₀(P,i,t) for i in 1:dim(P)], 0, 10, ylims=(0,1), label=false)\nsavefig(\"bsplinebasisplot2.html\") # hide\nnothing # hide","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"In these cases, each B-spline basis function B_(i2k) is coninuous, so bsplinebasis₊₀ and bsplinebasis₋₀ are equal.","category":"page"},{"location":"math-bsplinebasis/#Support-of-B-spline-basis-function","page":"B-spline basis function","title":"Support of B-spline basis function","text":"","category":"section"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"info: Thm. Support of B-spline basis function\nIf a B-spline spacemathcalPpk is non-degenerate, the support of its basis function is calculated as follows:operatornamesupp(B_(ipk))=k_ik_i+p+1","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"[TODO: fig]","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"bsplinesupport","category":"page"},{"location":"math-bsplinebasis/#BasicBSpline.bsplinesupport","page":"B-spline basis function","title":"BasicBSpline.bsplinesupport","text":"Return the support of i-th B-spline basis function.\n\noperatornamesupp(B_(ipk))=k_ik_i+p+1\n\nExamples\n\njulia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\nKnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\n\njulia> P = BSplineSpace{2}(k)\nBSplineSpace{2, Float64, KnotVector{Float64}}(KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]))\n\njulia> bsplinesupport(P,1)\n0.0 .. 5.5\n\njulia> bsplinesupport(P,2)\n1.5 .. 8.0\n\n\n\n\n\n","category":"function"},{"location":"math-bsplinebasis/#Partition-of-unity","page":"B-spline basis function","title":"Partition of unity","text":"","category":"section"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"info: Thm. Partition of unity\nLet B_(ipk) be a B-spline basis function, then the following equation is satisfied.beginaligned\nsum_iB_(ipk)(t) = 1 (k_p+1 le t k_l-p) \n0 le B_(ipk)(t) le 1\nendaligned","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"p = 2\nk = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\nP = BSplineSpace{p}(k)\nplot(t->sum(bsplinebasis₊₀(P,i,t) for i in 1:dim(P)), 0, 10, ylims=(0,1.1), label=false)\nsavefig(\"sumofbsplineplot.html\") # hide\nnothing # hide","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"To satisfy the partition of unity on whole interval 18, sometimes more knots will be inserted to the endpoints of the interval.","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"p = 2\nk = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]) + p * KnotVector([0,10])\nP = BSplineSpace{p}(k)\nplot(t->sum(bsplinebasis₊₀(P,i,t) for i in 1:dim(P)), 0, 10, ylims=(0,1.1), label=false)\nsavefig(\"sumofbsplineplot2.html\") # hide\nnothing # hide","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"But, the sum sum_i B_(ipk)(t) is not equal to 1 at t=8. Therefore, to satisfy partition of unity on closed interval k_p+1 k_l-p, the definition of first terms of B-spline basis functions are sometimes replaced:","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"beginaligned\nB_(i0k)(t)\n=\nbegincases\n 1quad (k_i le tk_i+1)\n 1quad (k_i t = k_i+1=k_l)\n 0quad (textotherwise)\nendcases\nendaligned","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"p = 2\nk = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]) + p * KnotVector([0,10])\nP = BSplineSpace{p}(k)\nplot(t->sum(bsplinebasis(P,i,t) for i in 1:dim(P)), 0, 10, ylims=(0,1.1), label=false)\nsavefig(\"sumofbsplineplot3.html\") # hide\nnothing # hide","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"bsplinebasis₊₀","category":"page"},{"location":"math-bsplinebasis/#BasicBSpline.bsplinebasis₊₀","page":"B-spline basis function","title":"BasicBSpline.bsplinebasis₊₀","text":"i-th B-spline basis function. Right-sided limit version.\n\nbeginaligned\nB_(ipk)(t)\n=\nfract-k_ik_i+p-k_iB_(ip-1k)(t)\n+frack_i+p+1-tk_i+p+1-k_i+1B_(i+1p-1k)(t) \nB_(i0k)(t)\n=\nbegincases\n 1quad (k_ile t k_i+1)\n 0quad (textotherwise)\nendcases\nendaligned\n\nExamples\n\njulia> P = BSplineSpace{0}(KnotVector(1:6))\nBSplineSpace{0, Int64, KnotVector{Int64}}(KnotVector([1, 2, 3, 4, 5, 6]))\n\njulia> bsplinebasis₊₀.(P,1:5,(1:6)')\n5×6 Matrix{Float64}:\n 1.0 0.0 0.0 0.0 0.0 0.0\n 0.0 1.0 0.0 0.0 0.0 0.0\n 0.0 0.0 1.0 0.0 0.0 0.0\n 0.0 0.0 0.0 1.0 0.0 0.0\n 0.0 0.0 0.0 0.0 1.0 0.0\n\n\n\n\n\n","category":"function"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"bsplinebasis₋₀","category":"page"},{"location":"math-bsplinebasis/#BasicBSpline.bsplinebasis₋₀","page":"B-spline basis function","title":"BasicBSpline.bsplinebasis₋₀","text":"i-th B-spline basis function. Left-sided limit version.\n\nbeginaligned\nB_(ipk)(t)\n=\nfract-k_ik_i+p-k_iB_(ip-1k)(t)\n+frack_i+p+1-tk_i+p+1-k_i+1B_(i+1p-1k)(t) \nB_(i0k)(t)\n=\nbegincases\n 1quad (k_i tle k_i+1)\n 0quad (textotherwise)\nendcases\nendaligned\n\nExamples\n\njulia> P = BSplineSpace{0}(KnotVector(1:6))\nBSplineSpace{0, Int64, KnotVector{Int64}}(KnotVector([1, 2, 3, 4, 5, 6]))\n\njulia> bsplinebasis₋₀.(P,1:5,(1:6)')\n5×6 Matrix{Float64}:\n 0.0 1.0 0.0 0.0 0.0 0.0\n 0.0 0.0 1.0 0.0 0.0 0.0\n 0.0 0.0 0.0 1.0 0.0 0.0\n 0.0 0.0 0.0 0.0 1.0 0.0\n 0.0 0.0 0.0 0.0 0.0 1.0\n\n\n\n\n\n","category":"function"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"bsplinebasis","category":"page"},{"location":"math-bsplinebasis/#BasicBSpline.bsplinebasis","page":"B-spline basis function","title":"BasicBSpline.bsplinebasis","text":"i-th B-spline basis function. Modified version.\n\nbeginaligned\nB_(ipk)(t)\n=\nfract-k_ik_i+p-k_iB_(ip-1k)(t)\n+frack_i+p+1-tk_i+p+1-k_i+1B_(i+1p-1k)(t) \nB_(i0k)(t)\n=\nbegincases\n 1quad (k_i le tk_i+1)\n 1quad (k_i t = k_i+1=k_l)\n 0quad (textotherwise)\nendcases\nendaligned\n\nExamples\n\njulia> P = BSplineSpace{0}(KnotVector(1:6))\nBSplineSpace{0, Int64, KnotVector{Int64}}(KnotVector([1, 2, 3, 4, 5, 6]))\n\njulia> bsplinebasis.(P,1:5,(1:6)')\n5×6 Matrix{Float64}:\n 1.0 0.0 0.0 0.0 0.0 0.0\n 0.0 1.0 0.0 0.0 0.0 0.0\n 0.0 0.0 1.0 0.0 0.0 0.0\n 0.0 0.0 0.0 1.0 0.0 0.0\n 0.0 0.0 0.0 0.0 1.0 1.0\n\n\n\n\n\n","category":"function"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"BasicBSpline.bsplinebasis₋₀I","category":"page"},{"location":"math-bsplinebasis/#BasicBSpline.bsplinebasis₋₀I","page":"B-spline basis function","title":"BasicBSpline.bsplinebasis₋₀I","text":"i-th B-spline basis function. Modified version (2).\n\nbeginaligned\nB_(ipk)(t)\n=\nfract-k_ik_i+p-k_iB_(ip-1k)(t)\n+frack_i+p+1-tk_i+p+1-k_i+1B_(i+1p-1k)(t) \nB_(i0k)(t)\n=\nbegincases\n 1quad (k_i le tk_i+1)\n 1quad (k_i t = k_i+1=k_l)\n 0quad (textotherwise)\nendcases\nendaligned\n\nExamples\n\njulia> P = BSplineSpace{0}(KnotVector(1:6))\nBSplineSpace{0, Int64, KnotVector{Int64}}(KnotVector([1, 2, 3, 4, 5, 6]))\n\njulia> BasicBSpline.bsplinebasis₋₀I.(P,1:5,(1:6)')\n5×6 Matrix{Float64}:\n 1.0 1.0 0.0 0.0 0.0 0.0\n 0.0 0.0 1.0 0.0 0.0 0.0\n 0.0 0.0 0.0 1.0 0.0 0.0\n 0.0 0.0 0.0 0.0 1.0 0.0\n 0.0 0.0 0.0 0.0 0.0 1.0\n\n\n\n\n\n","category":"function"},{"location":"math-bsplinebasis/#B-spline-basis-functions-at-specific-point","page":"B-spline basis function","title":"B-spline basis functions at specific point","text":"","category":"section"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"Sometimes, you may need the non-zero values of B-spline basis functions at specific point. The bsplinebasisall function is much more efficient than evaluating B-spline functions one by one with bsplinebasis function.","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"using BenchmarkTools, BasicBSpline\nP = BSplineSpace{2}(KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]))\nt = 6.3\n(bsplinebasis(P, 2, t), bsplinebasis(P, 3, t), bsplinebasis(P, 4, t))\nbsplinebasisall(P, 2, t)\n@benchmark (bsplinebasis($P, 2, $t), bsplinebasis($P, 3, $t), bsplinebasis($P, 4, $t))\n@benchmark bsplinebasisall($P, 2, $t)","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"intervalindex","category":"page"},{"location":"math-bsplinebasis/#BasicBSpline.intervalindex","page":"B-spline basis function","title":"BasicBSpline.intervalindex","text":"Return an index of a interval in the domain of B-spline space\n\nExamples\n\njulia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]);\n\n\njulia> P = BSplineSpace{2}(k);\n\n\njulia> domain(P)\n2.5 .. 9.0\n\njulia> intervalindex(P,2.6)\n1\n\njulia> intervalindex(P,5.6)\n2\n\njulia> intervalindex(P,8.5)\n3\n\njulia> intervalindex(P,9.5)\n3\n\n\n\n\n\n","category":"function"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"bsplinebasisall","category":"page"},{"location":"math-bsplinebasis/#BasicBSpline.bsplinebasisall","page":"B-spline basis function","title":"BasicBSpline.bsplinebasisall","text":"B-spline basis functions at point t on i-th interval.\n\nExamples\n\njulia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\nKnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\n\njulia> p = 2\n2\n\njulia> P = BSplineSpace{p}(k)\nBSplineSpace{2, Float64, KnotVector{Float64}}(KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]))\n\njulia> t = 5.7\n5.7\n\njulia> i = intervalindex(P,t)\n2\n\njulia> bsplinebasisall(P,i,t)\n3-element SVector{3, Float64} with indices SOneTo(3):\n 0.3847272727272727\n 0.6107012987012989\n 0.00457142857142858\n\njulia> bsplinebasis.(P,i:i+p,t)\n3-element Vector{Float64}:\n 0.38472727272727264\n 0.6107012987012989\n 0.00457142857142858\n\n\n\n\n\n","category":"function"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"The next figures illustlates the relation between domain(P), intervalindex(P,t) and bsplinebasisall(P,i,t).","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\n\nfor p in 1:3\n P = BSplineSpace{p}(k)\n plot(P, legend=:topleft, label=\"B-spline basis (p=1)\")\n plot!(t->intervalindex(P,t),0,10, label=\"Interval index\")\n plot!(t->sum(bsplinebasis(P,i,t) for i in 1:dim(P)),0,10, label=\"Sum of B-spline basis\")\n scatter!(k.vector,zero(k.vector), label=\"knot vector\")\n plot!([t->bsplinebasisall(P,1,t)[i] for i in 1:p+1],0,10, color=:black, label=\"bsplinebasisall (i=1)\", ylim=(-1,8-2p))\n savefig(\"bsplinebasisall-$(p).html\") # hide\n nothing # hide\nend","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"","category":"page"},{"location":"math-bsplinebasis/#Uniform-B-spline-basis-and-uniform-distribution","page":"B-spline basis function","title":"Uniform B-spline basis and uniform distribution","text":"","category":"section"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"Let X_1 dots X_n be i.i.d. random variables with X_i sim U(01), then the probability density function of X_1+cdots+X_n can be obtained via BasicBSpline.uniform_bsplinebasis_kernel(Val(n-1),t).","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"N = 100000\n# polynomial degree 0\nplot1 = histogram([rand() for _ in 1:N], normalize=true, label=false)\nplot!(t->BasicBSpline.uniform_bsplinebasis_kernel(Val(0),t), label=false)\n# polynomial degree 1\nplot2 = histogram([rand()+rand() for _ in 1:N], normalize=true, label=false)\nplot!(t->BasicBSpline.uniform_bsplinebasis_kernel(Val(1),t), label=false)\n# polynomial degree 2\nplot3 = histogram([rand()+rand()+rand() for _ in 1:N], normalize=true, label=false)\nplot!(t->BasicBSpline.uniform_bsplinebasis_kernel(Val(2),t), label=false)\n# polynomial degree 3\nplot4 = histogram([rand()+rand()+rand()+rand() for _ in 1:N], normalize=true, label=false)\nplot!(t->BasicBSpline.uniform_bsplinebasis_kernel(Val(3),t), label=false)\n# plot all\nplot(plot1,plot2,plot3,plot4)\nsavefig(\"histogram-uniform.html\") # hide\nnothing # hide","category":"page"},{"location":"math-bsplinebasis/","page":"B-spline basis function","title":"B-spline basis function","text":"","category":"page"},{"location":"math-knotvector/#Knot-vector","page":"Knot vector","title":"Knot vector","text":"","category":"section"},{"location":"math-knotvector/#Definition","page":"Knot vector","title":"Definition","text":"","category":"section"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"tip: Def. Knot vector\nA finite sequencek = (k_1 dots k_l)is called knot vector if the sequence is broad monotonic increase, i.e. k_i le k_i+1.","category":"page"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"[TODO: fig]","category":"page"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"KnotVector","category":"page"},{"location":"math-knotvector/#BasicBSpline.KnotVector","page":"Knot vector","title":"BasicBSpline.KnotVector","text":"Construct knot vector from given array.\n\nk=(k_1dotsk_l)\n\nExamples\n\njulia> k = KnotVector([1,2,3])\nKnotVector([1, 2, 3])\n\njulia> k = KnotVector(1:3)\nKnotVector([1, 2, 3])\n\n\n\n\n\n","category":"type"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"UniformKnotVector","category":"page"},{"location":"math-knotvector/#BasicBSpline.UniformKnotVector","page":"Knot vector","title":"BasicBSpline.UniformKnotVector","text":"Construct uniform knot vector from given range.\n\nk=(k_1dotsk_l)\n\nExamples\n\njulia> k = UniformKnotVector(1:8)\nUniformKnotVector(1:8)\n\njulia> UniformKnotVector(8:-1:3)\nUniformKnotVector(3:1:8)\n\n\n\n\n\n","category":"type"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"SubKnotVector","category":"page"},{"location":"math-knotvector/#BasicBSpline.SubKnotVector","page":"Knot vector","title":"BasicBSpline.SubKnotVector","text":"A type to represetnt sub knot vector.\n\nk=(k_1dotsk_l)\n\nExamples\n\njulia> k = knotvector\"1 11 211\"\nKnotVector([1, 3, 4, 6, 6, 7, 8])\n\njulia> view(k, 2:5)\nSubKnotVector([3, 4, 6, 6])\n\n\n\n\n\n","category":"type"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"EmptyKnotVector","category":"page"},{"location":"math-knotvector/#BasicBSpline.EmptyKnotVector","page":"Knot vector","title":"BasicBSpline.EmptyKnotVector","text":"Knot vector with zero-element.\n\nk=()\n\nThis struct is intended for internal use.\n\nExamples\n\njulia> EmptyKnotVector()\nEmptyKnotVector{Bool}()\n\njulia> EmptyKnotVector{Float64}()\nEmptyKnotVector{Float64}()\n\n\n\n\n\n","category":"type"},{"location":"math-knotvector/#Operations-for-knot-vectors","page":"Knot vector","title":"Operations for knot vectors","text":"","category":"section"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"length(k::AbstractKnotVector)","category":"page"},{"location":"math-knotvector/#Base.length-Tuple{AbstractKnotVector}","page":"Knot vector","title":"Base.length","text":"Length of knot vector\n\nbeginaligned\nk\n=(textnumber of knot elements of k) \nendaligned\n\nFor example, (1223)=4.\n\nExamples\n\njulia> k = KnotVector([1,2,2,3]);\n\n\njulia> length(k)\n4\n\n\n\n\n\n","category":"method"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"Although a knot vector is not a vector in linear algebra, but we introduce additional operator +.","category":"page"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"Base.:+(k1::KnotVector{T}, k2::KnotVector{T}) where T","category":"page"},{"location":"math-knotvector/#Base.:+-Union{Tuple{T}, Tuple{KnotVector{T}, KnotVector{T}}} where T","page":"Knot vector","title":"Base.:+","text":"Sum of knot vectors\n\nbeginaligned\nk^(1)+k^(2)\n=(k^(1)_1 dots k^(1)_l^(1)) + (k^(2)_1 dots k^(2)_l^(2)) \n=(textsort of union of k^(1) textand k^(2) text)\nendaligned\n\nFor example, (1235)+(458)=(1234558).\n\nExamples\n\njulia> k1 = KnotVector([1,2,3,5]);\n\n\njulia> k2 = KnotVector([4,5,8]);\n\n\njulia> k1 + k2\nKnotVector([1, 2, 3, 4, 5, 5, 8])\n\n\n\n\n\n","category":"method"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"Note that the operator +(::KnotVector, ::KnotVector) is commutative. This is why we choose the + sign. We also introduce product operator cdot for knot vector.","category":"page"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"*(m::Integer, k::AbstractKnotVector)","category":"page"},{"location":"math-knotvector/#Base.:*-Tuple{Integer, AbstractKnotVector}","page":"Knot vector","title":"Base.:*","text":"Product of integer and knot vector\n\nbeginaligned\nmcdot k=underbracek+cdots+k_m\nendaligned\n\nFor example, 2cdot (1225)=(11222255).\n\nExamples\n\njulia> k = KnotVector([1,2,2,5]);\n\n\njulia> 2 * k\nKnotVector([1, 1, 2, 2, 2, 2, 5, 5])\n\n\n\n\n\n","category":"method"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"Inclusive relationship between knot vectors.","category":"page"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"Base.issubset(k::KnotVector, k′::KnotVector)","category":"page"},{"location":"math-knotvector/#Base.issubset-Tuple{KnotVector, KnotVector}","page":"Knot vector","title":"Base.issubset","text":"Check a inclusive relationship ksubseteq k, for example:\n\nbeginaligned\n(12) subseteq (123) \n(122) notsubseteq (123) \n(123) subseteq (123) \nendaligned\n\nExamples\n\njulia> KnotVector([1,2]) ⊆ KnotVector([1,2,3])\ntrue\n\njulia> KnotVector([1,2,2]) ⊆ KnotVector([1,2,3])\nfalse\n\njulia> KnotVector([1,2,3]) ⊆ KnotVector([1,2,3])\ntrue\n\n\n\n\n\n","category":"method"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"unique(k::AbstractKnotVector)","category":"page"},{"location":"math-knotvector/#Base.unique-Tuple{AbstractKnotVector}","page":"Knot vector","title":"Base.unique","text":"Unique elements of knot vector.\n\nbeginaligned\nwidehatk\n=(textunique knot elements of k) \nendaligned\n\nFor example, widehat(1223)=(123).\n\nExamples\n\njulia> k = KnotVector([1,2,2,3]);\n\n\njulia> unique(k)\nKnotVector([1, 2, 3])\n\n\n\n\n\n","category":"method"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"countknots(k::AbstractKnotVector, t::Real)","category":"page"},{"location":"math-knotvector/#BasicBSpline.countknots-Tuple{AbstractKnotVector, Real}","page":"Knot vector","title":"BasicBSpline.countknots","text":"For given knot vector k, the following function mathfrakn_kmathbbRtomathbbZ represents the number of knots that duplicate the knot vector k.\n\nmathfrakn_k(t) = i mid k_i=t \n\nFor example, if k=(1223), then mathfrakn_k(03)=0, mathfrakn_k(1)=1, mathfrakn_k(2)=2.\n\njulia> k = KnotVector([1,2,2,3]);\n\n\njulia> countknots(k,0.3)\n0\n\njulia> countknots(k,1.0)\n1\n\njulia> countknots(k,2.0)\n2\n\n\n\n\n\n","category":"method"},{"location":"math-knotvector/#KnotVector-with-string-macro","page":"Knot vector","title":"KnotVector with string macro","text":"","category":"section"},{"location":"math-knotvector/","page":"Knot vector","title":"Knot vector","text":"@knotvector_str","category":"page"},{"location":"math-knotvector/#BasicBSpline.@knotvector_str","page":"Knot vector","title":"BasicBSpline.@knotvector_str","text":"@knotvector_str -> KnotVector\n\nConstruct a knotvector by specifying the numbers of duplicates of knots.\n\nExamples\n\njulia> knotvector\"11111\"\nKnotVector([1, 2, 3, 4, 5])\n\njulia> knotvector\"123\"\nKnotVector([1, 2, 2, 3, 3, 3])\n\njulia> knotvector\" 2 2 2\"\nKnotVector([2, 2, 4, 4, 6, 6])\n\njulia> knotvector\" 1\"\nKnotVector([6])\n\n\n\n\n\n","category":"macro"},{"location":"plots/#Plots.jl","page":"Plots.jl","title":"Plots.jl","text":"","category":"section"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"BasicBSpline.jl has a dependency on RecipesBase.jl. This means, users can easily visalize instances defined in BasicBSpline. In this section, we will provide some plottig examples.","category":"page"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"using BasicBSpline\nusing BasicBSplineFitting\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"plots/#BSplineSpace","page":"Plots.jl","title":"BSplineSpace","text":"","category":"section"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\nP0 = BSplineSpace{0}(k) # 0th degree piecewise polynomial space\nP1 = BSplineSpace{1}(k) # 1st degree piecewise polynomial space\nP2 = BSplineSpace{2}(k) # 2nd degree piecewise polynomial space\nP3 = BSplineSpace{3}(k) # 3rd degree piecewise polynomial space\nplot(\n plot([t->bsplinebasis(P0,i,t) for i in 1:dim(P0)], 0, 10, ylims=(0,1), legend=false, title=\"0th polynomial degree\"),\n plot([t->bsplinebasis(P1,i,t) for i in 1:dim(P1)], 0, 10, ylims=(0,1), legend=false, title=\"1st polynomial degree\"),\n plot([t->bsplinebasis(P2,i,t) for i in 1:dim(P2)], 0, 10, ylims=(0,1), legend=false, title=\"2nd polynomial degree\"),\n plot([t->bsplinebasis(P3,i,t) for i in 1:dim(P3)], 0, 10, ylims=(0,1), legend=false, title=\"3rd polynomial degree\"),\n)\nsavefig(\"plots-bsplinebasis-raw.html\") # hide\nnothing # hide","category":"page"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"","category":"page"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\nP0 = BSplineSpace{0}(k) # 0th degree piecewise polynomial space\nP1 = BSplineSpace{1}(k) # 1st degree piecewise polynomial space\nP2 = BSplineSpace{2}(k) # 2nd degree piecewise polynomial space\nP3 = BSplineSpace{3}(k) # 3rd degree piecewise polynomial space\nplot(\n plot(P0, ylims=(0,1), legend=false, title=\"0th polynomial degree\"),\n plot(P1, ylims=(0,1), legend=false, title=\"1st polynomial degree\"),\n plot(P2, ylims=(0,1), legend=false, title=\"2nd polynomial degree\"),\n plot(P3, ylims=(0,1), legend=false, title=\"3rd polynomial degree\"),\n layout=(2,2),\n)\nsavefig(\"plots-bsplinebasis.html\") # hide\nnothing # hide","category":"page"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"","category":"page"},{"location":"plots/#BSplineDerivativeSpace","page":"Plots.jl","title":"BSplineDerivativeSpace","text":"","category":"section"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\nP = BSplineSpace{3}(k)\nplot(\n plot(BSplineDerivativeSpace{0}(P), label=\"0th derivative\", color=:black),\n plot(BSplineDerivativeSpace{1}(P), label=\"1st derivative\", color=:red),\n plot(BSplineDerivativeSpace{2}(P), label=\"2nd derivative\", color=:green),\n plot(BSplineDerivativeSpace{3}(P), label=\"3rd derivative\", color=:blue),\n)\nsavefig(\"plots-bsplinebasisderivative.html\") # hide\nnothing # hide","category":"page"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"","category":"page"},{"location":"plots/#BSplineManifold","page":"Plots.jl","title":"BSplineManifold","text":"","category":"section"},{"location":"plots/#Cardioid-(planar-curve)","page":"Plots.jl","title":"Cardioid (planar curve)","text":"","category":"section"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"f(t) = SVector((1+cos(t))*cos(t),(1+cos(t))*sin(t))\np = 3\nk = KnotVector(range(0,2π,15)) + p * KnotVector([0,2π]) + 2 * KnotVector([π])\nP = BSplineSpace{p}(k)\na = fittingcontrolpoints(f, P)\nM = BSplineManifold(a, P)\n\nplot(M)\nsavefig(\"plots-cardioid.html\") # hide\nnothing # hide","category":"page"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"","category":"page"},{"location":"plots/#Helix-(spatial-curve)","page":"Plots.jl","title":"Helix (spatial curve)","text":"","category":"section"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"f(t) = SVector(cos(t),sin(t),t)\np = 3\nk = KnotVector(range(0,6π,15)) + p * KnotVector([0,6π])\nP = BSplineSpace{p}(k)\na = fittingcontrolpoints(f, P)\nM = BSplineManifold(a, P)\n\nplot(M)\nsavefig(\"plots-helix.html\") # hide\nnothing # hide","category":"page"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"","category":"page"},{"location":"plots/#B-spline-surface","page":"Plots.jl","title":"B-spline surface","text":"","category":"section"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"p1 = 2\np2 = 3\nk1 = KnotVector(1:10)\nk2 = KnotVector(1:20)\nP1 = BSplineSpace{p1}(k1)\nP2 = BSplineSpace{p2}(k2)\na = [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)]\nM = BSplineManifold(a,(P1,P2))\nplot(M)\n\nsavefig(\"plots-surface.html\") # hide\nnothing # hide","category":"page"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"","category":"page"},{"location":"plots/#RationalBSplineManifold","page":"Plots.jl","title":"RationalBSplineManifold","text":"","category":"section"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"k = KnotVector([0,0,0,1,1,1])\nP = BSplineSpace{2}(k)\na = [SVector(1,0),SVector(1,1),SVector(0,1)]\nw = [1,1/√2,1]\nM = BSplineManifold(a,P)\nR = RationalBSplineManifold(a,w,P)\nts = 0:0.01:2\nplot(cospi.(ts),sinpi.(ts), label=\"circle\")\nplot!(M, label=\"B-spline curve\")\nplot!(R, label=\"Rational B-spline curve\")\n\nsavefig(\"plots-arc.html\") # hide\nnothing # hide","category":"page"},{"location":"plots/","page":"Plots.jl","title":"Plots.jl","text":"","category":"page"},{"location":"basicbsplineexporter/#BasicBSplineExporter.jl","page":"BasicBSplineExporter.jl","title":"BasicBSplineExporter.jl","text":"","category":"section"},{"location":"basicbsplineexporter/","page":"BasicBSplineExporter.jl","title":"BasicBSplineExporter.jl","text":"BasicBSplineExporter.jl supports export BasicBSpline.BSplineManifold{Dim,Deg,<:StaticVector} to:","category":"page"},{"location":"basicbsplineexporter/","page":"BasicBSplineExporter.jl","title":"BasicBSplineExporter.jl","text":"PNG image (.png)\nSVG image (.png)\nPOV-Ray mesh (.inc)","category":"page"},{"location":"basicbsplineexporter/#Installation","page":"BasicBSplineExporter.jl","title":"Installation","text":"","category":"section"},{"location":"basicbsplineexporter/","page":"BasicBSplineExporter.jl","title":"BasicBSplineExporter.jl","text":"] add https://github.com/hyrodium/BasicBSplineExporter.jl","category":"page"},{"location":"basicbsplineexporter/#First-example","page":"BasicBSplineExporter.jl","title":"First example","text":"","category":"section"},{"location":"basicbsplineexporter/","page":"BasicBSplineExporter.jl","title":"BasicBSplineExporter.jl","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\n\np = 2 # degree of polynomial\nk1 = KnotVector(1:8) # knot vector\nk2 = KnotVector(rand(7))+(p+1)*KnotVector([1])\nP1 = BSplineSpace{p}(k1) # B-spline space\nP2 = BSplineSpace{p}(k2)\nn1 = dim(P1) # dimension of B-spline space\nn2 = dim(P2)\na = [SVector(2i-6.5+rand(),1.5j-6.5+rand()) for i in 1:dim(P1), j in 1:dim(P2)] # random generated control points\nM = BSplineManifold(a,(P1,P2)) # Define B-spline manifold\nsave_png(\"BasicBSplineExporter_2dim.png\", M) # save image","category":"page"},{"location":"basicbsplineexporter/","page":"BasicBSplineExporter.jl","title":"BasicBSplineExporter.jl","text":"(Image: )","category":"page"},{"location":"basicbsplineexporter/#Other-examples","page":"BasicBSplineExporter.jl","title":"Other examples","text":"","category":"section"},{"location":"basicbsplineexporter/","page":"BasicBSplineExporter.jl","title":"BasicBSplineExporter.jl","text":"Here are some images rendared with POV-Ray.","category":"page"},{"location":"basicbsplineexporter/","page":"BasicBSplineExporter.jl","title":"BasicBSplineExporter.jl","text":"(Image: ) (Image: ) (Image: )","category":"page"},{"location":"basicbsplineexporter/","page":"BasicBSplineExporter.jl","title":"BasicBSplineExporter.jl","text":"See BasicBSplineExporter.jl/test for more examples.","category":"page"},{"location":"math-derivative/#Derivative-of-B-spline","page":"Derivative","title":"Derivative of B-spline","text":"","category":"section"},{"location":"math-derivative/","page":"Derivative","title":"Derivative","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"math-derivative/","page":"Derivative","title":"Derivative","text":"info: Thm. Derivative of B-spline basis function\nThe derivative of B-spline basis function can be expressed as follows:beginaligned\ndotB_(ipk)(t)\n=fracddtB_(ipk)(t) \n=pleft(frac1k_i+p-k_iB_(ip-1k)(t)-frac1k_i+p+1-k_i+1B_(i+1p-1k)(t)right)\nendalignedNote that dotB_(ipk)inmathcalPp-1k.","category":"page"},{"location":"math-derivative/","page":"Derivative","title":"Derivative","text":"k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\nP = BSplineSpace{3}(k)\nplot(\n plot(BSplineDerivativeSpace{0}(P), label=\"0th derivative\", color=:black),\n plot(BSplineDerivativeSpace{1}(P), label=\"1st derivative\", color=:red),\n plot(BSplineDerivativeSpace{2}(P), label=\"2nd derivative\", color=:green),\n plot(BSplineDerivativeSpace{3}(P), label=\"3rd derivative\", color=:blue),\n)\nsavefig(\"bsplinebasisderivativeplot.html\") # hide\nnothing # hide","category":"page"},{"location":"math-derivative/","page":"Derivative","title":"Derivative","text":"","category":"page"},{"location":"math-derivative/","page":"Derivative","title":"Derivative","text":"BSplineDerivativeSpace","category":"page"},{"location":"math-derivative/#BasicBSpline.BSplineDerivativeSpace","page":"Derivative","title":"BasicBSpline.BSplineDerivativeSpace","text":"BSplineDerivativeSpace{r}(P::BSplineSpace)\n\nConstruct derivative of B-spline space from given differential order and B-spline space.\n\nD^r(mathcalPpk)\n=leftt mapsto left fracd^r fdt^r(t) right f in mathcalPpk right\n\nExamples\n\njulia> P = BSplineSpace{2}(KnotVector([1,2,3,4,5,6]))\nBSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([1, 2, 3, 4, 5, 6]))\n\njulia> dP = BSplineDerivativeSpace{1}(P)\nBSplineDerivativeSpace{1, BSplineSpace{2, Int64, KnotVector{Int64}}, Int64}(BSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([1, 2, 3, 4, 5, 6])))\n\njulia> degree(P), degree(dP)\n(2, 1)\n\n\n\n\n\n","category":"type"},{"location":"math-derivative/","page":"Derivative","title":"Derivative","text":"BasicBSpline.derivative","category":"page"},{"location":"math-derivative/#BasicBSpline.derivative","page":"Derivative","title":"BasicBSpline.derivative","text":"derivative(::BSplineDerivativeSpace{r}) -> BSplineDerivativeSpace{r+1}\nderivative(::BSplineSpace) -> BSplineDerivativeSpace{1}\n\nDerivative of B-spline related space.\n\nExamples\n\njulia> BSplineSpace{2}(KnotVector(0:5))\nBSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([0, 1, 2, 3, 4, 5]))\n\njulia> BasicBSpline.derivative(ans)\nBSplineDerivativeSpace{1, BSplineSpace{2, Int64, KnotVector{Int64}}, Int64}(BSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([0, 1, 2, 3, 4, 5])))\n\njulia> BasicBSpline.derivative(ans)\nBSplineDerivativeSpace{2, BSplineSpace{2, Int64, KnotVector{Int64}}, Int64}(BSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([0, 1, 2, 3, 4, 5])))\n\n\n\n\n\n","category":"function"},{"location":"math-derivative/","page":"Derivative","title":"Derivative","text":"bsplinebasis′₊₀","category":"page"},{"location":"math-derivative/#BasicBSpline.bsplinebasis′₊₀","page":"Derivative","title":"BasicBSpline.bsplinebasis′₊₀","text":"bsplinebasis′₊₀(::AbstractFunctionSpace, ::Integer, ::Real) -> Real\n\n1st derivative of B-spline basis function. Right-sided limit version.\n\ndotB_(ipk)(t)\n=pleft(frac1k_i+p-k_iB_(ip-1k)(t)-frac1k_i+p+1-k_i+1B_(i+1p-1k)(t)right)\n\nbsplinebasis′₊₀(P, i, t) is equivalent to bsplinebasis₊₀(derivative(P), i, t).\n\n\n\n\n\n","category":"function"},{"location":"math-derivative/","page":"Derivative","title":"Derivative","text":"bsplinebasis′₋₀","category":"page"},{"location":"math-derivative/#BasicBSpline.bsplinebasis′₋₀","page":"Derivative","title":"BasicBSpline.bsplinebasis′₋₀","text":"bsplinebasis′₋₀(::AbstractFunctionSpace, ::Integer, ::Real) -> Real\n\n1st derivative of B-spline basis function. Left-sided limit version.\n\ndotB_(ipk)(t)\n=pleft(frac1k_i+p-k_iB_(ip-1k)(t)-frac1k_i+p+1-k_i+1B_(i+1p-1k)(t)right)\n\nbsplinebasis′₋₀(P, i, t) is equivalent to bsplinebasis₋₀(derivative(P), i, t).\n\n\n\n\n\n","category":"function"},{"location":"math-derivative/","page":"Derivative","title":"Derivative","text":"bsplinebasis′","category":"page"},{"location":"math-derivative/#BasicBSpline.bsplinebasis′","page":"Derivative","title":"BasicBSpline.bsplinebasis′","text":"bsplinebasis′(::AbstractFunctionSpace, ::Integer, ::Real) -> Real\n\n1st derivative of B-spline basis function. Modified version.\n\ndotB_(ipk)(t)\n=pleft(frac1k_i+p-k_iB_(ip-1k)(t)-frac1k_i+p+1-k_i+1B_(i+1p-1k)(t)right)\n\nbsplinebasis′(P, i, t) is equivalent to bsplinebasis(derivative(P), i, t).\n\n\n\n\n\n","category":"function"},{"location":"plotlyjs/#PlotlyJS.jl","page":"PlotlyJS.jl","title":"PlotlyJS.jl","text":"","category":"section"},{"location":"plotlyjs/#Cardioid","page":"PlotlyJS.jl","title":"Cardioid","text":"","category":"section"},{"location":"plotlyjs/","page":"PlotlyJS.jl","title":"PlotlyJS.jl","text":"using BasicBSpline\nusing BasicBSplineFitting\nusing StaticArrays\nusing PlotlyJS\nf(t) = SVector((1+cos(t))*cos(t),(1+cos(t))*sin(t))\np = 3\nk = KnotVector(range(0,2π,15)) + p * KnotVector([0,2π]) + 2 * KnotVector([π])\nP = BSplineSpace{p}(k)\na = fittingcontrolpoints(f, P)\nM = BSplineManifold(a, P)\n\nts = range(0,2π,250)\nxs_a = getindex.(a,1)\nys_a = getindex.(a,2)\nxs_f = getindex.(M.(ts),1)\nys_f = getindex.(M.(ts),2)\nfig = Plot(scatter(x=xs_a, y=ys_a, name=\"control points\", line_color=\"blue\", marker_size=8))\naddtraces!(fig, scatter(x=xs_f, y=ys_f, name=\"B-spline curve\", mode=\"lines\", line_color=\"red\"))\nrelayout!(fig, width=500, height=500)\nsavefig(fig,\"cardioid.html\") # hide\nnothing # hide","category":"page"},{"location":"plotlyjs/","page":"PlotlyJS.jl","title":"PlotlyJS.jl","text":"","category":"page"},{"location":"plotlyjs/#Helix","page":"PlotlyJS.jl","title":"Helix","text":"","category":"section"},{"location":"plotlyjs/","page":"PlotlyJS.jl","title":"PlotlyJS.jl","text":"using BasicBSpline\nusing BasicBSplineFitting\nusing StaticArrays\nusing PlotlyJS\nf(t) = SVector(cos(t),sin(t),t)\np = 3\nk = KnotVector(range(0,6π,15)) + p * KnotVector([0,6π])\nP = BSplineSpace{p}(k)\na = fittingcontrolpoints(f, P)\nM = BSplineManifold(a, P)\n\nts = range(0,6π,250)\nxs_a = getindex.(a,1)\nys_a = getindex.(a,2)\nzs_a = getindex.(a,3)\nxs_f = getindex.(M.(ts),1)\nys_f = getindex.(M.(ts),2)\nzs_f = getindex.(M.(ts),3)\nfig = Plot(scatter3d(x=xs_a, y=ys_a, z=zs_a, name=\"control points\", line_color=\"blue\", marker_size=8))\naddtraces!(fig, scatter3d(x=xs_f, y=ys_f, z=zs_f, name=\"B-spline curve\", mode=\"lines\", line_color=\"red\"))\nrelayout!(fig, width=500, height=500)\nsavefig(fig,\"helix.html\") # hide\nnothing # hide","category":"page"},{"location":"plotlyjs/","page":"PlotlyJS.jl","title":"PlotlyJS.jl","text":"","category":"page"},{"location":"internal/#Private-API","page":"Private API","title":"Private API","text":"","category":"section"},{"location":"internal/","page":"Private API","title":"Private API","text":"Note that the following methods are considered private methods, and changes in their behavior are not considered breaking changes.","category":"page"},{"location":"internal/","page":"Private API","title":"Private API","text":"BasicBSpline.r_nomial","category":"page"},{"location":"internal/#BasicBSpline.r_nomial","page":"Private API","title":"BasicBSpline.r_nomial","text":"Calculate r-nomial coefficient\n\nr_nomial(n, k, r)\n\n(1+x+cdots+x^r)^n = sum_k a_nkr x^k\n\n\n\n\n\n","category":"function"},{"location":"internal/","page":"Private API","title":"Private API","text":"BasicBSpline._vec","category":"page"},{"location":"internal/#BasicBSpline._vec","page":"Private API","title":"BasicBSpline._vec","text":"Convert AbstractKnotVector to AbstractVector\n\n\n\n\n\n","category":"function"},{"location":"internal/","page":"Private API","title":"Private API","text":"BasicBSpline._lower_R","category":"page"},{"location":"internal/#BasicBSpline._lower_R","page":"Private API","title":"BasicBSpline._lower_R","text":"Internal methods for obtaining a B-spline space with one degree lower.\n\nbeginaligned\nmathcalPpk mapsto mathcalPp-1k \nD^rmathcalPpk mapsto D^r-1mathcalPp-1k\nendaligned\n\n\n\n\n\n","category":"function"},{"location":"internal/","page":"Private API","title":"Private API","text":"BasicBSpline._changebasis_sim","category":"page"},{"location":"internal/#BasicBSpline._changebasis_sim","page":"Private API","title":"BasicBSpline._changebasis_sim","text":"Return a coefficient matrix A which satisfy\n\nB_(ip_1k_1) = sum_jA_ijB_(jp_2k_2)\n\nAssumption:\n\nP_1 P_2\n\n\n\n\n\n","category":"function"},{"location":"internal/","page":"Private API","title":"Private API","text":"BasicBSplineFitting.innerproduct_R","category":"page"},{"location":"internal/#BasicBSplineFitting.innerproduct_R","page":"Private API","title":"BasicBSplineFitting.innerproduct_R","text":"Calculate a matrix\n\nA_ij=int_mathbbR B_(ipk)(t) B_(jpk)(t) dt\n\n\n\n\n\n","category":"function"},{"location":"internal/","page":"Private API","title":"Private API","text":"BasicBSplineFitting.innerproduct_I","category":"page"},{"location":"internal/#BasicBSplineFitting.innerproduct_I","page":"Private API","title":"BasicBSplineFitting.innerproduct_I","text":"Calculate a matrix\n\nA_ij=int_I B_(ipk)(t) B_(jpk)(t) dt\n\n\n\n\n\n","category":"function"},{"location":"math-inclusive/#Inclusive-relation-between-B-spline-spaces","page":"Inclusive relationship","title":"Inclusive relation between B-spline spaces","text":"","category":"section"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"info: Thm. Inclusive relation between B-spline spaces\nFor non-degenerate B-spline spaces, the following relationship holds.mathcalPpk\nsubseteq mathcalPpk\nLeftrightarrow (m=p-p ge 0 textand k+mwidehatksubseteq k)","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"Base.issubset(P::BSplineSpace{p}, P′::BSplineSpace{p′}) where {p, p′}","category":"page"},{"location":"math-inclusive/#Base.issubset-Union{Tuple{p′}, Tuple{p}, Tuple{BSplineSpace{p, T} where T<:Real, BSplineSpace{p′, T} where T<:Real}} where {p, p′}","page":"Inclusive relationship","title":"Base.issubset","text":"Check inclusive relationship between B-spline spaces.\n\nmathcalPpk\nsubseteqmathcalPpk\n\nExamples\n\njulia> P1 = BSplineSpace{1}(KnotVector([1,3,5,8]));\n\n\njulia> P2 = BSplineSpace{1}(KnotVector([1,3,5,6,8,9]));\n\n\njulia> P3 = BSplineSpace{2}(KnotVector([1,1,3,3,5,5,8,8]));\n\n\njulia> P1 ⊆ P2\ntrue\n\njulia> P1 ⊆ P3\ntrue\n\njulia> P2 ⊆ P3\nfalse\n\njulia> P2 ⊈ P3\ntrue\n\n\n\n\n\n","category":"method"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"Here are plots of the B-spline basis functions of the spaces P1, P2, P3.","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"P1 = BSplineSpace{1}(KnotVector([1,3,5,8]))\nP2 = BSplineSpace{1}(KnotVector([1,3,5,6,8,9]))\nP3 = BSplineSpace{2}(KnotVector([1,1,3,3,5,5,8,8]))\nplot(\n plot([t->bsplinebasis₊₀(P1,i,t) for i in 1:dim(P1)], 1, 9, ylims=(0,1), legend=false),\n plot([t->bsplinebasis₊₀(P2,i,t) for i in 1:dim(P2)], 1, 9, ylims=(0,1), legend=false),\n plot([t->bsplinebasis₊₀(P3,i,t) for i in 1:dim(P3)], 1, 9, ylims=(0,1), legend=false),\n layout=(3,1),\n link=:x\n)\nsavefig(\"subbsplineplot.html\") # hide\nnothing # hide","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"This means, there exists a n times n matrix A which holds:","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"beginaligned\nB_(ipk)\n=sum_jA_ij B_(jpk) \nn=dim(mathcalPpk) \nn=dim(mathcalPpk)\nendaligned","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"You can calculate the change of basis matrix A with changebasis.","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"A12 = changebasis(P1,P2)\nA13 = changebasis(P1,P3)","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"plot(\n plot([t->bsplinebasis₊₀(P1,i,t) for i in 1:dim(P1)], 1, 9, ylims=(0,1), legend=false),\n plot([t->sum(A12[i,j]*bsplinebasis₊₀(P2,j,t) for j in 1:dim(P2)) for i in 1:dim(P1)], 1, 9, ylims=(0,1), legend=false),\n plot([t->sum(A13[i,j]*bsplinebasis₊₀(P3,j,t) for j in 1:dim(P3)) for i in 1:dim(P1)], 1, 9, ylims=(0,1), legend=false),\n layout=(3,1),\n link=:x\n)\nsavefig(\"subbsplineplot2.html\") # hide\nnothing # hide","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"","category":"page"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"changebasis_R","category":"page"},{"location":"math-inclusive/#BasicBSpline.changebasis_R","page":"Inclusive relationship","title":"BasicBSpline.changebasis_R","text":"Return a coefficient matrix A which satisfy\n\nB_(ipk) = sum_jA_ijB_(jpk)\n\nAssumption:\n\nP P^prime\n\n\n\n\n\n","category":"function"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"changebasis_I","category":"page"},{"location":"math-inclusive/#BasicBSpline.changebasis_I","page":"Inclusive relationship","title":"BasicBSpline.changebasis_I","text":"Return a coefficient matrix A which satisfy\n\nB_(ipk) = sum_jA_ijB_(jpk)\n\nAssumption:\n\nP P^prime\n\n\n\n\n\n","category":"function"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"issqsubset","category":"page"},{"location":"math-inclusive/#BasicBSpline.issqsubset","page":"Inclusive relationship","title":"BasicBSpline.issqsubset","text":"Check inclusive relationship between B-spline spaces.\n\nmathcalPpk\nsqsubseteqmathcalPpk\nLeftrightarrow\nmathcalPpk_k_p+1k_l-p\nsubseteqmathcalPpk_k_p+1k_l-p\n\n\n\n\n\n","category":"function"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"expandspace","category":"page"},{"location":"math-inclusive/#BasicBSpline.expandspace","page":"Inclusive relationship","title":"BasicBSpline.expandspace","text":"Expand B-spline space with given additional degree and knotvector. The behavior of expandspace is same as expandspace_I.\n\n\n\n\n\n","category":"function"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"expandspace_R","category":"page"},{"location":"math-inclusive/#BasicBSpline.expandspace_R","page":"Inclusive relationship","title":"BasicBSpline.expandspace_R","text":"Expand B-spline space with given additional degree and knotvector. This function is compatible with issubset (⊆).\n\nExamples\n\njulia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]);\n\n\njulia> P = BSplineSpace{2}(k);\n\n\njulia> P′ = expandspace_R(P, Val(1), KnotVector([6.0]))\nBSplineSpace{3, Float64, KnotVector{Float64}}(KnotVector([0.0, 0.0, 1.5, 1.5, 2.5, 2.5, 5.5, 5.5, 6.0, 8.0, 8.0, 9.0, 9.0, 9.5, 9.5, 10.0, 10.0]))\n\njulia> P ⊆ P′\ntrue\n\njulia> P ⊑ P′\nfalse\n\njulia> domain(P)\n2.5 .. 9.0\n\njulia> domain(P′)\n1.5 .. 9.5\n\n\n\n\n\n","category":"function"},{"location":"math-inclusive/","page":"Inclusive relationship","title":"Inclusive relationship","text":"expandspace_I","category":"page"},{"location":"math-inclusive/#BasicBSpline.expandspace_I","page":"Inclusive relationship","title":"BasicBSpline.expandspace_I","text":"Expand B-spline space with given additional degree and knotvector. This function is compatible with issqsubset (⊑)\n\nExamples\n\njulia> k = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0]);\n\n\njulia> P = BSplineSpace{2}(k);\n\n\njulia> P′ = expandspace_I(P, Val(1), KnotVector([6.0]))\nBSplineSpace{3, Float64, KnotVector{Float64}}(KnotVector([0.0, 1.5, 2.5, 2.5, 5.5, 5.5, 6.0, 8.0, 8.0, 9.0, 9.0, 9.5, 10.0]))\n\njulia> P ⊆ P′\nfalse\n\njulia> P ⊑ P′\ntrue\n\njulia> domain(P)\n2.5 .. 9.0\n\njulia> domain(P′)\n2.5 .. 9.0\n\n\n\n\n\n","category":"function"},{"location":"math/#Mathematical-properties-of-B-spline","page":"Introduction","title":"Mathematical properties of B-spline","text":"","category":"section"},{"location":"math/#Introduction","page":"Introduction","title":"Introduction","text":"","category":"section"},{"location":"math/","page":"Introduction","title":"Introduction","text":"B-spline is a mathematical object, and it has a lot of application. (e.g. Geometric representation: NURBS, Interpolation, Numerical analysis: IGA)","category":"page"},{"location":"math/","page":"Introduction","title":"Introduction","text":"In this page, we'll explain the mathematical definitions and properties of B-spline with Julia code. Before running the code in the following section, you need to import packages:","category":"page"},{"location":"math/","page":"Introduction","title":"Introduction","text":"using BasicBSpline\nusing Plots; plotly()","category":"page"},{"location":"math/#Notice","page":"Introduction","title":"Notice","text":"","category":"section"},{"location":"math/","page":"Introduction","title":"Introduction","text":"Some of notations in this page are our original, but these are well-considered results.","category":"page"},{"location":"math/#References","page":"Introduction","title":"References","text":"","category":"section"},{"location":"math/","page":"Introduction","title":"Introduction","text":"Most of this documentation around B-spline is self-contained. If you want to learn more, the following resources are recommended.","category":"page"},{"location":"math/","page":"Introduction","title":"Introduction","text":"\"Geometric Modeling with Splines\" by Elaine Cohen, Richard F. Riesenfeld, Gershon Elber\n\"Spline Functions: Basic Theory\" by Larry Schumaker","category":"page"},{"location":"math/","page":"Introduction","title":"Introduction","text":"日本語の文献では以下がおすすめです。","category":"page"},{"location":"math/","page":"Introduction","title":"Introduction","text":"スプライン関数とその応用 by 市田浩三, 吉本富士市\nNURBS多様体による形状表現\nBasicBSpline.jlを作ったので宣伝です!\nB-spline入門(線形代数がすこし分かる人向け)","category":"page"},{"location":"math-bsplinemanifold/#B-spline-manifold","page":"B-spline manifold","title":"B-spline manifold","text":"","category":"section"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"math-bsplinemanifold/#Multi-dimensional-B-spline","page":"B-spline manifold","title":"Multi-dimensional B-spline","text":"","category":"section"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"info: Thm. Basis of tensor product of B-spline spaces\nThe tensor product of B-spline spaces mathcalPp^1k^1otimesmathcalPp^2k^2 is a linear space with the following basis.mathcalPp^1k^1otimesmathcalPp^2k^2\n= operatorname*span_ij (B_(ip^1k^1) otimes B_(jp^2k^2))where the basis are defined as(B_(ip^1k^1) otimes B_(jp^2k^2))(t^1 t^2)\n= B_(ip^1k^1)(t^1) cdot B_(jp^2k^2)(t^2)","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"Higher dimensional tensor products mathcalPp^1k^1otimescdotsotimesmathcalPp^dk^d are defined similarly.","category":"page"},{"location":"math-bsplinemanifold/#B-spline-manifold-2","page":"B-spline manifold","title":"B-spline manifold","text":"","category":"section"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"B-spline manifold is a parametric representation of a shape.","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"tip: Def. B-spline manifold\nFor given d-dimensional B-spline basis functions B_(i^1p^1k^1) otimes cdots otimes B_(i^dp^dk^d) and given points bma_i^1 dots i^d in V, B-spline manifold is defined by the following equality:bmp(t^1dotst^dbma_i^1 dots i^d)\n=sum_i^1dotsi^d(B_(i^1p^1k^1) otimes cdots otimes B_(i^dp^dk^d))(t^1dotst^d) bma_i^1 dots i^dWhere bma_i^1 dots i^d are called control points.","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"We will also write bmp(t^1dotst^d bma), bmp(t^1dotst^d), bmp(t bma) or bmp(t) for simplicity.","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"Note that the BSplineManifold objects are callable, and the arguments will be checked if it fits in the domain of BSplineSpace.","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"BSplineManifold","category":"page"},{"location":"math-bsplinemanifold/#BasicBSpline.BSplineManifold","page":"B-spline manifold","title":"BasicBSpline.BSplineManifold","text":"Construct B-spline manifold from given control points and B-spline spaces.\n\nExamples\n\njulia> using StaticArrays\n\njulia> P = BSplineSpace{2}(KnotVector([0,0,0,1,1,1]))\nBSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([0, 0, 0, 1, 1, 1]))\n\njulia> a = [SVector(1,0), SVector(1,1), SVector(0,1)]\n3-element Vector{SVector{2, Int64}}:\n [1, 0]\n [1, 1]\n [0, 1]\n\njulia> M = BSplineManifold(a, P);\n\n\njulia> M(0.4)\n2-element SVector{2, Float64} with indices SOneTo(2):\n 0.84\n 0.64\n\njulia> M(1.2)\nERROR: DomainError with 1.2:\nThe input 1.2 is out of range.\n[...]\n\n\n\n\n\n","category":"type"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"If you need extension of BSplineManifold or don't need the arguments check, you can call unbounded_mapping.","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"unbounded_mapping","category":"page"},{"location":"math-bsplinemanifold/#BasicBSpline.unbounded_mapping","page":"B-spline manifold","title":"BasicBSpline.unbounded_mapping","text":"unbounded_mapping(M::BSplineManifold{Dim}, t::Vararg{Real,Dim})\n\nExamples\n\njulia> P = BSplineSpace{1}(KnotVector([0,0,1,1]))\nBSplineSpace{1, Int64, KnotVector{Int64}}(KnotVector([0, 0, 1, 1]))\n\njulia> domain(P)\n0 .. 1\n\njulia> M = BSplineManifold([0,1], P);\n\n\njulia> unbounded_mapping(M, 0.1)\n0.1\n\njulia> M(0.1)\n0.1\n\njulia> unbounded_mapping(M, 1.2)\n1.2\n\njulia> M(1.2)\nERROR: DomainError with 1.2:\nThe input 1.2 is out of range.\n[...]\n\n\n\n\n\n","category":"function"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"unbounded_mapping(M,t...) is a little bit faster than M(t...) because it does not check the domain.","category":"page"},{"location":"math-bsplinemanifold/#B-spline-curve","page":"B-spline manifold","title":"B-spline curve","text":"","category":"section"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"## 1-dim B-spline manifold\np = 2 # degree of polynomial\nk = KnotVector(1:12) # knot vector\nP = BSplineSpace{p}(k) # B-spline space\na = [SVector(i-5, 3*sin(i^2)) for i in 1:dim(P)] # control points\nM = BSplineManifold(a, P) # Define B-spline manifold\nplot(M)\nsavefig(\"1dim-manifold.html\") # hide\nnothing # hide","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"","category":"page"},{"location":"math-bsplinemanifold/#B-spline-surface","page":"B-spline manifold","title":"B-spline surface","text":"","category":"section"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"## 2-dim B-spline manifold\np = 2 # degree of polynomial\nk = KnotVector(1:8) # knot vector\nP = BSplineSpace{p}(k) # B-spline space\nrand_a = [SVector(rand(), rand(), rand()) for i in 1:dim(P), j in 1:dim(P)]\na = [SVector(2*i-6.5, 2*j-6.5, 0) for i in 1:dim(P), j in 1:dim(P)] + rand_a # random generated control points\nM = BSplineManifold(a,(P,P)) # Define B-spline manifold\nplot(M)\nsavefig(\"2dim-manifold.html\") # hide\nnothing # hide","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"","category":"page"},{"location":"math-bsplinemanifold/#Affine-commutativity","page":"B-spline manifold","title":"Affine commutativity","text":"","category":"section"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"info: Thm. Affine commutativity\nLet T be a affine transform V to W, then the following equality holds.T(bmp(t bma))\n=bmp(t T(bma))","category":"page"},{"location":"math-bsplinemanifold/#Fixing-arguments-(currying)","page":"B-spline manifold","title":"Fixing arguments (currying)","text":"","category":"section"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"Just like fixing first index such as A[3,:]::Array{1} for matrix A::Array{2}, fixing first argument M(4.3,:) will create BSplineManifold{1} for B-spline surface M::BSplineManifold{2}.","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"p = 2;\nk = KnotVector(1:8);\nP = BSplineSpace{p}(k);\na = [SVector(5i+5j+rand(), 5i-5j+rand(), rand()) for i in 1:dim(P), j in 1:dim(P)];\nM = BSplineManifold(a,(P,P));\nM isa BSplineManifold{2}\nM(:,:) isa BSplineManifold{2}\nM(4.3,:) isa BSplineManifold{1} # Fix first argument","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"plot(M)\nplot!(M(4.3,:), linewidth = 5, color=:cyan)\nplot!(M(4.4,:), linewidth = 5, color=:red)\nplot!(M(:,5.2), linewidth = 5, color=:green)\nsavefig(\"2dim-manifold-currying.html\") # hide\nnothing # hide","category":"page"},{"location":"math-bsplinemanifold/","page":"B-spline manifold","title":"B-spline manifold","text":"","category":"page"},{"location":"math-bsplinespace/#B-spline-space","page":"B-spline space","title":"B-spline space","text":"","category":"section"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"math-bsplinespace/#Defnition","page":"B-spline space","title":"Defnition","text":"","category":"section"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"Before defining B-spline space, we'll define polynomial space with degree p.","category":"page"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"tip: Def. Polynomial space\nPolynomial space with degree p.mathcalPp\n=leftfmathbbRtomathbbR tmapsto a_0+a_1t^1+cdots+a_pt^p left \n a_iin mathbbR\n right\nrightThis space mathcalPp is a (p+1)-dimensional linear space.","category":"page"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"Note that tmapsto t^i_0 le i le p is a basis of mathcalPp, and also the set of Bernstein polynomial B_(ip)_i is a basis of mathcalPp.","category":"page"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"beginaligned\nB_(ip)(t)\n=binompi-1t^i-1(1-t)^p-i+1\n(i=1 dots p+1)\nendaligned","category":"page"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"Where binompi-1 is a binomial coefficient. You can try Bernstein polynomial on desmos graphing calculator!","category":"page"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"tip: Def. B-spline space\nFor given polynomial degree pge 0 and knot vector k=(k_1dotsk_l), B-spline space mathcalPpk is defined as follows:mathcalPpk\n=leftfmathbbRtomathbbR left \n begingathered\n operatornamesupp(f)subseteq k_1 k_l \n exists tildefinmathcalPp f_k_i k_i+1) = tildef_k_i k_i+1) \n forall t in mathbbR exists delta 0 f_(t-deltat+delta)in C^p-mathfrakn_k(t)\n endgathered right\nright","category":"page"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"Note that each element of the space mathcalPpk is a piecewise polynomial.","category":"page"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"[TODO: fig]","category":"page"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"BSplineSpace","category":"page"},{"location":"math-bsplinespace/#BasicBSpline.BSplineSpace","page":"B-spline space","title":"BasicBSpline.BSplineSpace","text":"Construct B-spline space from given polynominal degree and knot vector.\n\nmathcalPpk\n\nExamples\n\njulia> p = 2\n2\n\njulia> k = KnotVector([1,3,5,6,8,9])\nKnotVector([1, 3, 5, 6, 8, 9])\n\njulia> BSplineSpace{p}(k)\nBSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([1, 3, 5, 6, 8, 9]))\n\n\n\n\n\n","category":"type"},{"location":"math-bsplinespace/#Degeneration","page":"B-spline space","title":"Degeneration","text":"","category":"section"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"tip: Def. Degeneration\nA B-spline space is said to be non-degenerate if its degree and knot vector satisfies following property:beginaligned\nk_ik_i+p+1 (1 le i le l-p-1)\nendaligned","category":"page"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"isnondegenerate","category":"page"},{"location":"math-bsplinespace/#BasicBSpline.isnondegenerate","page":"B-spline space","title":"BasicBSpline.isnondegenerate","text":"Check if given B-spline space is non-degenerate.\n\nExamples\n\njulia> isnondegenerate(BSplineSpace{2}(KnotVector([1,3,5,6,8,9])))\ntrue\n\njulia> isnondegenerate(BSplineSpace{1}(KnotVector([1,3,3,3,8,9])))\nfalse\n\n\n\n\n\n","category":"function"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"isdegenerate(P::BSplineSpace)","category":"page"},{"location":"math-bsplinespace/#BasicBSpline.isdegenerate-Tuple{BSplineSpace}","page":"B-spline space","title":"BasicBSpline.isdegenerate","text":"Check if given B-spline space is degenerate.\n\nExamples\n\njulia> isdegenerate(BSplineSpace{2}(KnotVector([1,3,5,6,8,9])))\nfalse\n\njulia> isdegenerate(BSplineSpace{1}(KnotVector([1,3,3,3,8,9])))\ntrue\n\n\n\n\n\n","category":"method"},{"location":"math-bsplinespace/#Dimensions","page":"B-spline space","title":"Dimensions","text":"","category":"section"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"info: Thm. Dimension of B-spline space\nThe B-spline space is a linear space, and if a B-spline space is non-degenerate, its dimension is calculated by:dim(mathcalPpk)= k - p -1","category":"page"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"dim","category":"page"},{"location":"math-bsplinespace/#BasicBSpline.dim","page":"B-spline space","title":"BasicBSpline.dim","text":"Return dimention of a B-spline space.\n\ndim(mathcalPpk)\n= k - p -1\n\nExamples\n\njulia> dim(BSplineSpace{1}(KnotVector([1,2,3,4,5,6,7])))\n5\n\njulia> dim(BSplineSpace{1}(KnotVector([1,2,4,4,4,6,7])))\n5\n\njulia> dim(BSplineSpace{1}(KnotVector([1,2,3,5,5,5,7])))\n5\n\n\n\n\n\n","category":"function"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"exactdim_R(P::BSplineSpace)","category":"page"},{"location":"math-bsplinespace/#BasicBSpline.exactdim_R-Tuple{BSplineSpace}","page":"B-spline space","title":"BasicBSpline.exactdim_R","text":"Exact dimension of a B-spline space.\n\nExamples\n\njulia> exactdim_R(BSplineSpace{1}(KnotVector([1,2,3,4,5,6,7])))\n5\n\njulia> exactdim_R(BSplineSpace{1}(KnotVector([1,2,4,4,4,6,7])))\n4\n\njulia> exactdim_R(BSplineSpace{1}(KnotVector([1,2,3,5,5,5,7])))\n4\n\n\n\n\n\n","category":"method"},{"location":"math-bsplinespace/","page":"B-spline space","title":"B-spline space","text":"exactdim_I(P::BSplineSpace)","category":"page"},{"location":"math-bsplinespace/#BasicBSpline.exactdim_I-Tuple{BSplineSpace}","page":"B-spline space","title":"BasicBSpline.exactdim_I","text":"Exact dimension of a B-spline space.\n\nExamples\n\njulia> exactdim_I(BSplineSpace{1}(KnotVector([1,2,3,4,5,6,7])))\n5\n\njulia> exactdim_I(BSplineSpace{1}(KnotVector([1,2,4,4,4,6,7])))\n4\n\njulia> exactdim_I(BSplineSpace{1}(KnotVector([1,2,3,5,5,5,7])))\n3\n\n\n\n\n\n","category":"method"},{"location":"math-rationalbsplinemanifold/#Rational-B-spline-manifold","page":"Rational B-spline manifold","title":"Rational B-spline manifold","text":"","category":"section"},{"location":"math-rationalbsplinemanifold/","page":"Rational B-spline manifold","title":"Rational B-spline manifold","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\nusing Plots; plotly()","category":"page"},{"location":"math-rationalbsplinemanifold/","page":"Rational B-spline manifold","title":"Rational B-spline manifold","text":"Non-uniform rational basis spline (NURBS) is also supported in BasicBSpline.jl package.","category":"page"},{"location":"math-rationalbsplinemanifold/#Rational-B-spline-manifold-2","page":"Rational B-spline manifold","title":"Rational B-spline manifold","text":"","category":"section"},{"location":"math-rationalbsplinemanifold/","page":"Rational B-spline manifold","title":"Rational B-spline manifold","text":"Rational B-spline manifold is a parametric representation of a shape.","category":"page"},{"location":"math-rationalbsplinemanifold/","page":"Rational B-spline manifold","title":"Rational B-spline manifold","text":"tip: Def. Rational B-spline manifold\nFor given d-dimensional B-spline basis functions B_(i^1p^1k^1) otimes cdots otimes B_(i^dp^dk^d), given points bma_i^1 dots i^d in V and real numbers w_i^1 dots i^d 0, rational B-spline manifold is defined by the following equality:bmp(t^1dotst^d bma_i^1 dots i^d w_i^1 dots i^d)\n=sum_i^1dotsi^d\nfrac(B_(i^1p^1k^1) otimes cdots otimes B_(i^dp^dk^d))(t^1dotst^d) w_i^1 dots i^d\nsumlimits_j^1dotsj^d(B_(j^1p^1k^1) otimes cdots otimes B_(j^dp^dk^d))(t^1dotst^d) w_j^1 dots j^d\nbma_i^1 dots i^dWhere bma_i^1dotsi^d are called control points, and w_i^1 dots i^d are called weights.","category":"page"},{"location":"math-rationalbsplinemanifold/","page":"Rational B-spline manifold","title":"Rational B-spline manifold","text":"RationalBSplineManifold","category":"page"},{"location":"math-rationalbsplinemanifold/#BasicBSpline.RationalBSplineManifold","page":"Rational B-spline manifold","title":"BasicBSpline.RationalBSplineManifold","text":"Construct Rational B-spline manifold from given control points, weights and B-spline spaces.\n\nExamples\n\njulia> using StaticArrays, LinearAlgebra\n\njulia> P = BSplineSpace{2}(KnotVector([0,0,0,1,1,1]))\nBSplineSpace{2, Int64, KnotVector{Int64}}(KnotVector([0, 0, 0, 1, 1, 1]))\n\njulia> w = [1, 1/√2, 1]\n3-element Vector{Float64}:\n 1.0\n 0.7071067811865475\n 1.0\n\njulia> a = [SVector(1,0), SVector(1,1), SVector(0,1)]\n3-element Vector{SVector{2, Int64}}:\n [1, 0]\n [1, 1]\n [0, 1]\n\njulia> M = RationalBSplineManifold(a,w,P); # 1/4 arc\n\n\njulia> M(0.3)\n2-element SVector{2, Float64} with indices SOneTo(2):\n 0.8973756499953727\n 0.4412674277525845\n\njulia> norm(M(0.3))\n1.0\n\n\n\n\n\n","category":"type"},{"location":"math-rationalbsplinemanifold/#Properties","page":"Rational B-spline manifold","title":"Properties","text":"","category":"section"},{"location":"math-rationalbsplinemanifold/","page":"Rational B-spline manifold","title":"Rational B-spline manifold","text":"Similar to BSplineManifold, RationalBSplineManifold supports the following methods and properties.","category":"page"},{"location":"math-rationalbsplinemanifold/","page":"Rational B-spline manifold","title":"Rational B-spline manifold","text":"currying\nrefinement\nAffine commutativity","category":"page"},{"location":"geometricmodeling/#Geometric-modeling","page":"Geometric modeling","title":"Geometric modeling","text":"","category":"section"},{"location":"geometricmodeling/#Load-packages","page":"Geometric modeling","title":"Load packages","text":"","category":"section"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"using BasicBSpline\nusing StaticArrays\nusing Plots\nusing LinearAlgebra\nplotly()","category":"page"},{"location":"geometricmodeling/#Arc","page":"Geometric modeling","title":"Arc","text":"","category":"section"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"p = 2\nk = KnotVector([0,0,0,1,1,1])\nP = BSplineSpace{p}(k)\nt = 1 # angle in radians\na = [SVector(1,0), SVector(1,tan(t/2)), SVector(cos(t),sin(t))]\nw = [1,cos(t/2),1]\nM = RationalBSplineManifold(a,w,P)\nplot(M, xlims=(0,1.1), ylims=(0,1.1), aspectratio=1)\nsavefig(\"geometricmodeling-arc.html\") # hide\nnothing # hide","category":"page"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"","category":"page"},{"location":"geometricmodeling/#Circle","page":"Geometric modeling","title":"Circle","text":"","category":"section"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"p = 2\nk = KnotVector([0,0,0,1,1,2,2,3,3,4,4,4])\nP = BSplineSpace{p}(k)\na = [\n SVector( 1, 0),\n SVector( 1, 1),\n SVector( 0, 1),\n SVector(-1, 1),\n SVector(-1, 0),\n SVector(-1,-1),\n SVector( 0,-1),\n SVector( 1,-1),\n SVector( 1, 0)\n]\nw = [1,1/√2,1,1/√2,1,1/√2,1,1/√2,1]\nM = RationalBSplineManifold(a,w,P)\nplot(M, xlims=(-1.2,1.2), ylims=(-1.2,1.2), aspectratio=1)\nsavefig(\"geometricmodeling-circle.html\") # hide\nnothing # hide","category":"page"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"","category":"page"},{"location":"geometricmodeling/#Torus","page":"Geometric modeling","title":"Torus","text":"","category":"section"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"R = 3\nr = 1\n\na0 = [\n SVector( 1, 0, 0),\n SVector( 1, 1, 0),\n SVector( 0, 1, 0),\n SVector(-1, 1, 0),\n SVector(-1, 0, 0),\n SVector(-1,-1, 0),\n SVector( 0,-1, 0),\n SVector( 1,-1, 0),\n SVector( 1, 0, 0)\n]\n\na1 = (R+r)*a0\na5 = (R-r)*a0\na2 = [p+r*SVector(0,0,1) for p in a1]\na3 = [p+r*SVector(0,0,1) for p in R*a0]\na4 = [p+r*SVector(0,0,1) for p in a5]\na6 = [p-r*SVector(0,0,1) for p in a5]\na7 = [p-r*SVector(0,0,1) for p in R*a0]\na8 = [p-r*SVector(0,0,1) for p in a1]\na9 = a1\n\na = hcat(a1,a2,a3,a4,a5,a6,a7,a8,a9)\nM = RationalBSplineManifold(a,w*w',P,P)\nplot(M)\nsavefig(\"geometricmodeling-torus.html\") # hide\nnothing # hide","category":"page"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"","category":"page"},{"location":"geometricmodeling/#Paraboloid","page":"Geometric modeling","title":"Paraboloid","text":"","category":"section"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"p = 2\nk = KnotVector([-1,-1,-1,1,1,1])\nP = BSplineSpace{p}(k)\na = [SVector(i,j,2i^2+2j^2-2) for i in -1:1, j in -1:1]\nM = BSplineManifold(a,P,P)\nplot(M)\nsavefig(\"geometricmodeling-paraboloid.html\") # hide\nnothing # hide","category":"page"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"","category":"page"},{"location":"geometricmodeling/#Hyperbolic-paraboloid","page":"Geometric modeling","title":"Hyperbolic paraboloid","text":"","category":"section"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"a = [SVector(i,j,2i^2-2j^2) for i in -1:1, j in -1:1]\nM = BSplineManifold(a,P,P)\nplot(M)\nsavefig(\"geometricmodeling-hyperbolicparaboloid.html\") # hide\nnothing # hide","category":"page"},{"location":"geometricmodeling/","page":"Geometric modeling","title":"Geometric modeling","text":"","category":"page"},{"location":"#BasicBSpline.jl","page":"Home","title":"BasicBSpline.jl","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Basic (mathematical) operations for B-spline functions and related things with Julia.","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: Stable) (Image: Dev) (Image: Build Status) (Image: Coverage) (Image: Aqua QA) (Image: DOI) (Image: BasicBSpline Downloads).","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: )","category":"page"},{"location":"#Summary","page":"Home","title":"Summary","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"This package provides basic mathematical operations for B-spline.","category":"page"},{"location":"","page":"Home","title":"Home","text":"B-spline basis function\nSome operations for knot vector\nSome operations for B-spline space (piecewise polynomial space)\nB-spline manifold (includes curve, surface and solid)\nRefinement algorithm for B-spline manifold\nFitting control points for a given function","category":"page"},{"location":"#Comparison-to-other-Julia-packages-for-B-spline","page":"Home","title":"Comparison to other Julia packages for B-spline","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"There are several Julia packages for B-spline, and this package distinguishes itself with the following key benefits:","category":"page"},{"location":"","page":"Home","title":"Home","text":"Supports all degrees of polynomials.\nIncludes a refinement algorithm for B-spline manifolds.\nOffers a fitting algorithm using least squares. (BasicBSplineFitting.jl)\nDelivers high-speed performance.\nIs mathematically oriented.","category":"page"},{"location":"","page":"Home","title":"Home","text":"If you have any thoughts, please comment in:","category":"page"},{"location":"","page":"Home","title":"Home","text":"Issue#161\nDiscourse post about BasicBSpline.jl.","category":"page"},{"location":"#Installation","page":"Home","title":"Installation","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Install this package","category":"page"},{"location":"","page":"Home","title":"Home","text":"]add BasicBSpline","category":"page"},{"location":"","page":"Home","title":"Home","text":"To export graphics, use BasicBSplineExporter.jl.","category":"page"},{"location":"","page":"Home","title":"Home","text":"]add https://github.com/hyrodium/BasicBSplineExporter.jl","category":"page"},{"location":"#Example","page":"Home","title":"Example","text":"","category":"section"},{"location":"#B-spline-function","page":"Home","title":"B-spline function","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"using BasicBSpline\nusing Plots\n\nk = KnotVector([0.0, 1.5, 2.5, 5.5, 8.0, 9.0, 9.5, 10.0])\nP0 = BSplineSpace{0}(k) # 0th degree piecewise polynomial space\nP1 = BSplineSpace{1}(k) # 1st degree piecewise polynomial space\nP2 = BSplineSpace{2}(k) # 2nd degree piecewise polynomial space\nP3 = BSplineSpace{3}(k) # 3rd degree piecewise polynomial space\nplot(\n plot([t->bsplinebasis(P0,i,t) for i in 1:dim(P0)], 0, 10, ylims=(0,1), legend=false),\n plot([t->bsplinebasis(P1,i,t) for i in 1:dim(P1)], 0, 10, ylims=(0,1), legend=false),\n plot([t->bsplinebasis(P2,i,t) for i in 1:dim(P2)], 0, 10, ylims=(0,1), legend=false),\n plot([t->bsplinebasis(P3,i,t) for i in 1:dim(P3)], 0, 10, ylims=(0,1), legend=false),\n layout=(2,2),\n)","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: )","category":"page"},{"location":"","page":"Home","title":"Home","text":"Try an interactive graph with Desmos graphing calculator!","category":"page"},{"location":"#B-spline-manifold","page":"Home","title":"B-spline manifold","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"using BasicBSpline\nusing BasicBSplineExporter\nusing StaticArrays\n\np = 2 # degree of polynomial\nk1 = KnotVector(1:8) # knot vector\nk2 = KnotVector(rand(7))+(p+1)*KnotVector([1])\nP1 = BSplineSpace{p}(k1) # B-spline space\nP2 = BSplineSpace{p}(k2)\nn1 = dim(P1) # dimension of B-spline space\nn2 = dim(P2)\na = [SVector(2i-6.5+rand(),1.5j-6.5+rand()) for i in 1:dim(P1), j in 1:dim(P2)] # random generated control points\nM = BSplineManifold(a,(P1,P2)) # Define B-spline manifold\nsave_png(\"2dim.png\", M) # save image","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: )","category":"page"},{"location":"#Refinement","page":"Home","title":"Refinement","text":"","category":"section"},{"location":"#h-refinement","page":"Home","title":"h-refinement","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"k₊=(KnotVector([3.3,4.2]),KnotVector([0.3,0.5])) # additional knot vectors\nM_h = refinement(M, k₊) # refinement of B-spline manifold\nsave_png(\"2dim_h-refinement.png\", M_h) # save image","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: )","category":"page"},{"location":"","page":"Home","title":"Home","text":"Note that this shape and the last shape are equivalent.","category":"page"},{"location":"#p-refinement","page":"Home","title":"p-refinement","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"p₊=(Val(1),Val(2)) # additional degrees\nM_p = refinement(M, p₊) # refinement of B-spline manifold\nsave_png(\"2dim_p-refinement.png\", M_p) # save image","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: )","category":"page"},{"location":"","page":"Home","title":"Home","text":"Note that this shape and the last shape are equivalent.","category":"page"},{"location":"#Fitting-B-spline-manifold","page":"Home","title":"Fitting B-spline manifold","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"Try on Desmos graphing calculator!","category":"page"},{"location":"","page":"Home","title":"Home","text":"using BasicBSplineFitting\n\np1 = 2\np2 = 2\nk1 = KnotVector(-10:10)+p1*KnotVector([-10,10])\nk2 = KnotVector(-10:10)+p2*KnotVector([-10,10])\nP1 = BSplineSpace{p1}(k1)\nP2 = BSplineSpace{p2}(k2)\n\nf(u1, u2) = SVector(2u1 + sin(u1) + cos(u2) + u2 / 2, 3u2 + sin(u2) + sin(u1) / 2 + u1^2 / 6) / 5\n\na = fittingcontrolpoints(f, (P1, P2))\nM = BSplineManifold(a, (P1, P2))\nsave_png(\"fitting.png\", M, unitlength=50, xlims=(-10,10), ylims=(-10,10))","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: ) (Image: )","category":"page"},{"location":"","page":"Home","title":"Home","text":"If the knot vector span is too coarse, the approximation will be coarse.","category":"page"},{"location":"","page":"Home","title":"Home","text":"p1 = 2\np2 = 2\nk1 = KnotVector(-10:5:10)+p1*KnotVector([-10,10])\nk2 = KnotVector(-10:5:10)+p2*KnotVector([-10,10])\nP1 = BSplineSpace{p1}(k1)\nP2 = BSplineSpace{p2}(k2)\n\nf(u1, u2) = SVector(2u1 + sin(u1) + cos(u2) + u2 / 2, 3u2 + sin(u2) + sin(u1) / 2 + u1^2 / 6) / 5\n\na = fittingcontrolpoints(f, (P1, P2))\nM = BSplineManifold(a, (P1, P2))\nsave_png(\"fitting_coarse.png\", M, unitlength=50, xlims=(-10,10), ylims=(-10,10))","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: )","category":"page"},{"location":"#Draw-smooth-vector-graphics","page":"Home","title":"Draw smooth vector graphics","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"p = 3\nk = KnotVector(range(-2π,2π,length=8))+p*KnotVector(-2π,2π)\nP = BSplineSpace{p}(k)\n\nf(u) = SVector(u,sin(u))\n\na = fittingcontrolpoints(f, P)\nM = BSplineManifold(a, P)\nsave_svg(\"sine-curve.svg\", M, unitlength=50, xlims=(-2,2), ylims=(-8,8))\nsave_svg(\"sine-curve_no-points.svg\", M, unitlength=50, xlims=(-2,2), ylims=(-8,8), points=false)","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: ) (Image: )","category":"page"},{"location":"","page":"Home","title":"Home","text":"This is useful when you edit graphs (or curves) with your favorite vector graphics editor.","category":"page"},{"location":"","page":"Home","title":"Home","text":"(Image: )","category":"page"},{"location":"","page":"Home","title":"Home","text":"See Plotting smooth graphs with Julia for more tutorials.","category":"page"}] } diff --git a/dev/subbsplineplot.html b/dev/subbsplineplot.html index c7d37f26e..8f759ac22 100644 --- a/dev/subbsplineplot.html +++ b/dev/subbsplineplot.html @@ -1,7 +1,7 @@ -
    +
    +
    +
    +
    +

    Geometric modeling

    Load packages

    using BasicBSpline
    +Geometric modeling · BasicBSpline.jl

    Geometric modeling

    Load packages

    using BasicBSpline
     using StaticArrays
     using Plots
     using LinearAlgebra
    @@ -60,4 +60,4 @@
     M = BSplineManifold(a,P,P)
     plot(M)

    Hyperbolic paraboloid

    a = [SVector(i,j,2i^2-2j^2) for i in -1:1, j in -1:1]
     M = BSplineManifold(a,P,P)
    -plot(M)
    +plot(M)