Description
NURBS.
Description
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ₒ)