1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-01-17 06:08:31 +01:00

added bezier

This commit is contained in:
Justin Lin 2017-03-22 10:47:09 +08:00
parent 2ebfe6940b
commit f5d3b90992
4 changed files with 76 additions and 0 deletions

View File

@ -23,3 +23,5 @@ I've been using OpenSCAD for years and created some funny things. Some of them i
- [hollow_out](https://openhome.cc/eGossip/OpenSCAD/lib-hollow_out.html)
- [bend](https://openhome.cc/eGossip/OpenSCAD/lib-bend.html)
- Math
- [bezier](https://openhome.cc/eGossip/OpenSCAD/lib-bezier.html)

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

28
docs/lib-bezier.md Normal file
View File

@ -0,0 +1,28 @@
# bezier
Given a set of control points, the bezier function returns points of the Bézier path. Combined with the `polyline`, `polyline3d` or `hull_polyline3d` module defined in my lib-openscad, you can create a Bézier curve.
## Parameters
- `t_step` : The distance between two points of the Bézier path.
- `points` : A set of `[x, y, z]` control points.
## Examples
If you have four control points and combine with the `hull_polyline3d` module:
t_step = 0.05;
width = 2;
p0 = [0, 0, 0];
p1 = [40, 60, 35];
p2 = [-50, 90, 0];
p3 = [0, 200, -35];
points = bezier(t_step,
[p0, p1, p2, p3]
);
hull_polyline3d(points, width);
![bezier](images/lib-bezier-1.JPG)

46
src/bezier.scad Normal file
View File

@ -0,0 +1,46 @@
/**
* bezier.scad
*
* Given a set of control points, the bezier function returns points of the Bézier path.
* Combined with the polyline, polyline3d or hull_polyline3d module defined in my lib-openscad,
* you can create a Bézier curve.
*
* @copyright Justin Lin, 2017
* @license https://opensource.org/licenses/lgpl-3.0.html
*
* @see https://openhome.cc/eGossip/OpenSCAD/lib-bezier.html
*
**/
function _combi(r, n) =
n == 0 ? 1 : (_combi(r, n - 1) * (r - n + 1) / n);
function bezier_coordinate(t, pn, n, i = 0) =
i == n + 1 ? 0 :
(_combi(n, i) * pn[i] * pow(1 - t, n - i) * pow(t, i) +
bezier_coordinate(t, pn, n, i + 1));
function _bezier_point(t, points) =
[
bezier_coordinate(
t,
[points[0][0], points[1][0], points[2][0], points[3][0]],
len(points) - 1
),
bezier_coordinate(
t,
[points[0][1], points[1][1], points[2][1], points[3][1]],
len(points) - 1
),
bezier_coordinate(
t,
[points[0][2], points[1][2], points[2][2], points[3][2]],
len(points) - 1
)
];
function bezier(t_step, points) =
[
for(t = [0: t_step: 1 + t_step])
_bezier_point(t, points)
];