From 57543b1791ef077b6d46a78ddf150f28e8db0eb5 Mon Sep 17 00:00:00 2001 From: Justin Lin Date: Tue, 15 Jun 2021 09:58:46 +0800 Subject: [PATCH] add doc --- README.md | 2 +- docs/images/lib3x-sf_splines-1.JPG | Bin 0 -> 42424 bytes docs/lib3x-sf_splines.md | 62 ++++++++++++++++++++ src/surface/sf_splines.scad | 87 ++++------------------------- 4 files changed, 74 insertions(+), 77 deletions(-) create mode 100644 docs/images/lib3x-sf_splines-1.JPG create mode 100644 docs/lib3x-sf_splines.md diff --git a/README.md b/README.md index 4e9fd448..94173782 100644 --- a/README.md +++ b/README.md @@ -356,7 +356,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp Signature | Description --|-- [**surface/sf_curve**(levels, curve_path, ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_curve.html) | curve a photo. -**surface/sf_splines**(ctrl_pts, row_spline, column_spline) | generalized-spline surface. +[**surface/sf_splines**(ctrl_pts, row_spline, column_spline)](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_splines.html) | generalized-spline surface. ## Triangle diff --git a/docs/images/lib3x-sf_splines-1.JPG b/docs/images/lib3x-sf_splines-1.JPG new file mode 100644 index 0000000000000000000000000000000000000000..87b6f53c5f606de01e0f8d0744fd7f0242ae70a0 GIT binary patch literal 42424 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 X^3}%v0*Z+Z`(}&yzkPe>*YSS; + use ; + use ; + + ctrl_pts = [ + [[0, 0, 20], [60, 0, -35], [90, 0, 60], [200, 0, 5]], + [[0, 50, 30], [100, 60, -25], [120, 50, 120], [200, 50, 5]], + [[0, 100, 0], [60, 120, 35], [90, 100, 60], [200, 100, 45]], + [[0, 150, 0], [60, 150, -35], [90, 180, 60], [200, 150, 45]] + ]; + + thickness = 2; + t_step = 0.05; + + bezier = function(points) bezier_curve(t_step, points); + + function_grapher(sf_splines(ctrl_pts, bezier), thickness); + +![sf_splines](images/lib3x-sf_splines-1.JPG) + +The following figure shows controll points and bazier curves around the surface. + +![sf_splines](images/lib3x-sf_splines-2.JPG) + +If you want to make a bspline surface: + + use ; + use ; + use ; + + ctrl_pts = [ + [[0, 0, 20], [60, 0, -35], [90, 0, 60], [200, 0, 5]], + [[0, 50, 30], [100, 60, -25], [120, 50, 120], [200, 50, 5]], + [[0, 100, 0], [60, 120, 35], [90, 100, 60], [200, 100, 45]], + [[0, 150, 0], [60, 150, -35], [90, 180, 60], [200, 150, 45]] + ]; + + thickness = 2; + t_step = 0.05; + degrees = 2; + + bspline = function(points) bspline_curve(t_step, degrees, points); + + function_grapher(sf_splines(ctrl_pts, bspline), thickness); + +![sf_splines](images/lib3x-sf_splines-3.JPG) \ No newline at end of file diff --git a/src/surface/sf_splines.scad b/src/surface/sf_splines.scad index e3b5e95d..4a4108f7 100644 --- a/src/surface/sf_splines.scad +++ b/src/surface/sf_splines.scad @@ -1,3 +1,13 @@ +/** +* sf_splines.scad +* +* @copyright Justin Lin, 2021 +* @license https://opensource.org/licenses/lgpl-3.0.html +* +* @see https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_splines.html +* +**/ + function sf_splines(ctrl_pts, row_spline, column_spline) = let( leng_ctrl_pts = len(ctrl_pts), @@ -12,79 +22,4 @@ function sf_splines(ctrl_pts, row_spline, column_spline) = [ for(c = 0; c < leng_r_pts0; c = c + 1) cspline([for(r = 0; r < leng_r_pts; r = r + 1) r_pts[r][c]]) - ]; - -/* -use ; -use ; -use ; - -ctrl_pts = [ - [[0, 0, 20], [60, 0, -35], [90, 0, 60], [200, 0, 5]], - [[0, 50, 30], [100, 60, -25], [120, 50, 120], [200, 50, 5]], - [[0, 100, 0], [60, 120, 35], [90, 100, 60], [200, 100, 45]], - [[0, 150, 0], [60, 150, -35], [90, 180, 60], [200, 150, 45]] -]; - -thickness = 2; -t_step = 0.05; -degrees = 2; - -row_spline = function(points) bspline_curve(t_step, degrees, points); -column_spline = function(points) bspline_curve(t_step, degrees, points); - -function_grapher(sf_splines(ctrl_pts, row_spline, column_spline), thickness); -*/ - -/* - -use ; -use ; -use ; - -ctrl_pts = [ - [[0, 0, 20], [60, 0, -35], [90, 0, 60], [200, 0, 5]], - [[0, 50, 30], [100, 60, -25], [120, 50, 120], [200, 50, 5]], - [[0, 100, 0], [60, 120, 35], [90, 100, 60], [200, 100, 45]], - [[0, 150, 0], [60, 150, -35], [90, 180, 60], [200, 150, 45]] -]; - -thickness = 2; -t_step = 0.05; - -row_spline = function(points) bezier_curve(t_step, points); -column_spline = function(points) bezier_curve(t_step, points); - -function_grapher(sf_splines(ctrl_pts, row_spline, column_spline), thickness); - -*/ - -/* - -use ; -use ; -use ; - -use ; - -ctrl_pts = [ - [[0, 0, 20], [20, 0, -15], [90, 0, 30], [200, 0, 5]], - [[0, 20, 30], [30, 30, -25], [80, 40, 20], [100, 50, 5]], - [[0, 100, 0], [20, 90, 15], [90, 100, 10], [100, 100, 45]], - [[0, 110, 0], [40, 120, -35], [90, 130, 20], [120, 120, 15]] -]; - -thickness = 2; -t_step = 0.05; - -row_spline = function(points) curve(t_step, points); -column_spline = function(points) curve(t_step, points); - -function_grapher(sf_splines(ctrl_pts, row_spline, column_spline), thickness); - -for(i = [0:3]) { - %hull_polyline3d(ctrl_pts[i]); - #hull_polyline3d(curve(t_step, ctrl_pts[i])); -} - -*/ \ No newline at end of file + ]; \ No newline at end of file