1module m(x, y) {
2    translate(60 * [x, y]) children();
3}
4
5module shape1(w = 20) {
6    difference() {
7        square([ w,  w], center = true);
8        square([10, 10], center = true);
9    }
10}
11
12module shape2() {
13    polygon(points=[
14            [-15, 80],[15, 80],[0,-15],[-8, 60],[8, 60],[0, 5]
15    ], paths=[
16            [0,1,2],[3,4,5]
17    ]);
18}
19
20m(-1, 0) shape1();
21m(-1, 2) shape2();
22
23m(0, 0) offset() shape1();
24m(0, 1) offset(5) shape1();
25m(0, 2) offset(5) shape2();
26
27m(1, 0) offset(r = 1) shape1(30);
28m(1, 1) offset(r = 5) shape1(30);
29m(1, 2) offset(r = 5) shape2();
30
31m(2, 0) offset(r = -5) shape1(40);
32m(2, 1) offset(r = -10.01) shape1(50);
33m(2, 2) offset(r = -1) shape2();
34
35m(3, 0) offset(delta = 4) shape1();
36m(3, 1) offset(delta = 1) shape1();
37m(3, 2) offset(delta = 5) shape2();
38
39m(4, 0) offset(delta = -2) shape1(30);
40m(4, 1) offset(delta = -5) shape1(40);
41m(4, 2) offset(delta = -1) shape2();
42
43m(5, 0) offset(delta = 4, chamfer = true) shape1();
44m(5, 1) offset(delta = 1, chamfer = true) shape1();
45m(5, 2) offset(delta = 5, chamfer = true) shape2();
46
47m(6, 0) offset(delta = -2, chamfer = true) shape1(30);
48m(6, 1) offset(delta = -5, chamfer = true) shape1(40);
49m(6, 2) offset(delta = -1, chamfer = true) shape2();
50
51// Bug with fragment calculateion with delta < 1 due to abs() instead of std::abs()
52m(-2, 1) scale([30, 30]) offset(r = 0.8) square(1);
53
54// Malformed offsets
55offset();
56offset() square(0);
57