omdl  v0.6.1
OpenSCAD Mechanical Design Library
shapes2d.scad
Go to the documentation of this file.
1 //! Two-dimensional basic shapes.
2 /***************************************************************************//**
3  \file shapes2d.scad
4  \author Roy Allen Sutton
5  \date 2015-2017
6 
7  \copyright
8 
9  This file is part of [omdl] (https://github.com/royasutton/omdl),
10  an OpenSCAD mechanical design library.
11 
12  The \em omdl is free software; you can redistribute it and/or modify
13  it under the terms of the [GNU Lesser General Public License]
14  (http://www.gnu.org/licenses/lgpl.html) as published by the Free
15  Software Foundation; either version 2.1 of the License, or (at
16  your option) any later version.
17 
18  The \em omdl is distributed in the hope that it will be useful,
19  but WITHOUT ANY WARRANTY; without even the implied warranty of
20  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21  Lesser General Public License for more details.
22 
23  You should have received a copy of the GNU Lesser General Public
24  License along with the \em omdl; if not, write to the Free Software
25  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
26  02110-1301, USA; or see <http://www.gnu.org/licenses/>.
27 
28  \details
29 
30  \ingroup shapes shapes_2d
31 *******************************************************************************/
32 
33 include <../math/math_triangle.scad>;
34 include <../tools/tools_utility.scad>;
35 
36 //----------------------------------------------------------------------------//
37 /***************************************************************************//**
38  \addtogroup shapes
39 
40  \amu_define caption (2d Shapes)
41 
42  \amu_make png_files (append=dim extension=png)
43  \amu_make eps_files (append=dim extension=png2eps)
44  \amu_shell file_cnt ("echo ${png_files} | wc -w")
45  \amu_shell cell_num ("seq -f '(%g)' -s '^' ${file_cnt}")
46 
47  \htmlonly
48  \amu_image_table
49  (
50  type=html columns=4 image_width="200" cell_files="${png_files}"
51  table_caption="${caption}" cell_captions="${cell_num}"
52  )
53  \endhtmlonly
54  \latexonly
55  \amu_image_table
56  (
57  type=latex columns=4 image_width="1.25in" cell_files="${eps_files}"
58  table_caption="${caption}" cell_captions="${cell_num}"
59  )
60  \endlatexonly
61 *******************************************************************************/
62 
63 /***************************************************************************//**
64  \addtogroup shapes
65  @{
66 
67  \defgroup shapes_2d 2d Shapes
68  \brief Two-dimensional geometric shapes.
69  @{
70 *******************************************************************************/
71 //----------------------------------------------------------------------------//
72 
73 //----------------------------------------------------------------------------//
74 // openscad-amu macros
75 //----------------------------------------------------------------------------//
76 /***************************************************************************//**
77  \amu_define scope (shapes2d_dim)
78  \amu_define tuple (qvga_top)
79 
80  \amu_define example_dim
81  (
82  \image html ${scope}_${tuple}_${function}.png "${function}"
83  \image latex ${scope}_${tuple}_${function}.eps "${function}" width=2.5in
84  \dontinclude ${scope}.scad \skipline ${function}(
85  )
86 *******************************************************************************/
87 //----------------------------------------------------------------------------//
88 
89 //! A rectangle with edge, fillet, and/or chamfer corners.
90 /***************************************************************************//**
91  \param size <decimal-list-2|decimal> A list [x, y] of decimals
92  or a single decimal for (x=y).
93 
94  \param vr <decimal-list-4|decimal> The corner rounding radius.
95  A list [v1r, v2r, v3r, v4r] of decimals or a single decimal
96  for (v1r=v2r=v3r=v4r). Unspecified corners are not rounded.
97 
98  \param vrm <integer> The corner radius mode.
99  A 4-bit encoded integer that indicates each corner finish.
100  Use bit value \b 0 for \em fillet and \b 1 for \em chamfer.
101 
102  \param center <boolean> Center about origin.
103 
104  \details
105 
106  \b Example
107  \amu_eval ( function=rectangle ${example_dim} )
108 
109  \note A corner \em fillet replaces an edge with a quarter circle of
110  radius \p vr, inset <tt>[vr, vr]</tt> from the corner vertex.
111  \note A corner \em chamfer replaces an edge with an isosceles right
112  triangle with side lengths equal to the corresponding corner
113  rounding radius \p vr. Therefore the chamfer length will be
114  <tt>vr*sqrt(2)</tt> at 45 degree angles.
115 *******************************************************************************/
116 module rectangle
117 (
118  size,
119  vr,
120  vrm = 0,
121  center = false
122 )
123 {
124  rx = edefined_or(size, 0, size);
125  ry = edefined_or(size, 1, rx);
126 
127  translate(center==true ? [-rx/2, -ry/2] : origin2d)
128  {
129  if ( not_defined(vr) ) // no rounding
130  {
131  square([rx, ry]);
132  }
133  else if ( is_scalar(vr) ) // equal rounding
134  {
135  for ( i = [ [0, 0, 1, 0, 1, 0],
136  [1, 1, -1, 0, 1, 90],
137  [2, 1, -1, 1, -1, 180],
138  [3, 0, 1, 1, -1, 270] ] )
139  {
140  translate([rx*i[1] + vr * i[2], ry*i[3] + vr * i[4]])
141  if ( bitwise_is_equal(vrm, i[0], 0) )
142  {
143  circle(r=vr);
144  }
145  else
146  {
147  rotate([0, 0, i[5]])
148  polygon(points=[[aeps,-vr], [aeps,aeps], [-vr,aeps]], paths=[[0,1,2]]);
149  }
150  }
151 
152  translate([0, vr])
153  square([rx, ry] - [0, vr*2]);
154 
155  translate([vr, 0])
156  square([rx, ry] - [vr*2, 0]);
157  }
158  else // individual rounding
159  {
160  crv = [ edefined_or(vr, 0, 0),
161  edefined_or(vr, 1, 0),
162  edefined_or(vr, 2, 0),
163  edefined_or(vr, 3, 0) ];
164 
165  for ( i = [ [0, 0, 1, 0, 1],
166  [1, 1, -1, 0, 1],
167  [2, 1, -1, 1, -1],
168  [3, 0, 1, 1, -1] ] )
169  {
170  if ( (crv[i[0]] > 0) && bitwise_is_equal(vrm, i[0], 0) )
171  {
172  translate([rx*i[1] + crv[i[0]] * i[2], ry*i[3] + crv[i[0]] * i[4]])
173  circle(r=crv[i[0]]);
174  }
175  }
176 
177  ppv =
178  [
179  for
180  (
181  i = [
182  [0, 0, 0, 0, 1],
183  [0, 0, 1, 0, 0],
184  [1, 1, -1, 0, 0],
185  [1, 1, 0, 0, 1],
186  [2, 1, 0, 1, -1],
187  [2, 1, -1, 1, 0],
188  [3, 0, 1, 1, 0],
189  [3, 0, 0, 1, -1]
190  ]
191  )
192  [rx*i[1] + crv[i[0]] * i[2], ry*i[3] + crv[i[0]] * i[4]]
193  ];
194 
195  polygon( points=ppv, paths=[ [0,1,2,3,4,5,6,7] ] );
196  }
197  }
198 }
199 
200 //! A rectangle with a removed rectangular core.
201 /***************************************************************************//**
202  \param size <decimal-list-2|decimal> A list [x, y] of decimals
203  or a single decimal for (x=y).
204  \param core <decimal-list-2|decimal> A list [x, y] of decimals
205  or a single decimal for (x=y).
206 
207  \param t <decimal-list-2|decimal> A list [x, y] of decimals
208  or a single decimal for (x=y).
209 
210  \param co <decimal-list-2> Core offset. A list [x, y] of decimals.
211  \param cr <decimal> Core z-rotation.
212 
213  \param vr <decimal-list-4|decimal> The default corner rounding radius.
214  A list [v1r, v2r, v3r, v4r] of decimals or a single decimal
215  for (v1r=v2r=v3r=v4r). Unspecified corners are not rounded.
216  \param vr1 <decimal-list-4|decimal> The outer corner rounding radius.
217  \param vr2 <decimal-list-4|decimal> The core corner rounding radius.
218 
219  \param vrm <integer> The default corner radius mode.
220  A 4-bit encoded integer that indicates each corner finish.
221  Use bit value \b 0 for \em fillet and \b 1 for \em chamfer.
222  \param vrm1 <integer> The outer corner radius mode.
223  \param vrm2 <integer> The core corner radius mode.
224 
225  \param center <boolean> Center about origin.
226 
227  \details
228 
229  Thickness \p t
230  \li <tt>core = size - t</tt>; when \p t and \p size are given.
231  \li <tt>size = core + t</tt>; when \p t and \p core are given.
232 
233  \b Example
234  \amu_eval ( function=rectangle_c ${example_dim} )
235 *******************************************************************************/
236 module rectangle_c
237 (
238  size,
239  core,
240  t,
241  co,
242  cr = 0,
243  vr,
244  vr1,
245  vr2,
246  vrm = 0,
247  vrm1,
248  vrm2,
249  center = false
250 )
251 {
252  rx = edefined_or(size, 0, size);
253  ry = edefined_or(size, 1, rx);
254 
255  od = all_defined([t, core]) ? (core + t) : size;
256  id = all_defined([t, size]) ? (size - t) : core;
257 
258  or = defined_or(vr1, vr);
259  ir = defined_or(vr2, vr);
260 
261  om = defined_or(vrm1, vrm);
262  im = defined_or(vrm2, vrm);
263 
264  if ( is_defined(id) )
265  {
266  translate(center==true ? origin2d : [rx/2, ry/2])
267  difference()
268  {
269  rectangle(size=od, vr=or, vrm=om, center=true);
270 
271  translate(is_defined(co) ? co : origin2d)
272  rotate([0, 0, cr])
273  rectangle(size=id, vr=ir, vrm=im, center=true);
274  }
275  }
276  else
277  {
278  rectangle(size=od, vr=or, vrm=om, center=center);
279  }
280 }
281 
282 //! A rhombus.
283 /***************************************************************************//**
284  \param size <decimal-list-2|decimal> A list [w, h] of decimals
285  or a single decimal for (w=h).
286 
287  \param vr <decimal-list-4|decimal> The corner rounding radius.
288  A list [v1r, v2r, v3r, v4r] of decimals or a single decimal
289  for (v1r=v2r=v3r=v4r). Unspecified corners are not rounded.
290 
291  \param center <boolean> Center about origin.
292 
293  \details
294 
295  \b Example
296  \amu_eval ( function=rhombus ${example_dim} )
297 
298  See [Wikipedia](https://en.wikipedia.org/wiki/Rhombus)
299  for more information.
300 *******************************************************************************/
301 module rhombus
302 (
303  size,
304  vr,
305  center = false
306 )
307 {
308  rx = edefined_or(size, 0, size) / 2;
309  ry = edefined_or(size, 1, rx*2) / 2;
310 
311  translate(center==true ? origin2d : [rx, ry])
312  {
313  if ( not_defined(vr) ) // no rounding
314  {
315  polygon
316  (
317  points=[ [rx,0], [0,ry], [-rx,0], [0,-ry] ],
318  paths=[ [0,1,2,3] ]
319  );
320  }
321  else // individual rounding
322  {
323  erc = is_scalar(vr) ? vr : 0; // equal rounding
324 
325  crv = [ edefined_or(vr, 0, erc),
326  edefined_or(vr, 1, erc),
327  edefined_or(vr, 2, erc),
328  edefined_or(vr, 3, erc) ];
329 
330  a1 = angle_ll([[rx,0], [0,ry]], [[rx,0], [0,-ry]]) / 2;
331  a2 = 90 - a1;
332 
333  for ( i = [ [0, 1, -1, 0, 0],
334  [1, 0, 0, 1, -1],
335  [2, -1, 1, 0, 0],
336  [3, 0, 0, -1, 1] ] )
337  {
338  translate
339  (
340  [ rx*i[1] + crv[i[0]]/sin(a1) * i[2], ry*i[3] + crv[i[0]]/sin(a2) * i[4] ]
341  )
342  circle (r=crv[i[0]]);
343  }
344 
345  ppv =
346  [
347  for
348  (
349  i = [
350  [0, 0, 1, -1, 0, -1],
351  [0, 0, 1, -1, 0, 1],
352  [1, 1, 0, 1, 1, -1],
353  [1, 1, 0, -1, 1, -1],
354  [2, 0, -1, 1, 0, 1],
355  [2, 0, -1, 1, 0, -1],
356  [3, 1, 0, -1, -1, 1],
357  [3, 1, 0, +1, -1, +1]
358  ]
359  )
360  ( i[1] == 0 )
361  ? [
362  rx*i[2] + crv[i[0]] * (1/sin(a1)-sin(a1)) * i[3],
363  ry*i[4] + crv[i[0]] * cos(a1) * i[5]
364  ]
365  : [
366  rx*i[2] + crv[i[0]] * cos(a2) * i[3],
367  ry*i[4] + crv[i[0]] * (1/sin(a2)-sin(a2)) * i[5]
368  ]
369  ];
370 
371  polygon( points=ppv, paths=[ [0,1,2,3,4,5,6,7] ] );
372  }
373  }
374 }
375 
376 //! A general triangle specified by three vertices.
377 /***************************************************************************//**
378  \param v1 <point-2d> A point [x, y] for vertex 1.
379  \param v2 <point-2d> A point [x, y] for vertex 2.
380  \param v3 <point-2d> A point [x, y] for vertex 3.
381 
382  \param vr <decimal> The default vertex rounding radius.
383  \param v1r <decimal> Vertex 1 rounding radius.
384  \param v2r <decimal> Vertex 2 rounding radius.
385  \param v3r <decimal> Vertex 3 rounding radius.
386 
387  \param centroid <boolean> Center centroid at origin.
388  \param incenter <boolean> Center incenter at origin.
389 
390  \details
391 
392  \b Example
393  \amu_eval ( function=triangle_ppp ${example_dim} )
394 
395  \warning Currently, in order to round any vertex, all must be given
396  a rounding radius, either via \p vr or individually.
397 
398  \todo Replace the hull() operation with calculated tangential
399  intersection of the rounded vertexes.
400  \todo Remove the all or nothing requirement for vertex rounding.
401 *******************************************************************************/
402 module triangle_ppp
403 (
404  v1,
405  v2,
406  v3,
407  vr,
408  v1r,
409  v2r,
410  v3r,
411  centroid = false,
412  incenter = false
413 )
414 {
415  cr1 = defined_or(v1r, vr);
416  cr2 = defined_or(v2r, vr);
417  cr3 = defined_or(v3r, vr);
418 
419  translate
420  (
421  ( centroid==false ) && ( incenter==true )
422  ? -triangle_incenter_ppp( v1=v1, v2=v2, v3=v3 )
423  : origin2d
424  )
425  translate
426  (
427  ( centroid==true ) && ( incenter==false )
428  ? -triangle_centroid_ppp( v1=v1, v2=v2, v3=v3 )
429  : origin2d
430  )
431  if ( any_undefined([cr1, cr2, cr3]) )
432  {
433  polygon( points=[v1, v2, v3], paths=[[0,1,2]] );
434  }
435  else
436  {
437  ic = triangle_incenter_ppp( v1=v1, v2=v2, v3=v3 );
438 
439  a1 = angle_ll([v1, v2], [v1, ic]);
440  a2 = angle_ll([v2, v3], [v2, ic]);
441  a3 = angle_ll([v3, v1], [v3, ic]);
442 
443  c1 = v1 + cr1/sin(a1) * unit_l([v1, ic]);
444  c2 = v2 + cr2/sin(a2) * unit_l([v2, ic]);
445  c3 = v3 + cr3/sin(a3) * unit_l([v3, ic]);
446 
447  hull()
448  {
449  translate( c1 )
450  circle( r=cr1 );
451  translate( c2 )
452  circle( r=cr2 );
453  translate( c3 )
454  circle( r=cr3 );
455  }
456  }
457 }
458 
459 //! A general triangle specified by a list of its three vertices.
460 /***************************************************************************//**
461  \param v <point-2d-list-3> A list [v1, v2, v3] of points [x, y].
462 
463  \param vr <decimal-list-3|decimal> The vertex rounding radius. A
464  list [v1r, v2r, v3r] of decimals or a single decimal for
465  (v1r=v2r=v3r).
466 
467  \param centroid <boolean> Center centroid at origin.
468  \param incenter <boolean> Center incenter at origin.
469 
470  \details
471 
472  \b Example
473  \code{.C}
474  t = triangle_sss2lp( 30, 40, 50 );
475  r = [2, 4, 6];
476  triangle_lp( v=t, vr=r );
477  \endcode
478 *******************************************************************************/
479 module triangle_lp
480 (
481  v,
482  vr,
483  centroid = false,
484  incenter = false
485 )
486 {
487  if ( is_scalar(vr) )
488  {
490  (
491  v1=v[0], v2=v[1], v3=v[2],
492  vr=vr,
493  centroid=centroid, incenter=incenter
494  );
495  }
496  else
497  {
499  (
500  v1=v[0], v2=v[1], v3=v[2],
501  v1r=vr[0], v2r=vr[1], v3r=vr[2],
502  centroid=centroid, incenter=incenter
503  );
504  }
505 }
506 
507 //! A general triangle specified by its three side lengths.
508 /***************************************************************************//**
509  \param s1 <decimal> The length of the side 1 (along the x-axis).
510  \param s2 <decimal> The length of the side 2.
511  \param s3 <decimal> The length of the side 3.
512 
513  \param vr <decimal> The default vertex rounding radius.
514  \param v1r <decimal> Vertex 1 rounding radius.
515  \param v2r <decimal> Vertex 2 rounding radius.
516  \param v3r <decimal> Vertex 3 rounding radius.
517 
518  \param centroid <boolean> Center centroid at origin.
519  \param incenter <boolean> Center incenter at origin.
520 
521  \details
522 
523  \b Example
524  \amu_eval ( function=triangle_sss ${example_dim} )
525 
526  See [Wikipedia](https://en.wikipedia.org/wiki/Solution_of_triangles)
527  for more information.
528 *******************************************************************************/
529 module triangle_sss
530 (
531  s1,
532  s2,
533  s3,
534  vr,
535  v1r,
536  v2r,
537  v3r,
538  centroid = false,
539  incenter = false
540 )
541 {
542  a1 = acos( (s2*s2 + s3*s3 - s1*s1) / (2 * s2 * s3) );
543  a2 = acos( (s1*s1 + s3*s3 - s2*s2) / (2 * s1 * s3) );
544  a3 = 180 - a1 - a2;
545 
546  p3 = [s2*cos(a3), s2*sin(a3)];
547 
548  if ( is_nan( p3[0] ) || is_nan( p3[1] ) )
549  {
550  log_warn
551  (
552  str( "can not render triangle with sides (", s1, ", ", s2, ", ", s3, ")" )
553  );
554  }
555  else
556  {
557  v1 = origin2d;
558  v2 = [s1, 0];
559  v3 = [s1 - p3[0], p3[1]];
560 
562  (
563  v1=v1, v2=v2, v3=v3,
564  vr=vr, v1r=v1r, v2r=v2r, v3r=v3r,
565  centroid=centroid, incenter=incenter
566  );
567  }
568 }
569 
570 //! A general triangle specified by a list of its three side lengths.
571 /***************************************************************************//**
572  \param v <decimal-list-3> A list [s1, s2, s3] of decimals.
573 
574  \param vr <decimal-list-3|decimal> The vertex rounding radius. A
575  list [v1r, v2r, v3r] of decimals or a single decimal for
576  (v1r=v2r=v3r).
577 
578  \param centroid <boolean> Center centroid at origin.
579  \param incenter <boolean> Center incenter at origin.
580 
581  \details
582 
583  \b Example
584  \code{.C}
585  t = triangle_sss2lp( 3, 4, 5 );
586  s = triangle_lp2ls( t );
587  triangle_ls( v=s, vr=2, centroid=true );
588  \endcode
589 *******************************************************************************/
590 module triangle_ls
591 (
592  v,
593  vr,
594  centroid = false,
595  incenter = false
596 )
597 {
598  if ( is_scalar(vr) )
599  {
601  (
602  s1=v[0], s2=v[1], s3=v[2],
603  vr=vr,
604  centroid=centroid, incenter=incenter
605  );
606  }
607  else
608  {
610  (
611  s1=v[0], s2=v[1], s3=v[2],
612  v1r=vr[0], v2r=vr[1], v3r=vr[2],
613  centroid=centroid, incenter=incenter
614  );
615  }
616 }
617 
618 //! A general triangle specified by its sides with a removed triangular core.
619 /***************************************************************************//**
620  \param vs <decimal-list-3|decimal> The size. A list [s1, s2, s3] of
621  decimals or a single decimal for (s1=s2=s3).
622  \param vc <decimal-list-3|decimal> The core. A list [s1, s2, s3] of
623  decimals or a single decimal for (s1=s2=s3).
624 
625  \param co <decimal-list-2> Core offset. A list [x, y] of decimals.
626  \param cr <decimal> Core z-rotation.
627 
628  \param vr <decimal-list-3|decimal> The default vertex rounding radius.
629  A list [v1r, v2r, v3r] of decimals or a single decimal for
630  (v1r=v2r=v3r).
631  \param vr1 <decimal-list-3|decimal> The outer vertex rounding radius.
632  \param vr2 <decimal-list-3|decimal> The core vertex rounding radius.
633 
634  \param centroid <boolean> Center centroid at origin.
635  \param incenter <boolean> Center incenter at origin.
636 
637  \details
638 
639  \b Example
640  \amu_eval ( function=triangle_ls_c ${example_dim} )
641 
642  \note The outer and inner triangles centroids are aligned prior to
643  the core removal.
644 *******************************************************************************/
645 module triangle_ls_c
646 (
647  vs,
648  vc,
649  co,
650  cr = 0,
651  vr,
652  vr1,
653  vr2,
654  centroid = false,
655  incenter = false
656 )
657 {
658  ts1 = edefined_or(vs, 0, vs);
659  ts2 = edefined_or(vs, 1, ts1);
660  ts3 = edefined_or(vs, 2, ts2);
661 
662  tc1 = edefined_or(vc, 0, vc);
663  tc2 = edefined_or(vc, 1, tc1);
664  tc3 = edefined_or(vc, 2, tc2);
665 
666  vrs = defined_or(vr1, vr);
667  vrc = defined_or(vr2, vr);
668 
669  if ( is_defined(vc) )
670  {
671  translate
672  (
673  ( centroid==false ) && ( incenter==true )
674  ? -triangle_incenter_lp( triangle_sss2lp(s1=ts1, s2=ts2, s3=ts3) )
675  : origin2d
676  )
677  translate
678  (
679  ( centroid==true ) && ( incenter==false )
680  ? origin2d
681  : triangle_centroid_lp( triangle_sss2lp(s1=ts1, s2=ts2, s3=ts3) )
682  )
683  difference()
684  {
686  (
687  v=[ts1, ts2, ts3],
688  vr=vrs,
689  centroid=true, incenter=false
690  );
691 
692  translate(is_defined(co) ? co : origin2d)
693  rotate([0, 0, cr])
695  (
696  v=[tc1, tc2, tc3],
697  vr=vrc,
698  centroid=true, incenter=false
699  );
700  }
701  }
702  else
703  {
705  (
706  v=[ts1, ts2, ts3],
707  vr=vrs,
708  centroid=centroid, incenter=incenter
709  );
710  }
711 }
712 
713 //! A general triangle specified by two sides and the included angle.
714 /***************************************************************************//**
715  \param s1 <decimal> The length of the side 1.
716  \param a <decimal> The included angle in degrees.
717  \param s2 <decimal> The length of the side 2.
718 
719  \param x <integer> The side to draw on the positive x-axis
720  (\p x=1 for \p s1).
721 
722  \param vr <decimal> The default vertex rounding radius.
723  \param v1r <decimal> Vertex 1 rounding radius.
724  \param v2r <decimal> Vertex 2 rounding radius.
725  \param v3r <decimal> Vertex 3 rounding radius.
726 
727  \param centroid <boolean> Center centroid at origin.
728  \param incenter <boolean> Center incenter at origin.
729 
730  \details
731 
732  \b Example
733  \amu_eval ( function=triangle_sas ${example_dim} )
734 
735  See [Wikipedia] for more information.
736 
737  [Wikipedia]: https://en.wikipedia.org/wiki/Solution_of_triangles
738 *******************************************************************************/
739 module triangle_sas
740 (
741  s1,
742  a,
743  s2,
744  x = 1,
745  vr,
746  v1r,
747  v2r,
748  v3r,
749  centroid = false,
750  incenter = false
751 )
752 {
753  s3 = sqrt( s1*s1 + s2*s2 - 2*s1*s2*cos(a) );
754 
755  if ( x%4 == 1 )
756  {
758  (
759  s1=s1, s2=s2, s3=s3,
760  vr=vr, v1r=v1r, v2r=v2r, v3r=v3r,
761  centroid=centroid, incenter=incenter
762  );
763  }
764  else if ( x%4 == 2 )
765  {
767  (
768  s1=s2, s2=s3, s3=s1,
769  vr=vr, v1r=v2r, v2r=v3r, v3r=v1r,
770  centroid=centroid, incenter=incenter
771  );
772  }
773  else if ( x%4 == 3 )
774  {
776  (
777  s1=s3, s2=s1, s3=s2,
778  vr=vr, v1r=v3r, v2r=v1r, v3r=v2r,
779  centroid=centroid, incenter=incenter
780  );
781  }
782 }
783 
784 //! A general triangle specified by a side and two adjacent angles.
785 /***************************************************************************//**
786  \param a1 <decimal> The adjacent angle 1 in degrees.
787  \param s <decimal> The side length adjacent to the angles.
788  \param a2 <decimal> The adjacent angle 2 in degrees.
789 
790  \param x <integer> The side to draw on the positive x-axis
791  (\p x=1 for \p s).
792 
793  \param vr <decimal> The default vertex rounding radius.
794  \param v1r <decimal> Vertex 1 rounding radius.
795  \param v2r <decimal> Vertex 2 rounding radius.
796  \param v3r <decimal> Vertex 3 rounding radius.
797 
798  \param centroid <boolean> Center centroid at origin.
799  \param incenter <boolean> Center incenter at origin.
800 
801  \details
802 
803  \b Example
804  \amu_eval ( function=triangle_asa ${example_dim} )
805 
806  See [Wikipedia] for more information.
807 
808  [Wikipedia]: https://en.wikipedia.org/wiki/Solution_of_triangles
809 *******************************************************************************/
810 module triangle_asa
811 (
812  a1,
813  s,
814  a2,
815  x = 1,
816  vr,
817  v1r,
818  v2r,
819  v3r,
820  centroid = false,
821  incenter = false
822 )
823 {
824  if ( (a1 + a2) >= 180 )
825  {
826  log_warn
827  (
828  str( "can not render triangle with angles (", a1, ", ", a2, ")" )
829  );
830  }
831  else
832  {
833  s3 = s;
834  a3 = 180 - a1 - a2;
835 
836  s1 = s3 * sin( a1 ) / sin( a3 );
837  s2 = s3 * sin( a2 ) / sin( a3 );
838 
839  if ( x%4 == 1 )
840  {
842  (
843  s1=s3, s2=s1, s3=s2,
844  vr=vr, v1r=v3r, v2r=v1r, v3r=v2r,
845  centroid=centroid, incenter=incenter
846  );
847  }
848  else if ( x%4 == 2 )
849  {
851  (
852  s1=s1, s2=s2, s3=s3,
853  vr=vr, v1r=v1r, v2r=v2r, v3r=v3r,
854  centroid=centroid, incenter=incenter
855  );
856  }
857  else if ( x%4 == 3 )
858  {
860  (
861  s1=s2, s2=s3, s3=s1,
862  vr=vr, v1r=v2r, v2r=v3r, v3r=v1r,
863  centroid=centroid, incenter=incenter
864  );
865  }
866  }
867 }
868 
869 //! A general triangle specified by a side, one adjacent angle and the opposite angle.
870 /***************************************************************************//**
871  \param a1 <decimal> The opposite angle 1 in degrees.
872  \param a2 <decimal> The adjacent angle 2 in degrees.
873  \param s <decimal> The side length.
874 
875  \param x <integer> The side to draw on the positive x-axis
876  (\p x=1 for \p s).
877 
878  \param vr <decimal> The default vertex rounding radius.
879  \param v1r <decimal> Vertex 1 rounding radius.
880  \param v2r <decimal> Vertex 2 rounding radius.
881  \param v3r <decimal> Vertex 3 rounding radius.
882 
883  \param centroid <boolean> Center centroid at origin.
884  \param incenter <boolean> Center incenter at origin.
885 
886  \details
887 
888  \b Example
889  \amu_eval ( function=triangle_aas ${example_dim} )
890 
891  See [Wikipedia] for more information.
892 
893  [Wikipedia]: https://en.wikipedia.org/wiki/Solution_of_triangles
894 *******************************************************************************/
895 module triangle_aas
896 (
897  a1,
898  a2,
899  s,
900  x = 1,
901  vr,
902  v1r,
903  v2r,
904  v3r,
905  centroid = false,
906  incenter = false
907 )
908 {
909  if ( (a1 + a2) >= 180 )
910  {
911  log_warn
912  (
913  str( "can not render triangle with angles (", a1, ", ", a2, ")" )
914  );
915  }
916  else
917  {
918  s1 = s;
919  a3 = 180 - a1 - a2;
920 
921  s2 = s1 * sin( a2 ) / sin( a1 );
922  s3 = s1 * sin( a3 ) / sin( a1 );
923 
924  if ( x%4 == 1 )
925  {
927  (
928  s1=s1, s2=s2, s3=s3,
929  vr=vr, v1r=v1r, v2r=v2r, v3r=v3r,
930  centroid=centroid, incenter=incenter
931  );
932  }
933  else if ( x%4 == 2 )
934  {
936  (
937  s1=s2, s2=s3, s3=s1,
938  vr=vr, v1r=v2r, v2r=v3r, v3r=v1r,
939  centroid=centroid, incenter=incenter
940  );
941  }
942  else if ( x%4 == 3 )
943  {
945  (
946  s1=s3, s2=s1, s3=s2,
947  vr=vr, v1r=v3r, v2r=v1r, v3r=v2r,
948  centroid=centroid, incenter=incenter
949  );
950  }
951  }
952 }
953 
954 //! A right-angled triangle specified by its opposite and adjacent side lengths.
955 /***************************************************************************//**
956  \param x <decimal> The length of the side along the x-axis.
957  \param y <decimal> The length of the side along the y-axis.
958 
959  \param vr <decimal> The default vertex rounding radius.
960  \param v1r <decimal> Vertex 1 rounding radius.
961  \param v2r <decimal> Vertex 2 rounding radius.
962  \param v3r <decimal> Vertex 3 rounding radius.
963 
964  \param centroid <boolean> Center centroid at origin.
965  \param incenter <boolean> Center incenter at origin.
966 
967  \details
968 
969  \b Example
970  \amu_eval ( function=triangle_ss ${example_dim} )
971 *******************************************************************************/
972 module triangle_ss
973 (
974  x,
975  y,
976  vr,
977  v1r,
978  v2r,
979  v3r,
980  centroid = false,
981  incenter = false
982 )
983 {
985  (
986  v1=origin2d, v2=[x,0], v3=[0,y],
987  vr=vr, v1r=v1r, v2r=v2r, v3r=v3r,
988  centroid=centroid, incenter=incenter
989  );
990 }
991 
992 //! A right-angled triangle specified by a side length and an angle.
993 /***************************************************************************//**
994  \param x <decimal> The length of the side along the x-axis.
995  \param y <decimal> The length of the side along the y-axis.
996  \param aa <decimal> The adjacent angle in degrees.
997  \param oa <decimal> The opposite angle in degrees.
998 
999  \param vr <decimal> The default vertex rounding radius.
1000  \param v1r <decimal> Vertex 1 rounding radius.
1001  \param v2r <decimal> Vertex 2 rounding radius.
1002  \param v3r <decimal> Vertex 3 rounding radius.
1003 
1004  \param centroid <boolean> Center centroid at origin.
1005  \param incenter <boolean> Center incenter at origin.
1006 
1007  \details
1008 
1009  \b Example
1010  \amu_eval ( function=triangle_sa ${example_dim} )
1011 
1012  \note When both \p x and \p y are given, both triangles are rendered.
1013  \note When both \p aa and \p oa are given, \p aa is used.
1014 *******************************************************************************/
1015 module triangle_sa
1017  x,
1018  y,
1019  aa,
1020  oa,
1021  vr,
1022  v1r,
1023  v2r,
1024  v3r,
1025  centroid = false,
1026  incenter = false
1027 )
1028 {
1029  a = defined_or(aa, 90 - oa);
1030 
1031  if ( is_defined(x) )
1032  {
1033  triangle_ppp
1034  (
1035  v1=origin2d, v2=[x,0], v3=[0,tan(a)*x],
1036  vr=vr, v1r=v1r, v2r=v2r, v3r=v3r,
1037  centroid=centroid, incenter=incenter
1038  );
1039  }
1040 
1041  if ( is_defined(y) )
1042  {
1043  triangle_ppp
1044  (
1045  v1=origin2d, v2=[tan(a)*y,0], v3=[0,y],
1046  vr=vr, v1r=v1r, v2r=v2r, v3r=v3r,
1047  centroid=centroid, incenter=incenter
1048  );
1049  }
1050 }
1051 
1052 //! An n-sided equiangular/equilateral regular polygon.
1053 /***************************************************************************//**
1054  \param n <integer> The number of sides.
1055  \param r <decimal> The ngon vertex radius.
1056 
1057  \param vr <decimal> The vertex rounding radius.
1058 
1059  \details
1060 
1061  \b Example
1062  \amu_eval ( function=ngon ${example_dim} )
1063 
1064  See [Wikipedia] for more information.
1065 
1066  [Wikipedia]: https://en.wikipedia.org/wiki/Regular_polygon
1067 *******************************************************************************/
1068 module ngon
1070  n,
1071  r,
1072  vr
1073 )
1074 {
1075  if ( not_defined(vr) )
1076  {
1077  circle(r=r, $fn=n);
1078  }
1079  else
1080  {
1081  hull()
1082  {
1083  for ( c = rpolygon_lp( r=r, n=n, vr=vr ) )
1084  {
1085  translate( c )
1086  circle( r=vr );
1087  }
1088  }
1089  }
1090 }
1091 
1092 //! An ellipse.
1093 /***************************************************************************//**
1094  \param size <decimal-list-2|decimal> A list [rx, ry] of decimals
1095  or a single decimal for (rx=ry).
1096 
1097  \details
1098 
1099  \b Example
1100  \amu_eval ( function=ellipse ${example_dim} )
1101 *******************************************************************************/
1102 module ellipse
1104  size
1105 )
1106 {
1107  rx = edefined_or(size, 0, size);
1108  ry = edefined_or(size, 1, rx);
1109 
1110  if ( rx == ry )
1111  {
1112  circle(r=rx);
1113  }
1114  else
1115  {
1116  scale([1, ry/rx])
1117  circle(r=rx);
1118  }
1119 }
1120 
1121 //! An ellipse with a removed elliptical core.
1122 /***************************************************************************//**
1123  \param size <decimal-list-2|decimal> A list [rx, ry] of decimals
1124  or a single decimal for (rx=ry).
1125  \param core <decimal-list-2|decimal> A list [rx, ry] of decimals
1126  or a single decimal for (rx=ry).
1127 
1128  \param t <decimal-list-2|decimal> A list [x, y] of decimals
1129  or a single decimal for (x=y).
1130 
1131  \param co <decimal-list-2> Core offset. A list [x, y] of decimals.
1132  \param cr <decimal> Core z-rotation.
1133 
1134  \details
1135 
1136  Thickness \p t
1137  \li <tt>core = size - t</tt>; when \p t and \p size are given.
1138  \li <tt>size = core + t</tt>; when \p t and \p core are given.
1139 
1140  \b Example
1141  \amu_eval ( function=ellipse_c ${example_dim} )
1142 *******************************************************************************/
1143 module ellipse_c
1145  size,
1146  core,
1147  t,
1148  co,
1149  cr = 0
1150 )
1151 {
1152  od = all_defined([t, core]) ? (core + t) : size;
1153  id = all_defined([t, size]) ? (size - t) : core;
1154 
1155  if ( is_defined(id) )
1156  {
1157  difference()
1158  {
1159  ellipse(size=od);
1160 
1161  translate(is_defined(co) ? co : origin2d)
1162  rotate([0, 0, cr])
1163  ellipse(size=id);
1164  }
1165  }
1166  else
1167  {
1168  ellipse(size=od);
1169  }
1170 }
1171 
1172 //! An ellipse sector.
1173 /***************************************************************************//**
1174  \param size <decimal-list-2|decimal> A list [rx, ry] of decimals
1175  or a single decimal for (rx=ry).
1176 
1177  \param a1 <decimal> The start angle in degrees.
1178  \param a2 <decimal> The stop angle in degrees.
1179 
1180  \details
1181 
1182  \b Example
1183  \amu_eval ( function=ellipse_s ${example_dim} )
1184 *******************************************************************************/
1185 module ellipse_s
1187  size,
1188  a1 = 0,
1189  a2 = 0
1190 )
1191 {
1192  rx = edefined_or(size, 0, size);
1193  ry = edefined_or(size, 1, rx);
1194 
1195  trx = rx * sqrt(2) + 1;
1196  try = ry * sqrt(2) + 1;
1197 
1198  pa0 = (4 * a1 + 0 * a2) / 4;
1199  pa1 = (3 * a1 + 1 * a2) / 4;
1200  pa2 = (2 * a1 + 2 * a2) / 4;
1201  pa3 = (1 * a1 + 3 * a2) / 4;
1202  pa4 = (0 * a1 + 4 * a2) / 4;
1203 
1204  if (a2 > a1)
1205  {
1206  intersection()
1207  {
1208  ellipse(size);
1209 
1210  polygon
1211  ([
1212  origin2d,
1213  [trx * cos(pa0), try * sin(pa0)],
1214  [trx * cos(pa1), try * sin(pa1)],
1215  [trx * cos(pa2), try * sin(pa2)],
1216  [trx * cos(pa3), try * sin(pa3)],
1217  [trx * cos(pa4), try * sin(pa4)],
1218  origin2d
1219  ]);
1220  }
1221  }
1222  else
1223  {
1224  ellipse(size);
1225  }
1226 }
1227 
1228 //! A sector of an ellipse with a removed elliptical core.
1229 /***************************************************************************//**
1230  \param size <decimal-list-2|decimal> A list [rx, ry] of decimals
1231  or a single decimal for (rx=ry).
1232  \param core <decimal-list-2|decimal> A list [rx, ry] of decimals
1233  or a single decimal for (rx=ry).
1234 
1235  \param t <decimal-list-2|decimal> A list [x, y] of decimals
1236  or a single decimal for (x=y).
1237 
1238  \param a1 <decimal> The start angle in degrees.
1239  \param a2 <decimal> The stop angle in degrees.
1240 
1241  \param co <decimal-list-2> Core offset. A list [x, y] of decimals.
1242  \param cr <decimal> Core z-rotation.
1243 
1244  \details
1245 
1246  Thickness \p t
1247  \li <tt>core = size - t</tt>; when \p t and \p size are given.
1248  \li <tt>size = core + t</tt>; when \p t and \p core are given.
1249 
1250  \b Example
1251  \amu_eval ( function=ellipse_cs ${example_dim} )
1252 *******************************************************************************/
1253 module ellipse_cs
1255  size,
1256  core,
1257  t,
1258  a1 = 0,
1259  a2 = 0,
1260  co,
1261  cr = 0
1262 )
1263 {
1264  od = all_defined([t, core]) ? (core + t) : size;
1265  id = all_defined([t, size]) ? (size - t) : core;
1266 
1267  if ( is_defined(id) )
1268  {
1269  difference()
1270  {
1271  ellipse_s(a1=a1, a2=a2, size=od);
1272 
1273  translate(is_defined(co) ? co : origin2d)
1274  rotate([0, 0, cr])
1275  ellipse(size=id);
1276  }
1277  }
1278  else
1279  {
1280  ellipse_s(a1=a1, a2=a2, size=od);
1281  }
1282 }
1283 
1284 //! A two-dimensional star.
1285 /***************************************************************************//**
1286  \param size <decimal-list-2|decimal> A list [l, w] of decimals
1287  or a single decimal for (size=l=2*w).
1288 
1289  \param n <decimal> The number of points.
1290 
1291  \param vr <decimal-list-3|decimal> The vertex rounding radius.
1292  A list [v1r, v2r, v3r] of decimals or a single decimal for
1293  (v1r=v2r=v3r).
1294 
1295  \details
1296 
1297  \b Example
1298  \amu_eval ( function=star2d ${example_dim} )
1299 *******************************************************************************/
1300 module star2d
1302  size,
1303  n = 5,
1304  vr
1305 )
1306 {
1307  l = edefined_or(size, 0, size);
1308  w = edefined_or(size, 1, l/2);
1309 
1310  radial_repeat(n=n, angle=true, move=false)
1311  rotate([0, 0, -90])
1312  translate([-w/2, 0])
1313  triangle_ls(v=[w, l, l], vr=vr);
1314 }
1315 
1316 //! @}
1317 //! @}
1318 
1319 //----------------------------------------------------------------------------//
1320 // openscad-amu auxiliary scripts
1321 //----------------------------------------------------------------------------//
1322 
1323 /*
1324 BEGIN_SCOPE dim;
1325  BEGIN_OPENSCAD;
1326  include <shapes/shapes2d.scad>;
1327 
1328  shape = "ellipse_cs";
1329  $fn = 72;
1330 
1331  if (shape == "rectangle")
1332  rectangle( size=[25,40], vr=[0,10,10,5], vrm=4, center=true );
1333  else if (shape == "rectangle_c")
1334  rectangle_c( size=[40,25], t=[15,5], vr1=[0,0,10,10], vr2=2.5, vrm2=3, co=[0,5], center=true );
1335  else if (shape == "rhombus")
1336  rhombus( size=[40,25], vr=[2,4,2,4], center=true );
1337  else if (shape == "triangle_ppp")
1338  triangle_ppp( v1=[0,0], v2=[5,25], v3=[40,5], vr=2, centroid=true );
1339  else if (shape == "triangle_sss")
1340  triangle_sss( s1=30, s2=40, s3=50, vr=2, centroid=true );
1341  else if (shape == "triangle_ls_c")
1342  triangle_ls_c( vs=[30,50,50], vc=[20,40,40], co=[0,-4], vr1=[1,1,6], vr2=4, centroid=true );
1343  else if (shape == "triangle_sas")
1344  triangle_sas( s1=50, a=60, s2=30, vr=2, centroid=true );
1345  else if (shape == "triangle_asa")
1346  triangle_asa( a1=30, s=50, a2=60, vr=2, centroid=true );
1347  else if (shape == "triangle_aas")
1348  triangle_aas( a1=60, a2=30, s=40, vr=2, centroid=true );
1349  else if (shape == "triangle_ss")
1350  triangle_ss( x=30, y=40, vr=2, centroid=true );
1351  else if (shape == "triangle_sa")
1352  triangle_sa( x=40, aa=30, vr=2, centroid=true );
1353  else if (shape == "ngon")
1354  ngon( n=6, r=25, vr=6 );
1355  else if (shape == "ellipse")
1356  ellipse( size=[25, 40] );
1357  else if (shape == "ellipse_c")
1358  ellipse_c( size=[25,40], core=[16,10], co=[0,10], cr=45 );
1359  else if (shape == "ellipse_s")
1360  ellipse_s( size=[25,40], a1=90, a2=180 );
1361  else if (shape == "ellipse_cs")
1362  ellipse_cs( size=[25,40], t=[10,5], a1=90, a2=180, co=[10,0], cr=45);
1363  else if (shape == "star2d")
1364  star2d( size=[40, 15], n=5, vr=2 );
1365  END_OPENSCAD;
1366 
1367  BEGIN_MFSCRIPT;
1368  include --path "${INCLUDE_PATH}" {config_base,config_png}.mfs;
1369 
1370  views name "views" views "top";
1371  defines name "shapes" define "shape"
1372  strings "
1373  rectangle
1374  rectangle_c
1375  rhombus
1376  triangle_ppp
1377  triangle_sss
1378  triangle_ls_c
1379  triangle_sas
1380  triangle_asa
1381  triangle_aas
1382  triangle_ss
1383  triangle_sa
1384  ngon
1385  ellipse
1386  ellipse_c
1387  ellipse_s
1388  ellipse_cs
1389  star2d
1390  ";
1391  variables add_opts_combine "views shapes";
1392  variables add_opts "--viewall --autocenter";
1393 
1394  include --path "${INCLUDE_PATH}" script_std.mfs;
1395  END_MFSCRIPT;
1396 END_SCOPE;
1397 
1398 BEGIN_SCOPE manifest;
1399  BEGIN_OPENSCAD;
1400  include <shapes/shapes2d.scad>;
1401 
1402  $fn = 72;
1403 
1404  grid_repeat( g=5, i=60, center=true )
1405  {
1406  rectangle( size=[25,40], vr=[0,10,10,5], vrm=4, center=true );
1407  rectangle_c( size=[40,25], t=[15,5], vr1=[0,0,10,10], vr2=2.5, vrm2=3, co=[0,5], center=true );
1408  rhombus( size=[40,25], vr=[2,4,2,4], center=true );
1409  triangle_ppp( v1=[0,0], v2=[5,25], v3=[40,5], vr=2, centroid=true );
1410  triangle_sss( s1=30, s2=40, s3=50, vr=2, centroid=true );
1411  triangle_ls_c( vs=[30,50,50], vc=[20,40,40], co=[0,-4], vr1=[1,1,6], vr2=4, centroid=true );
1412  triangle_sas( s1=50, a=60, s2=30, vr=2, centroid=true );
1413  triangle_asa( a1=30, s=50, a2=60, vr=2, centroid=true );
1414  triangle_aas( a1=60, a2=30, s=40, vr=2, centroid=true );
1415  triangle_ss( x=30, y=40, vr=2, centroid=true );
1416  triangle_sa( x=40, aa=30, vr=2, centroid=true );
1417  ngon( n=6, r=25, vr=6 );
1418  ellipse( size=[25, 40] );
1419  ellipse_c( size=[25,40], core=[16,10], co=[0,10], cr=45 );
1420  ellipse_s( size=[25,40], a1=90, a2=180 );
1421  ellipse_cs( size=[25,40], t=[10,5], a1=90, a2=180, co=[10,0], cr=45);
1422  star2d( size=[40, 15], n=5, vr=2 );
1423  }
1424  END_OPENSCAD;
1425 
1426  BEGIN_MFSCRIPT;
1427  include --path "${INCLUDE_PATH}" {config_base,config_svg}.mfs;
1428  include --path "${INCLUDE_PATH}" script_std.mfs;
1429  END_MFSCRIPT;
1430 END_SCOPE;
1431 */
1432 
1433 //----------------------------------------------------------------------------//
1434 // end of file
1435 //----------------------------------------------------------------------------//
module radial_repeat(n, r=1, angle=true, move=false)
Distribute copies of a 2d or 3d shape equally about a z-axis radius.
module rectangle(size, vr, vrm=0, center=false)
A rectangle with edge, fillet, and/or chamfer corners.
Definition: shapes2d.scad:117
module triangle_sa(x, y, aa, oa, vr, v1r, v2r, v3r, centroid=false, incenter=false)
A right-angled triangle specified by a side length and an angle.
Definition: shapes2d.scad:1016
module ellipse_cs(size, core, t, a1=0, a2=0, co, cr=0)
A sector of an ellipse with a removed elliptical core.
Definition: shapes2d.scad:1254
module ngon(n, r, vr)
An n-sided equiangular/equilateral regular polygon.
Definition: shapes2d.scad:1069
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.
Definition: shapes2d.scad:237
function rpolygon_lp(n, r, a, vr, cw=true)
Compute the coordinates for an n-sided regular polygon.
function defined_or(v, d)
Return a value when it is defined or a default value when it is not.
module ellipse_c(size, core, t, co, cr=0)
An ellipse with a removed elliptical core.
Definition: shapes2d.scad:1144
module ellipse_s(size, a1=0, a2=0)
An ellipse sector.
Definition: shapes2d.scad:1186
function all_defined(v)
Test if no element of a list of values is undefined.
function is_scalar(v)
Test if a value is a single non-iterable value.
function edefined_or(v, i, d)
Return an iterable element when it exists or a default value when it does not.
module triangle_lp(v, vr, centroid=false, incenter=false)
A general triangle specified by a list of its three vertices.
Definition: shapes2d.scad:480
module log_warn(m)
Output warning message to console.
Definition: console.scad:137
module triangle_ss(x, y, vr, v1r, v2r, v3r, centroid=false, incenter=false)
A right-angled triangle specified by its opposite and adjacent side lengths.
Definition: shapes2d.scad:973
module triangle_ls(v, vr, centroid=false, incenter=false)
A general triangle specified by a list of its three side lengths.
Definition: shapes2d.scad:591
function any_undefined(v)
Test if any element of a list of values is undefined.
module triangle_sss(s1, s2, s3, vr, v1r, v2r, v3r, centroid=false, incenter=false)
A general triangle specified by its three side lengths.
Definition: shapes2d.scad:530
function triangle_centroid_ppp(v1, v2, v3)
Compute the centroid (geometric center) of a triangle.
function not_defined(v)
Test if a value is not defined.
function unit_l(l)
Compute the normalized unit vector of a Euclidean line (or vector).
module triangle_aas(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.
Definition: shapes2d.scad:896
function is_defined(v)
Test if a value is defined.
module triangle_sas(s1, a, s2, x=1, vr, v1r, v2r, v3r, centroid=false, incenter=false)
A general triangle specified by two sides and the included angle.
Definition: shapes2d.scad:740
function triangle_incenter_ppp(v1, v2, v3)
Compute the coordinate for the triangle's incircle.
function angle_ll(l1, l2)
Compute the angle between two lines (or vectors) in a Euclidean 3d or 2d-space.
function triangle_centroid_lp(v)
Compute the centroid (geometric center) of a triangle.
function is_nan(v)
Test if a numerical value is invalid.
module triangle_ls_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.
Definition: shapes2d.scad:646
function bitwise_is_equal(v, b, t=1)
Test if a base-two bit position of an integer value equals a test bit.
function triangle_sss2lp(s1, s2, s3, cw=true)
Compute the vertex coordinates of a triangle given its side lengths.
module triangle_ppp(v1, v2, v3, vr, v1r, v2r, v3r, centroid=false, incenter=false)
A general triangle specified by three vertices.
Definition: shapes2d.scad:403
origin2d
The origin point coordinate in 2d Euclidean space.
Definition: constants.scad:109
aeps
Epsilon, small distance to deal with overlapping shapes.
Definition: constants.scad:45
module star2d(size, n=5, vr)
A two-dimensional star.
Definition: shapes2d.scad:1301
module rhombus(size, vr, center=false)
A rhombus.
Definition: shapes2d.scad:302
module ellipse(size)
An ellipse.
Definition: shapes2d.scad:1103
function triangle_incenter_lp(v)
Compute the coordinate for the triangle's incircle.
module triangle_asa(a1, s, a2, x=1, vr, v1r, v2r, v3r, centroid=false, incenter=false)
A general triangle specified by a side and two adjacent angles.
Definition: shapes2d.scad:811