1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-07-31 20:10:36 +02:00

added path_extend

This commit is contained in:
Justin Lin
2017-05-01 09:28:44 +08:00
parent bf275dc86c
commit 0fe11992d0
3 changed files with 108 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

42
docs/lib-path_extend.md Normal file
View File

@@ -0,0 +1,42 @@
# path_extend
It extends a 2D stroke along a path. This module is suitable for a path created by a continuous function.
It depends on the rotate_p function and the polytransversals module. Remember to include "rotate_p.scad" and "polytransversals.scad".
When using this module, you should use points to represent the 2D stroke.
## Parameters
- `stroke_pts` : A list of points represent a stroke. See the example below.
- `path_pts` : A list of points represent the path.
## Examples
include <rotate_p.scad>;
include <polytransversals.scad>;
include <path_extend.scad>;
include <circle_path.scad>;
include <archimedean_spiral.scad>;
$fn = 96;
stroke1 = [[-5, 2.5], [-2.5, 0], [0, 2.5], [2.5, 0], [5, 2.5]];
path_pts1 = circle_path(50, 60);
path_extend(stroke1, path_pts1);
stroke2 = [[-4, 0], [0, 4], [4, 0]];
pts_angles = archimedean_spiral(
arm_distance = 17,
init_angle = 180,
point_distance = 5,
num_of_points = 85
);
translate([120, 0, 0])
path_extend(
stroke2,
[for(pa = pts_angles) pa[0]]
);
![path_extend](images/lib-path_extend-1.JPG)

66
src/path_extend.scad Normal file
View File

@@ -0,0 +1,66 @@
/**
* path_extend.scad
*
* It extends a 2D stroke along a path.
* This module is suitable for a path created by a continuous function.
* It depends on the rotate_p function and the polytransversals module.
* Remember to include "rotate_p.scad" and "polytransversals.scad".
*
* @copyright Justin Lin, 2017
* @license https://opensource.org/licenses/lgpl-3.0.html
*
* @see https://openhome.cc/eGossip/OpenSCAD/lib-path_extend.html
*
**/
module path_extend(stroke_pts, path_pts) {
function length(p1, p2) =
let(
x1 = p1[0],
y1 = p1[1],
x2 = p2[0],
y2 = p2[1]
) sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2));
function az(p1, p2) =
let(
x1 = p1[0],
y1 = p1[1],
x2 = p2[0],
y2 = p2[1]
) -90 + atan2((y2 - y1), (x2 - x1));
leng_path_pts = len(path_pts);
function first_stroke() =
let(
p1 = path_pts[0],
p2 = path_pts[1],
a = az(p1, p2)
)
[
for(p = stroke_pts)
rotate_p(p, a) + p1
];
function stroke(p1, p2) =
let(
leng = length(p1, p2),
a = az(p1, p2)
)
[
for(p = stroke_pts)
rotate_p(p + [0, leng], a) + p1
];
function path_extend_inner(index) =
index == leng_path_pts ? [] :
concat(
[stroke(path_pts[index - 1], path_pts[index])],
path_extend_inner(index + 1)
);
polytransversals(
concat([first_stroke()], path_extend_inner(1))
);
}