1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-01-17 22:28:16 +01:00
dotSCAD/docs/lib3x-path_scaling_sections.md
2021-02-24 21:09:54 +08:00

3.2 KiB

path_scaling_sections

Given an edge path with the first point at the outline of a shape. This function uses the path to calculate scaling factors and returns all scaled sections in the reversed order of the edge path. Combined with the sweep module, you can create an extrusion with the path as an edge.

In order to control scaling factors easily, I suggest using [x, 0, 0] as the first point and keeping y = 0 while building the edge path.

You can use any point as the first point of the edge path. Just remember that your edge path radiates from the origin.

Since: 1.2.

Parameters

  • shape_pts : A list of points represent a shape.
  • edge_path : A list of points represent the edge path.

Examples

use <hull_polyline3d.scad>;
use <shape_taiwan.scad>;
use <path_scaling_sections.scad>;
use <sweep.scad>;

taiwan = shape_taiwan(100);
fst_pt = [13, 0, 0];

edge_path = [
	fst_pt,
	fst_pt + [0, 0, 10],
	fst_pt + [10, 0, 20],
	fst_pt + [8, 0, 30],
	fst_pt + [12, 0, 40],
	fst_pt + [0, 0, 50],
	fst_pt + [0, 0, 60]
];

#hull_polyline3d(edge_path);
sweep(path_scaling_sections(taiwan, edge_path));

path_scaling_sections

use <hull_polyline3d.scad>;
use <shape_taiwan.scad>;
use <path_scaling_sections.scad>;
use <sweep.scad>;
use <bezier_curve.scad>;


taiwan = shape_taiwan(100);
fst_pt = [13, 0, 0];

edge_path = bezier_curve(0.05, [
	fst_pt,
	fst_pt + [0, 0, 10],
	fst_pt + [10, 0, 20],
	fst_pt + [8, 0, 30],
	fst_pt + [12, 0, 40],
	fst_pt + [0, 0, 50],
	fst_pt + [0, 0, 60]
]);

#hull_polyline3d(edge_path);
sweep(path_scaling_sections(taiwan, edge_path));

path_scaling_sections

use <shape_taiwan.scad>;
use <path_scaling_sections.scad>;
use <sweep.scad>;
use <bezier_curve.scad>;
use <rotate_p.scad>;

taiwan = shape_taiwan(100);
fst_pt = [13, 0, 0];

edge_path = bezier_curve(0.05, [
	fst_pt,
	fst_pt + [0, 0, 10],
	fst_pt + [10, 0, 20],
	fst_pt + [8, 0, 30],
	fst_pt + [12, 0, 40],
	fst_pt + [0, 0, 50],
	fst_pt + [0, 0, 60]
]);

leng = len(edge_path);
twist = -90;
twist_step = twist / leng;
sections = path_scaling_sections(taiwan, edge_path);

rotated_sections = [
	for(i = [0:leng - 1]) 
	[
		for(p = sections[i]) 
			rotate_p(p, twist_step * i)        
	]
];

sweep(rotated_sections);

path_scaling_sections

use <hull_polyline3d.scad>;
use <shape_taiwan.scad>;
use <path_scaling_sections.scad>;
use <sweep.scad>;
use <rotate_p.scad>;

taiwan = shape_taiwan(100);

/* 
    You can use any point as the first point of the edge path.
	Just remember that your edge path radiates from the origin.
*/
fst_pt = [taiwan[0][0], taiwan[0][1], 0];//[13, 0, 0];
a = atan2(fst_pt[1], fst_pt[0]);
edge_path = [
	fst_pt,
	fst_pt + rotate_p([0, 0, 10], a),
	fst_pt + rotate_p([10, 0, 20], a),
	fst_pt + rotate_p([8, 0, 30], a),
	fst_pt + rotate_p([10, 0, 40], a),
	fst_pt + rotate_p([0, 0, 50], a),
	fst_pt + rotate_p([0, 0, 60], a)
];

#hull_polyline3d(edge_path);
sweep(path_scaling_sections(taiwan, edge_path));

path_scaling_sections