# nurbs: NURBS

[ bsd3, geometry, library, linear-algebra, math ] [ Propose Tags ]

Simple NURBS library with support of NURBS, periodic NURBS, knot insertion-removal, NURBS split-joint

import Control.Lens
import Linear.NURBS
import Linear.V2
import Test.Hspec

-- | Simple NURBS of degree 3
test₁ ∷ NURBS V2 Double
test₁ = nurbs 3 [
V2 0.0 0.0,
V2 10.0 0.0,
V2 10.0 10.0,
V2 20.0 20.0,
V2 0.0 20.0,
V2 (-20.0) 0.0]

-- | Another NURBS of degree 3
test₂ ∷ NURBS V2 Double
test₂ = nurbs 3 [
V2 (-20.0) 0.0,
V2 (-20.0) (-20.0),
V2 0.0 (-40.0),
V2 20.0 20.0]

-- | Make test₁ periodic
testₒ ∷ NURBS V2 Double
testₒ = set periodic True test₁

main ∷ IO ()
main = hspec $do describe "evaluate point"$ do
it "should start from first control point" $(test₁ eval 0.0) ≃ (test₁ ^?! wpoints . _head . wpoint) it "should end at last control point"$
(test₁ eval 1.0) ≃ (test₁ ^?! wpoints . _last . wpoint)
describe "insert knot" $do it "should not change nurbs curve"$
insertKnots [(1, 0.1), (2, 0.3)] test₁ ≃ test₁
describe "remove knots" $do it "should not change nurbs curve"$
removeKnots [(1, 0.1), (2, 0.3)] (insertKnots [(1, 0.1), (2, 0.3)] test₁) ≃ test₁
describe "purge knots" $do it "should not change nurbs curve"$
purgeKnots (insertKnots [(1, 0.1), (2, 0.6)] test₁) ≃ test₁
describe "split" $do it "should work as cut"$
snd (split 0.4 test₁) ≃ cut (Span 0.4 1.0) test₁
describe "normalize" $do it "should not affect curve"$
cut (Span 0.2 0.8) test₁ ≃ normalizeKnot (cut (Span 0.2 0.8) test₁)
describe "joint" $do it "should joint cutted nurbs"$
uncurry joint (split 0.3 test₁) ≃ Just test₁
it "should cut jointed nurbs" $(cut (Span 0.0 1.0) <$> (test₁ ⊕ test₂)) ≃ Just test₁
it "should cut jointed nurbs" $(cut (Span 1.0 2.0) <$> (test₁ ⊕ test₂)) ≃ Just test₂
describe "periodic" $do it "can be broken into simple nurbs"$
breakLoop 0.0 testₒ ≃ testₒ
it "can be broken in any place" \$
uncurry (flip (⊕)) (split 0.5 (breakLoop 0.0 testₒ)) ≃ Just (breakLoop 0.5 testₒ)
Versions [RSS] [faq] 0.1.0.0, 0.1.1.0 base (>=4.8 && <5), base-unicode-symbols, lens (>=4.12), linear (>=1.19), mtl (>=2.2) [details] BSD-3-Clause Alexanrd voidex Ruchkin voidex@live.com Revision 1 made by AlexandrRuchkin at 2015-08-21T19:45:49Z Math, Geometry, Linear Algebra https://github.com/mvoidex/nurbs head: git clone git://github.com/mvoidex/nurbs by AlexandrRuchkin at 2015-08-21T19:43:40Z NixOS:0.1.1.0 1531 total (16 in the last 30 days) (no votes yet) [estimated by Bayesian average] λ λ λ Docs available Last success reported on 2015-09-30

[Index]