-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpolygon_areas.scad
50 lines (42 loc) · 1.71 KB
/
polygon_areas.scad
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// polygon_areas.scad: Another recursion example
// Draw all geometry
translate([0,20]) color("Red") text("Areas:", size=8, halign="center");
translate([-44,0]) shapeWithArea(3, 10);
translate([-22,0]) shapeWithArea(4, 10);
translate([0,0]) shapeWithArea(7, 10);
translate([22,0]) shapeWithArea(10, 10);
translate([44,0]) shapeWithArea(360, 10);
// One shape with corresponding text
module shapeWithArea(num, r) {
polygon(ngon(num, r));
translate([0,-20])
color("Cyan")
text(str(round(area(ngon(num, r)))), halign="center", size=8);
}
// Simple list comprehension for creating N-gon vertices
function ngon(num, r) =
[for (i=[0:num-1], a=i*360/num) [ r*cos(a), r*sin(a) ]];
// Area of a triangle with the 3rd vertex in the origin
function triarea(v0, v1) = cross(v0, v1) / 2;
// Area of a polygon using the Shoelace formula
function area(vertices) =
let (areas = [let (num=len(vertices))
for (i=[0:num-1])
triarea(vertices[i], vertices[(i+1)%num])
])
sum(areas);
// Recursive helper function: Sums all values in a list.
// In this case, sum all partial areas into the final area.
function sum(values,s=0) =
s == len(values) - 1 ? values[s] : values[s] + sum(values,s+1);
echo(version=version());
// Written in 2015 by Marius Kintel <[email protected]>
//
// To the extent possible under law, the author(s) have dedicated all
// copyright and related and neighboring rights to this software to the
// public domain worldwide. This software is distributed without any
// warranty.
//
// You should have received a copy of the CC0 Public Domain
// Dedication along with this software.
// If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.