chiark / gitweb /
Move a lot of files into the utils tree
[reprap-play.git] / funcs.scad.cpp
1 // -*- C -*-
2
3 function vecdiff2d(a,b) = [b[0]-a[0], b[1]-a[1]];
4 function vecdiff(a,b)   = [b[0]-a[0], b[1]-a[1], b[2]-a[2]];
5
6 #define dsq(i) (a[i]-b[i])*(a[i]-b[i])
7 function dist2d(a,b) = sqrt(dsq(0) + dsq(1));
8 function dist(a,b)   = sqrt(dsq(0) + dsq(1) + dsq(2));
9 #undef dsq
10
11 #define vsq(i) (v[i]*v[i])
12 function vectorlen2d(v) = sqrt(vsq(0) + vsq(1));
13 function vectorlen(v)   = sqrt(vsq(0) + vsq(1) + vsq(2));
14 #undef vsq
15
16 function unitvector2d(v) = v / vectorlen2d(v);
17 function unitvector(v)   = v / vectorlen(v);
18
19 function atan2vector(v) = atan2(v[1], v[0]);
20
21 // | m[0][0] m[0][1] |
22 // | m[1][0] m[1][1] |
23 function determinant2(m) = (m[0][0] * m[1][1] - m[0][1] * m[1][0]);
24
25 function clockwise2d(v) = [v[1], -v[0]];
26
27 function rotate2d(theta, v) = [ v[0] * cos(theta) - v[1] * sin(theta),
28                                 v[1] * cos(theta) + v[0] * sin(theta) ];
29
30 // intersection of lines p1..p2 and p3..p4
31 function line_intersection_2d(p1,p2,p3,p4) = [
32   // from https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection#Given_two_points_on_each_line
33   #define XY12 determinant2([p1,p2])
34   #define XY34 determinant2([p3,p4])
35   #define XU12 QU(0,1,2)
36   #define XU34 QU(0,3,4)
37   #define YU12 QU(1,1,2)
38   #define YU34 QU(1,3,4)
39   #define QU(c,i,j) determinant2([[ p##i[c], 1 ], \
40                                  [ p##j[c], 1 ]])
41   #define DENOM \
42    determinant2([[ XU12, YU12 ], \
43                  [ XU34, YU34 ]])
44    //----
45    determinant2([[ XY12, XU12 ],
46                  [ XY34, XU34 ]]) / DENOM,
47    determinant2([[ XY12, YU12 ],
48                  [ XY34, YU34 ]]) / DENOM,
49    ];
50   #undef XY12
51   #undef XY34
52   #undef XU12
53   #undef XU34
54   #undef YU12
55   #undef YU34
56   #undef QU
57   #undef DENOM
58
59
60 function circle_point(c, r, alpha) = [ c[0] + r * cos(alpha),
61                                        c[1] + r * sin(alpha) ];
62
63 #define d     (dist2d(a,c))
64 #define alpha (atan2(a[1]-c[1],a[0]-c[0]))
65 #define gamma (asin(r / d))
66 #define beta  (alpha + 90 - gamma)
67
68 function tangent_intersect_beta(c,r,a) =
69               beta;
70
71 function tangent_intersect_b(c,r,a) =
72               circle_point(c, r, beta);
73 #undef d
74 #undef alpha
75 #undef gamma
76 #undef beta
77
78 function tangents_intersect_beta(cbig,rbig,csmall,rsmall) =
79         tangent_intersect_beta(cbig,rbig-rsmall,csmall);
80
81 function reflect_in_y(p) = [-p[0], p[1]];
82
83 function angle_map_range(in,base) =
84   in <  base       ? in + 360 :
85   in >= base + 360 ? in - 360 :
86   in;