Skip to content

Instantly share code, notes, and snippets.

@anoved
Created March 18, 2014 15:48
Show Gist options
  • Star 18 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save anoved/9622826 to your computer and use it in GitHub Desktop.
Save anoved/9622826 to your computer and use it in GitHub Desktop.
OpenSCAD pointed star module
// points = number of points (minimum 3)
// outer = radius to outer points
// inner = radius to inner points
module Star(points, outer, inner) {
// polar to cartesian: radius/angle to x/y
function x(r, a) = r * cos(a);
function y(r, a) = r * sin(a);
// angular width of each pie slice of the star
increment = 360/points;
union() {
for (p = [0 : points-1]) {
// outer is outer point p
// inner is inner point following p
// next is next outer point following p
assign( x_outer = x(outer, increment * p),
y_outer = y(outer, increment * p),
x_inner = x(inner, (increment * p) + (increment/2)),
y_inner = y(inner, (increment * p) + (increment/2)),
x_next = x(outer, increment * (p+1)),
y_next = y(outer, increment * (p+1))) {
polygon(points = [[x_outer, y_outer], [x_inner, y_inner], [x_next, y_next], [0, 0]], paths = [[0, 1, 2, 3]]);
}
}
}
}
@zorgoz
Copy link

zorgoz commented Nov 28, 2022

Have you tried it with 3? Won't work - you get a triangle. It won't behave correctly when increasing the number of tips.
This is way simpler:

module Star(p=5, r1=4, r2=10) {
  s = [for(i=[0:p*2]) 
    [
      (i % 2 == 0 ? r1 : r2)*cos(180*i/p),
      (i % 2 == 0 ? r1 : r2)*sin(180*i/p)
    ]
  ];
    
  polygon(s);
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment