33 include <transform.scad>;
122 translate(center==
true ? [-rx/2, -ry/2] :
origin2d)
130 for ( i = [ [0, 0, 1, 0, 1, 0],
131 [1, 1, -1, 0, 1, 90],
132 [2, 1, -1, 1, -1, 180],
133 [3, 0, 1, 1, -1, 270] ] )
135 translate([rx*i[1] + vr * i[2], ry*i[3] + vr * i[4]])
143 polygon(points=[[
eps,-vr], [
eps,
eps], [-vr,
eps]], paths=[[0,1,2]]);
148 square([rx, ry] - [0, vr*2]);
151 square([rx, ry] - [vr*2, 0]);
160 for ( i = [ [0, 0, 1, 0, 1],
167 translate([rx*i[1] + crv[i[0]] * i[2], ry*i[3] + crv[i[0]] * i[4]])
187 [rx*i[1] + crv[i[0]] * i[2], ry*i[3] + crv[i[0]] * i[4]]
190 polygon( points=ppv, paths=[ [0,1,2,3,4,5,6,7] ] );
261 translate(center==
true ?
origin2d : [rx/2, ry/2])
264 rectangle(size=od, vr=or, vrm=om, center=
true);
268 rectangle(size=
id, vr=ir, vrm=im, center=
true);
273 rectangle(size=od, vr=or, vrm=om, center=center);
306 translate(center==
true ?
origin2d : [rx, ry])
312 points=[ [rx,0], [0,ry], [-rx,0], [0,-ry] ],
325 a1 =
angle_vv(v1t=[0,ry], v1i=[rx,0], v2t=[0,-ry], v2i=[rx,0]) / 2;
328 for ( i = [ [0, 1, -1, 0, 0],
335 [ rx*i[1] + crv[i[0]]/sin(a1) * i[2], ry*i[3] + crv[i[0]]/sin(a2) * i[4] ]
337 circle (r=crv[i[0]]);
345 [0, 0, 1, -1, 0, -1],
348 [1, 1, 0, -1, 1, -1],
350 [2, 0, -1, 1, 0, -1],
351 [3, 1, 0, -1, -1, 1],
352 [3, 1, 0, +1, -1, +1]
357 rx*i[2] + crv[i[0]] * (1/sin(a1)-sin(a1)) * i[3],
358 ry*i[4] + crv[i[0]] * cos(a1) * i[5]
361 rx*i[2] + crv[i[0]] * cos(a2) * i[3],
362 ry*i[4] + crv[i[0]] * (1/sin(a2)-sin(a2)) * i[5]
366 polygon( points=ppv, paths=[ [0,1,2,3,4,5,6,7] ] );
416 ( centroid==
false ) && ( incenter==
true )
422 ( centroid==
true ) && ( incenter==
false )
428 polygon( points=[v1, v2, v3], paths=[[0,1,2]] );
434 a1 =
angle_vv(v1t=v2, v1i=v1, v2t=ic, v2i=v1);
435 a2 =
angle_vv(v1t=v3, v1i=v2, v2t=ic, v2i=v2);
436 a3 =
angle_vv(v1t=v1, v1i=v3, v2t=ic, v2i=v3);
438 c1 = v1 + cr1/sin(a1) *
unit_v(vt=ic, vi=v1);
439 c2 = v2 + cr2/sin(a2) *
unit_v(vt=ic, vi=v2);
440 c3 = v3 + cr3/sin(a3) *
unit_v(vt=ic, vi=v3);
485 v1=v[0], v2=v[1], v3=v[2],
487 centroid=centroid, incenter=incenter
494 v1=v[0], v2=v[1], v3=v[2],
495 v1r=vr[0], v2r=vr[1], v3r=vr[2],
496 centroid=centroid, incenter=incenter
536 a1 = acos( (s2*s2 + s3*s3 - s1*s1) / (2 * s2 * s3) );
537 a2 = acos( (s1*s1 + s3*s3 - s2*s2) / (2 * s1 * s3) );
540 p3 = [s2*cos(a3), s2*sin(a3)];
546 str(
"can not render triangle with sides (", s1,
", ", s2,
", ", s3,
")" )
553 v3 = [s1 - p3[0], p3[1]];
558 vr=vr, v1r=v1r, v2r=v2r, v3r=v3r,
559 centroid=centroid, incenter=incenter
595 s1=v[0], s2=v[1], s3=v[2],
597 centroid=centroid, incenter=incenter
604 s1=v[0], s2=v[1], s3=v[2],
605 v1r=vr[0], v2r=vr[1], v3r=vr[2],
606 centroid=centroid, incenter=incenter
665 ( centroid==
false ) && ( incenter==
true )
671 ( centroid==
true ) && ( incenter==
false )
681 centroid=
true, incenter=
false
690 centroid=
true, incenter=
false
700 centroid=centroid, incenter=incenter
743 s3 = sqrt( s1*s1 + s2*s2 - 2*s1*s2*cos(a) );
750 vr=vr, v1r=v1r, v2r=v2r, v3r=v3r,
751 centroid=centroid, incenter=incenter
759 vr=vr, v1r=v2r, v2r=v3r, v3r=v1r,
760 centroid=centroid, incenter=incenter
768 vr=vr, v1r=v3r, v2r=v1r, v3r=v2r,
769 centroid=centroid, incenter=incenter
812 if ( (a1 + a2) >= 180 )
816 str(
"can not render triangle with angles (", a1,
", ", a2,
")" )
824 s1 = s3 * sin( a1 ) / sin( a3 );
825 s2 = s3 * sin( a2 ) / sin( a3 );
832 vr=vr, v1r=v3r, v2r=v1r, v3r=v2r,
833 centroid=centroid, incenter=incenter
841 vr=vr, v1r=v1r, v2r=v2r, v3r=v3r,
842 centroid=centroid, incenter=incenter
850 vr=vr, v1r=v2r, v2r=v3r, v3r=v1r,
851 centroid=centroid, incenter=incenter
895 if ( (a1 + a2) >= 180 )
899 str(
"can not render triangle with angles (", a1,
", ", a2,
")" )
907 s2 = s1 * sin( a2 ) / sin( a1 );
908 s3 = s1 * sin( a3 ) / sin( a1 );
915 vr=vr, v1r=v1r, v2r=v2r, v3r=v3r,
916 centroid=centroid, incenter=incenter
924 vr=vr, v1r=v2r, v2r=v3r, v3r=v1r,
925 centroid=centroid, incenter=incenter
933 vr=vr, v1r=v3r, v2r=v1r, v3r=v2r,
934 centroid=centroid, incenter=incenter
973 vr=vr, v1r=v1r, v2r=v2r, v3r=v3r,
974 centroid=centroid, incenter=incenter
1021 v1=
origin2d, v2=[x,0], v3=[0,tan(a)*x],
1022 vr=vr, v1r=v1r, v2r=v2r, v3r=v3r,
1023 centroid=centroid, incenter=incenter
1031 v1=
origin2d, v2=[tan(a)*y,0], v3=[0,y],
1032 vr=vr, v1r=v1r, v2r=v2r, v3r=v3r,
1033 centroid=centroid, incenter=incenter
1068 for ( c =
ngon_vp( r=r, n=n, vr=vr ) )
1180 trx = rx * sqrt(2) + 1;
1181 try = ry * sqrt(2) + 1;
1183 pa0 = (4 * a1 + 0 * a2) / 4;
1184 pa1 = (3 * a1 + 1 * a2) / 4;
1185 pa2 = (2 * a1 + 2 * a2) / 4;
1186 pa3 = (1 * a1 + 3 * a2) / 4;
1187 pa4 = (0 * a1 + 4 * a2) / 4;
1198 [trx * cos(pa0),
try * sin(pa0)],
1199 [trx * cos(pa1),
try * sin(pa1)],
1200 [trx * cos(pa2),
try * sin(pa2)],
1201 [trx * cos(pa3),
try * sin(pa3)],
1202 [trx * cos(pa4),
try * sin(pa4)],
1296 translate([-w/2, 0])
function defined_or(v, d)
Return a defined or default value.
function angle_vv(v1t, v2t, v1i, v2i)
Compute the angle between two vectors in a Euclidean 2 or 3D-space.
module rectangle(size, vr, vrm=0, center=false)
A rectangle with edge, fillet, and/or chamfer corners.
module ellipse_cs(size, core, t, a1=0, a2=0, co, cr=0)
A sector of an ellipse with a removed elliptical core.
module ngon(n, r, vr)
An n-sided equiangular/equilateral regular polygon.
function triangle_centroid_vp(v)
Compute the centroid (geometric center) of a triangle.
function is_nan(v)
Test if a numerical value is invalid.
module triangle_vl_c(vs, vc, co, cr=0, vr, vr1, vr2, centroid=false, incenter=false)
A general triangle specified by its sides with a removed triangular core.
module triangle_lal(s1, a, s2, x=1, vr, v1r, v2r, v3r, centroid=false, incenter=false)
A general triangle specified by two sides and the included angle.
module triangle_la(x, y, aa, oa, vr, v1r, v2r, v3r, centroid=false, incenter=false)
A right-angled triangle specified by a side length and an angle.
module rectangle_c(size, core, t, co, cr=0, vr, vr1, vr2, vrm=0, vrm1, vrm2, center=false)
A rectangle with a removed rectangular core.
function unit_v(vt, vi)
Compute the normalized unit vector for a 1, 2, or 3 term vector.
module ellipse_c(size, core, t, co, cr=0)
An ellipse with a removed elliptical core.
function not_defined(v)
Test if a value is not defined.
module ellipse_s(size, a1=0, a2=0)
An ellipse sector.
module triangle_ala(a1, s, a2, x=1, vr, v1r, v2r, v3r, centroid=false, incenter=false)
A general triangle specified by a side and two adjacent angles.
eps
Epsilon, small distance to deal with overlaping shapes
module triangle_aal(a1, a2, s, x=1, vr, v1r, v2r, v3r, centroid=false, incenter=false)
A general triangle specified by a side, one adjacent angle and the opposite angle.
function triangle_centroid_ppp(v1, v2, v3)
Compute the centroid (geometric center) of a triangle.
module log_warn(m)
Output warning message to console.
module triangle_vp(v, vr, centroid=false, incenter=false)
A general triangle specified by a vector of its three vertices.
module triangle_vl(v, vr, centroid=false, incenter=false)
A general triangle specified by a vector of its three side lengths.
function ngon_vp(n, r, vr)
Compute the vertices for an n-sided equiangular/equilateral regular polygon.
function any_undefined(v)
Test if any element of a value is undefined.
function triangle_incenter_ppp(v1, v2, v3)
Compute the coordinate for the triangle's incircle.
function edefined_or(v, i, d)
Return a defined vector element or default value.
function is_scalar(v)
Test if a value is a single non-iterable value.
function bitwise_is_equal(v, b, t=1)
Test if a base-two bit position of an integer value equals a test bit.
module triangle_ppp(v1, v2, v3, vr, v1r, v2r, v3r, centroid=false, incenter=false)
A general triangle specified by three vertices.
origin2d
The origin coordinates in 2-dimensional Euclidean space.
function all_defined(v)
Test if no element of a value is undefined.
function is_defined(v)
Test if a value is defined.
function triangle_incenter_vp(v)
Compute the coordinate for the triangle's incircle.
function triangle_lll2vp(s1, s2, s3)
Compute the vertices of a plane triangle given its side lengths.
module star2d(size, n=5, vr)
A two dimensional star.
module triangle_ll(x, y, vr, v1r, v2r, v3r, centroid=false, incenter=false)
A right-angled triangle specified by its opposite and adjacent side lengths.
module triangle_lll(s1, s2, s3, vr, v1r, v2r, v3r, centroid=false, incenter=false)
A general triangle specified by its three side lengths.
module rhombus(size, vr, center=false)
A rhombus.
module ellipse(size)
An ellipse.