Guest User

Untitled

a guest
Mar 21st, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.14 KB | None | 0 0
  1. (* data for B-spline surface, from example in docs *)
  2. pts = {{{0.5, 0, -0.5}, {0, 0, -0.5}, {0, 1, -0.5}, {0.5, 1, -0.5}, {1, 1, -0.5},
  3. {1, 0, -0.5}, {0.5, 0, -0.5}},
  4. {{0.5, 0, 0.7}, {0, 0, 0.7}, {0, 1, 0.7}, {0.5, 1, 0.7}, {1, 1, 0.7},
  5. {1, 0, 0.7}, {0.5, 0, 0.7}},
  6. {{0.5, 0, 0.9}, {0, 0, 0.9}, {0, 1, 1.5}, {0.5, 1, 1.5}, {1, 1, 1.5},
  7. {1, 0, 0.9}, {0.5, 0, 0.9}},
  8. {{0.5, -0.1, 1}, {0, -0.1, 1}, {0, 0.5, 2}, {0.5, 0.5, 2}, {1, 0.5, 2},
  9. {1, -0.1, 1}, {0.5, -0.1, 1}},
  10. {{0.5, -0.3, 1}, {0, -0.3, 1}, {0, -0.3, 2}, {0.5, -0.3, 2},
  11. {1, -0.3, 2}, {1, -0.3, 1}, {0.5, -0.3, 1}},
  12. {{0.5, -1.5, 1}, {0, -1.5, 1}, {0, -1.5, 2}, {0.5, -1.5, 2},
  13. {1, -1.5, 2}, {1, -1.5, 1}, {0.5, -1.5, 1}}};
  14. w = {{1, .5, .5, 1, .5, .5, 1}, {1, .5, .5, 1, .5, .5, 1},
  15. {1, .5, .5, 1, .5, .5, 1}, {1, .5, .5, 1, .5, .5, 1},
  16. {1, .5, .5, 1, .5, .5, 1}, {1, .5, .5, 1, .5, .5, 1}};
  17. uk = {0, 0, 0, 1/4, 1/2, 3/4, 1, 1, 1};
  18. vk = {0, 0, 0, 1/4, 1/2, 1/2, 3/4, 1, 1, 1};
  19.  
  20. Graphics3D[BSplineSurface[pts, SplineKnots -> {uk, vk}, SplineDegree -> 2,
  21. SplineWeights -> w, SplineClosed -> {False, True}]] /.
  22. bs : BSplineSurface[pts_?ArrayQ, opts___] :>
  23. Module[{bsf = BSplineFunction[pts, opts]},
  24. Cases[Normal[Cases[ParametricPlot3D[bsf[u, v], {u, 0, 1}, {v, 0, 1}],
  25. _GraphicsComplex, ∞]], _Polygon, ∞]]
  26.  
  27. MakePolygons[vl_] /; ArrayQ[vl, 3] := Module[{dims = Most[Dimensions[vl]]},
  28. GraphicsComplex[Apply[Join, vl], Polygon[Flatten[Apply[Join[#1, Reverse[#2]] &,
  29. Partition[Partition[Range[Times @@ dims], Last[dims]], {2, 2}, {1, 1}],
  30. {2}], 1]]]]
  31.  
  32. Graphics3D[BSplineSurface[pts, SplineKnots -> {uk, vk}, SplineDegree -> 2,
  33. SplineWeights -> w, SplineClosed -> {False, True}]] /.
  34. bs : BSplineSurface[pts_?ArrayQ, opts___] :>
  35. Module[{bsf = BSplineFunction[pts, opts], upts = 30, vpts = 18},
  36. Cases[Normal[MakePolygons[
  37. Table[bsf[u, v], {u, 0, 1, 1/(upts - 1)}, {v, 0, 1, 1/(vpts - 1)}]
  38. ]], _Polygon, ∞]]
Add Comment
Please, Sign In to add comment