1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-09-15 00:53:15 +02:00

345 Commits
v3.1 ... v3.2

Author SHA1 Message Date
Justin Lin
1d946647eb ship 3.2 2021-12-09 07:56:05 +08:00
Justin Lin
c5a99c3223 add rubber_duck_debugging 2021-12-05 13:55:41 +08:00
Justin Lin
39e363d59c thin tail 2021-12-04 16:50:36 +08:00
Justin Lin
9478d1ec60 update docs 2021-12-04 12:16:20 +08:00
Justin Lin
134ca1b364 refactor 2021-12-04 11:52:25 +08:00
Justin Lin
e7c38fa876 dot notation indexing 2021-12-04 11:23:04 +08:00
Justin Lin
bd8f755a6c it's y 2021-12-04 11:21:48 +08:00
Justin Lin
91d5c40336 use polyline_join 2021-12-04 10:57:29 +08:00
Justin Lin
5c8c0b8139 update doc 2021-12-04 10:17:13 +08:00
Justin Lin
324693a38f dot notation indexing 2021-12-04 10:16:45 +08:00
Justin Lin
14a6348771 update test 2021-12-04 09:58:07 +08:00
Justin Lin
7d9cb94f22 dot notation indexing 2021-12-04 09:58:00 +08:00
Justin Lin
90a29ceecd dot notation indexing 2021-12-04 08:56:09 +08:00
Justin Lin
e7bfb3c951 update doc 2021-12-03 09:45:52 +08:00
Justin Lin
59eb3a1dc2 update doc 2021-12-03 09:43:24 +08:00
Justin Lin
e49c40e0f0 add polar_zonohedra 2021-12-03 09:30:06 +08:00
Justin Lin
d822688eaf modify jaw 2021-12-02 16:03:55 +08:00
Justin Lin
d25b73dbda update note 2021-12-02 10:48:12 +08:00
Justin Lin
22dce8fee2 add polar_zonohedra 2021-12-02 10:47:32 +08:00
Justin Lin
abd287b29e rename 2021-12-02 10:25:53 +08:00
Justin Lin
a82827e389 pitch 2021-12-01 19:55:03 +08:00
Justin Lin
c6a661e074 add polar_zonohedra 2021-12-01 17:36:44 +08:00
Justin Lin
0490da4b91 add infinity_dragon 2021-11-30 10:36:59 +08:00
Justin Lin
364488970b update length 2021-11-30 09:13:33 +08:00
Justin Lin
4eda143bbb move 2021-11-30 08:23:41 +08:00
Justin Lin
2a87a2221f add lemniscate_2circles 2021-11-29 10:45:25 +08:00
Justin Lin
39cbc9a069 add comment 2021-11-29 10:01:00 +08:00
Justin Lin
55e64dcb53 change a default 2021-11-29 09:56:47 +08:00
Justin Lin
154436382c add lemniscate_curve 2021-11-29 09:49:45 +08:00
Justin Lin
90c6db16d5 union all 2021-11-22 18:02:10 +08:00
Justin Lin
0ec9f0e0e5 update doc 2021-11-22 09:46:34 +08:00
Justin Lin
218830d252 update README 2021-11-22 09:39:21 +08:00
Justin Lin
84f3636bf0 update note 2021-11-22 09:37:14 +08:00
Justin Lin
d9dd44db29 update README 2021-11-22 09:36:37 +08:00
Justin Lin
9577f68d13 deprecated 2021-11-22 09:32:36 +08:00
Justin Lin
7a8c152607 use new modules/functions 2021-11-22 09:31:05 +08:00
Justin Lin
345603551b use shape_star 2021-11-19 16:17:00 +08:00
Justin Lin
610c9588bd use polyline_join 2021-11-18 08:08:50 +08:00
Justin Lin
7b1095d130 update docs 2021-11-17 11:05:38 +08:00
Justin Lin
884892a3f1 use path_scaling_sections 2021-11-14 18:36:23 +08:00
Justin Lin
2600504dd5 add tiled_line_ring 2021-11-14 10:39:13 +08:00
Justin Lin
f27250d285 format 2021-11-13 09:44:22 +08:00
Justin Lin
5016231000 refactor 2021-11-12 09:54:03 +08:00
Justin Lin
402aa95289 update README 2021-11-10 11:27:14 +08:00
Justin Lin
50d11142d5 refine feet 2021-11-09 21:06:36 +08:00
Justin Lin
031438a4df update README 2021-11-09 18:17:41 +08:00
Justin Lin
9063d9da05 add torus_knot_dragon_and_pearl 2021-11-09 18:17:37 +08:00
Justin Lin
3fbee973a9 refactor 2021-11-09 16:57:51 +08:00
Justin Lin
3b5af34041 add doc 2021-11-07 16:01:53 +08:00
Justin Lin
824aefefd9 rename 2021-11-05 08:34:33 +08:00
Justin Lin
4cdeb5b4a6 add doc 2021-11-05 08:33:44 +08:00
Justin Lin
9271c79a3a add doc 2021-11-03 08:04:28 +08:00
Justin Lin
3b2b07ae25 del svg 2021-11-02 18:01:41 +08:00
Justin Lin
214b0a2640 update LICENSE 2021-11-02 17:55:28 +08:00
Justin Lin
29da8be872 add doc 2021-11-01 08:10:17 +08:00
Justin Lin
10930e8b1c add star 2021-10-29 16:49:18 +08:00
Justin Lin
756ed377c3 update README 2021-10-29 11:48:50 +08:00
Justin Lin
300f72a959 update note 2021-10-29 11:47:10 +08:00
Justin Lin
faf53b3846 add shape_star 2021-10-29 11:45:14 +08:00
Justin Lin
2376e429d1 update README 2021-10-28 15:15:44 +08:00
Justin Lin
b0817f2339 del unused module 2021-10-28 15:13:30 +08:00
Justin Lin
0304233cdc delete unused function 2021-10-28 15:11:34 +08:00
Justin Lin
4176cb476e add wormhole 2021-10-28 10:38:26 +08:00
Justin Lin
3901e4f1ea add doc 2021-10-28 08:20:03 +08:00
Justin Lin
9022cb731d rename 2021-10-28 08:04:26 +08:00
Justin Lin
b76a2f9c32 add doc 2021-10-28 07:42:16 +08:00
Justin Lin
bb2f10043f update example 2021-10-27 15:51:35 +08:00
Justin Lin
5b65cc16a7 rename 2021-10-26 16:51:54 +08:00
Justin Lin
8cdfe435ee rename 2021-10-26 10:29:10 +08:00
Justin Lin
1cddbc3453 rename 2021-10-26 10:25:49 +08:00
Justin Lin
50621b0306 change param 2021-10-26 09:36:26 +08:00
Justin Lin
8dad1bd4b6 add platonic_solid_frame 2021-10-26 09:33:47 +08:00
Justin Lin
c6b0c30fd8 reverse face 2021-10-26 09:08:01 +08:00
Justin Lin
a6d0c85dbe update README 2021-10-25 11:30:33 +08:00
Justin Lin
87deb39a4b add central_scale 2021-10-24 14:08:23 +08:00
Justin Lin
bfa0fd2b11 add doc 2021-10-21 17:09:54 +08:00
Justin Lin
2bd663d46b update doc 2021-10-18 16:06:05 +08:00
Justin Lin
5c1c6a7463 update doc 2021-10-18 16:04:53 +08:00
Justin Lin
ca92286690 update doc 2021-10-18 16:04:29 +08:00
Justin Lin
cbff19c33e add comment 2021-10-18 16:02:19 +08:00
Justin Lin
43b22a0f4c add comments 2021-10-18 16:01:53 +08:00
Justin Lin
6bda39ecef add doc 2021-10-18 16:00:56 +08:00
Justin Lin
37c3a647a5 refactor 2021-10-15 10:20:18 +08:00
Justin Lin
59ae93ba5f calculate r_base directly 2021-10-14 22:11:14 +08:00
Justin Lin
6d6f62c77f refactor 2021-10-14 18:25:10 +08:00
Justin Lin
a8ae7c18e4 rewrite polyhedra 2021-10-14 18:22:05 +08:00
Justin Lin
9c3c92ab13 update README 2021-10-13 16:12:17 +08:00
Justin Lin
f1116dc8cf add doc 2021-10-13 16:09:12 +08:00
Justin Lin
5a44454547 fix join index 2021-10-13 16:06:22 +08:00
Justin Lin
57d46eda8d update README 2021-10-12 16:38:05 +08:00
Justin Lin
4a19b445ab update README 2021-10-12 16:35:02 +08:00
Justin Lin
675f80159e add doc 2021-10-12 16:24:03 +08:00
Justin Lin
1132451009 i can be ignored 2021-10-12 16:23:55 +08:00
Justin Lin
c78fb13731 update README 2021-10-08 10:05:14 +08:00
Justin Lin
a53c202c48 update README 2021-10-08 10:04:24 +08:00
Justin Lin
ccbd81b88e update note 2021-10-08 09:36:51 +08:00
Justin Lin
a14c5676d4 use polyline_join 2021-10-08 09:36:01 +08:00
Justin Lin
e9440e55d6 scale first cat 2021-10-07 09:49:55 +08:00
Justin Lin
8f1d6a6e1a refactor 2021-10-06 16:33:17 +08:00
Justin Lin
95dc133d0d refactor 2021-10-06 16:29:33 +08:00
Justin Lin
dbdf8a757d move octahedron 2021-10-06 16:08:20 +08:00
Justin Lin
d6affc1ff5 add polyhedra 2021-10-06 15:54:20 +08:00
Justin Lin
f7e81a78e3 update readme 2021-10-06 15:53:57 +08:00
Justin Lin
63a5e53572 refactor 2021-10-04 12:39:16 +08:00
Justin Lin
006572c5bf move 2021-10-04 08:01:18 +08:00
Justin Lin
3678b8b6d7 move 2021-10-04 07:58:45 +08:00
Justin Lin
89eb57652b refactor 2021-10-01 14:17:53 +08:00
Justin Lin
0a24f4fc67 refactor 2021-10-01 13:39:12 +08:00
Justin Lin
6e8277c91d rename 2021-10-01 13:28:30 +08:00
Justin Lin
9071ac3788 update doc 2021-10-01 10:30:10 +08:00
Justin Lin
f1b1239950 fix wrong angleyz 2021-10-01 10:28:42 +08:00
Justin Lin
71b6203d9c fix 2D to 3D bugs 2021-10-01 09:54:47 +08:00
Justin Lin
fa0e77ebaf depends on $children 2021-10-01 09:15:06 +08:00
Justin Lin
6e38061655 refactor 2021-10-01 08:47:45 +08:00
Justin Lin
ac2c420487 refactor 2021-10-01 08:46:08 +08:00
Justin Lin
a29b851500 update note 2021-10-01 08:31:00 +08:00
Justin Lin
bc17a2df19 add polyline_hull 2021-10-01 08:27:07 +08:00
Justin Lin
d701b537f0 remove children support 2021-10-01 08:26:06 +08:00
Justin Lin
4683ff5a46 refactor 2021-10-01 08:20:49 +08:00
Justin Lin
06c1ef94bc refactor 2021-10-01 08:08:11 +08:00
Justin Lin
e2958b6ae1 use for-loop 2021-10-01 08:03:07 +08:00
Justin Lin
a2971ec1d0 add fidget_cat 2021-09-24 16:11:25 +08:00
Justin Lin
1634403e28 refactor 2021-09-23 07:46:45 +08:00
Justin Lin
57da4b39ad add hexahedron 2021-09-22 16:56:46 +08:00
Justin Lin
5374999967 add tetrahedron 2021-09-22 16:39:04 +08:00
Justin Lin
60f3698200 delete unnecessary code 2021-09-22 16:36:21 +08:00
Justin Lin
83b1843f3f add octahedron 2021-09-22 16:35:22 +08:00
Justin Lin
b2d2940ef1 refactor 2021-09-22 16:30:28 +08:00
Justin Lin
3c0c524186 format 2021-09-22 16:22:45 +08:00
Justin Lin
4eef2c6dde refactor 2021-09-22 16:22:09 +08:00
Justin Lin
af9cfb16e4 add dodecahedron 2021-09-22 16:08:48 +08:00
Justin Lin
9340f73f1a add geom_dodecahedron 2021-09-22 16:07:34 +08:00
Justin Lin
66d02d02e2 change default values 2021-09-19 10:40:12 +08:00
Justin Lin
44165275e7 create bottom 2021-09-19 09:32:37 +08:00
Justin Lin
dcda61390c shell param is not necessary 2021-09-18 17:14:15 +08:00
Justin Lin
58a7a20c53 don't concat 2021-09-18 16:26:28 +08:00
Justin Lin
d0bc8c0f7f shell_random_threshold default to 0.5 2021-09-18 16:22:12 +08:00
Justin Lin
26fcdbe8e3 add shell_random_threshold 2021-09-18 16:21:44 +08:00
Justin Lin
704ed1e725 add shell param 2021-09-18 12:22:46 +08:00
Justin Lin
702aab846e add shell 2021-09-18 12:21:03 +08:00
Justin Lin
fbc07cec80 we don't have to mod nums_of_buckets 2021-09-16 07:50:37 +08:00
Justin Lin
b1b61fddbf single a_step is ok 2021-09-10 15:17:33 +08:00
Justin Lin
89096ad329 update comment 2021-09-10 12:22:25 +08:00
Justin Lin
e5b1a6cf93 add superellipsoid 2021-09-10 12:11:38 +08:00
Justin Lin
523ce3cb33 add perlin_sphere 2021-09-10 09:45:53 +08:00
Justin Lin
ea36c97ac7 performance improved 2021-09-09 17:37:33 +08:00
Justin Lin
5e7b5f1691 update doc 2021-09-09 16:31:42 +08:00
Justin Lin
8fb3d5b579 add rand_pts_circle 2021-09-08 18:02:17 +08:00
Justin Lin
cafa0ebd06 update comment 2021-09-08 18:01:59 +08:00
Justin Lin
a2fee75749 adjust size of bucket 2021-09-08 11:45:04 +08:00
Justin Lin
0725d945de delete unused modules 2021-09-08 10:49:21 +08:00
Justin Lin
41ebc07fd0 don't use quick_mode 2021-09-08 10:48:43 +08:00
Justin Lin
c59fdc5f1d provide quick_mode 2021-09-08 08:36:33 +08:00
Justin Lin
23ed306148 performance improved 2021-09-07 15:59:11 +08:00
Justin Lin
657c10a9cc performance improved 2021-09-07 15:47:07 +08:00
Justin Lin
8da1912fff add _pt3_hash 2021-09-07 15:47:01 +08:00
Justin Lin
fd375dd50f rename 2021-09-07 10:21:24 +08:00
Justin Lin
69e2a79488 use geom_isosphere to rewrite 2021-09-07 10:14:45 +08:00
Justin Lin
e5af7b3027 refactor 2021-09-07 10:12:29 +08:00
Justin Lin
9c532acce4 refactor 2021-09-07 10:03:47 +08:00
Justin Lin
1d085c35d0 add isosphere 2021-09-06 17:36:44 +08:00
Justin Lin
09d898c035 add tri_subdivide 2021-09-06 17:23:51 +08:00
Justin Lin
12e6af2492 delete repeated function 2021-09-05 15:33:26 +08:00
Justin Lin
f3a5ce76e3 delete unused function 2021-09-05 15:28:16 +08:00
Justin Lin
8ca4e12b22 add fidget_heart 2021-09-04 08:39:36 +08:00
Justin Lin
e021750d7b clean code 2021-09-03 15:37:35 +08:00
Justin Lin
43fa3fb5fd rename variables 2021-09-03 11:40:08 +08:00
Justin Lin
853da1f9e2 refactor 2021-09-03 11:38:21 +08:00
Justin Lin
346cea1db8 add r_union 2021-09-03 11:29:32 +08:00
Justin Lin
c6ca52aba8 add r_union2 2021-09-03 11:18:03 +08:00
Justin Lin
5863a5c3f6 clean code 2021-09-03 07:40:17 +08:00
Justin Lin
43d614ba7c add euler_spiral 2021-08-31 11:28:42 +08:00
Justin Lin
fb0672480f dedup befor drawing 2021-08-31 10:02:48 +08:00
Justin Lin
3d1a4cbb33 rename 2021-08-31 08:29:37 +08:00
Justin Lin
0494ef7f32 del unnecessary code 2021-08-30 08:09:29 +08:00
Justin Lin
9850227fe4 adjust face 2021-08-29 21:39:18 +08:00
Justin Lin
4f22f8489a accept diff font and font_size 2021-08-29 17:51:37 +08:00
Justin Lin
210844c9f8 emoticon moai 2021-08-29 09:01:35 +08:00
Justin Lin
e9095eaff5 add ears 2021-08-29 08:21:16 +08:00
Justin Lin
950c7a5937 add moai 2021-08-27 19:50:18 +08:00
Justin Lin
9cbac21f17 del unused module 2021-08-27 07:54:06 +08:00
Justin Lin
30f83865f1 add tri_arc_path 2021-08-26 21:13:12 +08:00
Justin Lin
b6d86ab4ba angle_between adds a ccw param 2021-08-26 21:09:32 +08:00
Justin Lin
2355820034 change param 2021-08-26 20:27:42 +08:00
Justin Lin
679e3aae62 add tri_is_ccw 2021-08-26 18:49:42 +08:00
Justin Lin
21754293c8 add lavender 2021-08-25 17:33:24 +08:00
Justin Lin
d4a865080c fix error vector 2021-08-25 14:43:47 +08:00
Justin Lin
b79131f9bc add nose param 2021-08-24 16:46:54 +08:00
Justin Lin
7aad397860 rename 2021-08-24 16:44:16 +08:00
Justin Lin
b209c40d99 remove render 2021-08-24 09:10:54 +08:00
Justin Lin
d8122150a1 allow one word 2021-08-24 09:05:16 +08:00
Justin Lin
e507f71619 scale decoratiokn 2021-08-24 08:58:41 +08:00
Justin Lin
966f6f6850 rename 2021-08-23 15:31:27 +08:00
Justin Lin
d35fe91246 font default to 思源黑體 Medium 2021-08-23 15:20:27 +08:00
Justin Lin
2f9509c249 model default to both 2021-08-23 15:17:32 +08:00
Justin Lin
0810d86314 scale 0.7 2021-08-23 15:16:39 +08:00
Justin Lin
52e43aa03c adjust 2021-08-23 09:10:00 +08:00
Justin Lin
d875d41e4c rename 2021-08-23 08:44:51 +08:00
Justin Lin
82ec74eee1 add tumbler_helmet 2021-08-22 20:33:03 +08:00
Justin Lin
3390b0587d refactor 2021-08-22 20:32:47 +08:00
Justin Lin
433040f363 use string directly 2021-08-22 17:45:54 +08:00
Justin Lin
8cc0eeebc3 don't cut bottom 2021-08-22 16:04:06 +08:00
Justin Lin
803906e8cd remove render 2021-08-22 15:36:25 +08:00
Justin Lin
03f4939fe1 scale when smoothing 2021-08-22 15:33:02 +08:00
Justin Lin
066e5fc55d add tumbler 2021-08-22 15:21:57 +08:00
Justin Lin
aeb9dec141 change param value 2021-08-21 12:37:02 +08:00
Justin Lin
bfa3d6b8ff rename 2021-08-21 10:43:15 +08:00
Justin Lin
4fb0f9ac7b add engraved param 2021-08-21 10:11:46 +08:00
Justin Lin
e5eeb77292 delete extra support 2021-08-20 21:41:40 +08:00
Justin Lin
2e5b245167 update note 2021-08-20 21:29:57 +08:00
Justin Lin
a37c6030e9 add convexity param 2021-08-20 21:28:17 +08:00
Justin Lin
13ca93e9db extra support 2021-08-20 21:11:13 +08:00
Justin Lin
749079767d refactor 2021-08-19 16:37:58 +08:00
Justin Lin
d8a444099f add ivory_ball_fern_leaf 2021-08-19 16:36:42 +08:00
Justin Lin
0dc5544e2e use relative path 2021-08-19 16:12:40 +08:00
Justin Lin
ac41769faa change param name 2021-08-19 12:37:35 +08:00
Justin Lin
bcbc4e09a5 add worley_sphere 2021-08-19 12:30:54 +08:00
Justin Lin
888460d2e3 add param 2021-08-19 10:42:12 +08:00
Justin Lin
c5be2d398a add polyhedron_abuse param (hidden feature) 2021-08-18 17:56:30 +08:00
Justin Lin
798676e2eb refactor 2021-08-18 16:24:57 +08:00
Justin Lin
ad6b0ae4f1 add fidget ball 2021-08-18 12:44:32 +08:00
Justin Lin
9829c5c201 add kogan_sphere 2021-08-16 18:22:02 +08:00
Justin Lin
fd6fbbc92f add penrose_basket 2021-08-16 13:13:31 +08:00
Justin Lin
6aaab429fb add ptf_c2sphere 2021-08-16 12:23:27 +08:00
Justin Lin
d00f51edcb update examples 2021-08-15 14:02:56 +08:00
Justin Lin
0c1e85e5db init from OBTUSE 2021-08-15 13:58:14 +08:00
Justin Lin
ed3b8c1422 add triangles param 2021-08-15 11:48:57 +08:00
Justin Lin
7574f0aa3d mirror tri to tile 2021-08-15 11:24:32 +08:00
Justin Lin
62c4e1c656 add triangles param 2021-08-15 10:23:11 +08:00
Justin Lin
af88ee6e86 add worley_vase 2021-08-14 09:26:13 +08:00
Justin Lin
30d60d643f add images 2021-08-14 09:24:56 +08:00
Justin Lin
0d63029c4c update note 2021-08-14 09:10:48 +08:00
Justin Lin
c58e019b69 add rail_extruded_sections 2021-08-14 09:10:11 +08:00
Justin Lin
249cced4c7 update doc 2021-08-14 09:09:47 +08:00
Justin Lin
2a4bd4c006 use rails2sections 2021-08-14 08:44:09 +08:00
Justin Lin
569a0091c3 add rails2sections 2021-08-14 08:34:41 +08:00
Justin Lin
beaf6fb776 delete depreated doc 2021-08-14 08:29:41 +08:00
Justin Lin
9f8614397b better bottom fitness 2021-08-13 20:50:33 +08:00
Justin Lin
0c3c0286e9 tri is [type, vertices] 2021-08-13 15:01:02 +08:00
Justin Lin
026cd9391e add tile_penrose2 2021-08-13 14:59:25 +08:00
Justin Lin
58a293f6c8 fix fn 2021-08-12 16:03:14 +08:00
Justin Lin
0e6d98fd1e delete q 2021-08-12 08:03:29 +08:00
Justin Lin
7d8bfc6099 change vertices order 2021-08-11 20:18:33 +08:00
Justin Lin
2844a30d91 change vertices order 2021-08-11 20:03:51 +08:00
Justin Lin
9b0c825f92 simplify subdivid 2021-08-11 17:48:01 +08:00
Justin Lin
428af98b5d update type 2021-08-11 17:38:42 +08:00
Justin Lin
505e384343 rename fn 2021-08-11 17:16:50 +08:00
Justin Lin
9fe43dc7b2 delete ) 2021-08-11 17:14:24 +08:00
Justin Lin
9955169c75 update example 2021-08-11 17:01:57 +08:00
Justin Lin
d350362c47 refactor 2021-08-11 08:28:57 +08:00
Justin Lin
26a0d7a62e refactor 2021-08-10 19:30:07 +08:00
Justin Lin
091f071cb5 add tile_penrose3 2021-08-10 11:34:52 +08:00
Justin Lin
401c6baca4 add twist_taiji 2021-08-09 16:45:11 +08:00
Justin Lin
bbe59b9dbb move 2021-08-09 16:28:14 +08:00
Justin Lin
02fd718ca7 rename 2021-08-09 15:12:59 +08:00
Justin Lin
a00945ae1f scale foot 2021-08-09 08:37:03 +08:00
Justin Lin
a599842933 add caterpillar 2021-08-08 20:26:36 +08:00
Justin Lin
da08e75e73 refactor 2021-08-08 19:25:56 +08:00
Justin Lin
a129aa547c add shape2wire 2021-08-08 14:57:52 +08:00
Justin Lin
eceb3fa282 66 vertices 2021-08-03 22:01:37 +08:00
Justin Lin
a16a8373d3 elaborate fin 2021-08-03 16:15:05 +08:00
Justin Lin
4a516bf64d elaborate it 2021-08-03 16:05:56 +08:00
Justin Lin
43285d49b1 scale down tail 2021-08-03 11:43:04 +08:00
Justin Lin
3d081ed0c3 change peral position 2021-08-03 10:23:44 +08:00
Justin Lin
9ad1835322 rename 2021-08-03 09:19:44 +08:00
Justin Lin
05737e0512 add a pearl 2021-08-03 09:18:21 +08:00
Justin Lin
8b65a1cb5c chane tail scale 2021-08-03 08:59:28 +08:00
Justin Lin
179701330f change body path 2021-08-03 08:57:25 +08:00
Justin Lin
50f87275e0 dragon 2021-08-02 22:26:03 +08:00
Justin Lin
f8037bf484 adjust head 2021-08-02 17:00:53 +08:00
Justin Lin
3f3d799870 elaborate it 2021-08-02 16:54:25 +08:00
Justin Lin
3bb5553698 random hair 2021-08-02 16:46:52 +08:00
Justin Lin
ad826cfb77 elaborate it 2021-08-02 15:24:49 +08:00
Justin Lin
fabfd1a9ce add dragon_claw 2021-08-02 15:02:15 +08:00
Justin Lin
ecd8311921 clean code 2021-08-01 16:51:11 +08:00
Justin Lin
2939d03879 re-design scales 2021-08-01 16:46:51 +08:00
Justin Lin
2d3315f9ad refactor 2021-08-01 15:31:21 +08:00
Justin Lin
7c8dec3671 re-design scales 2021-08-01 15:18:45 +08:00
Justin Lin
6bed665368 thicken beard 2021-08-01 13:24:44 +08:00
Justin Lin
5a5ee9cc0c re-design body scales 2021-08-01 13:10:15 +08:00
Justin Lin
3784469c59 refactor 2021-07-31 16:23:26 +08:00
Justin Lin
1544546cdd remove params 2021-07-31 16:19:40 +08:00
Justin Lin
7bd7326794 remove params 2021-07-31 16:18:02 +08:00
Justin Lin
0a117e0c09 rename and refactor 2021-07-31 16:16:58 +08:00
Justin Lin
3b48de2c47 add tile_hitomezashi 2021-07-31 15:25:19 +08:00
Justin Lin
0295b0ded0 refactor 2021-07-31 12:34:50 +08:00
Justin Lin
4bddf3ca33 refactor 2021-07-31 12:34:43 +08:00
Justin Lin
a8472c0831 add knot_tiles 2021-07-31 12:32:30 +08:00
Justin Lin
a56cf44b4c add choose_children 2021-07-31 12:31:56 +08:00
Justin Lin
a213a797a0 add rand_pts_sphere 2021-07-30 18:05:02 +08:00
Justin Lin
4cd74cb0bf del echo 2021-07-30 12:18:19 +08:00
Justin Lin
b722d178e7 add tiled_quarter_circles 2021-07-30 12:02:15 +08:00
Justin Lin
bf8cb44595 rename param 2021-07-30 11:43:31 +08:00
Justin Lin
6e3d3e0a4b move 2021-07-30 11:07:03 +08:00
Justin Lin
352ca21300 refactor 2021-07-30 11:06:47 +08:00
Justin Lin
5399224ff0 move 2021-07-30 11:02:55 +08:00
Justin Lin
574e4b695a refactor 2021-07-30 11:02:42 +08:00
Justin Lin
2e1959f3ef move 2021-07-30 11:02:27 +08:00
Justin Lin
8829123ade add tile_truchet 2021-07-30 10:55:36 +08:00
Justin Lin
1812e732bb refactor 2021-07-29 18:54:09 +08:00
Justin Lin
021716cf80 add tile_w2c 2021-07-29 16:58:48 +08:00
Justin Lin
3f499ca32d round-robin edges 2021-07-29 15:24:19 +08:00
Justin Lin
a11eae4aaa rename 2021-07-29 12:06:48 +08:00
Justin Lin
61f7988820 refactor 2021-07-29 12:05:18 +08:00
Justin Lin
7d47d56bdd refactor 2021-07-29 11:55:27 +08:00
Justin Lin
1a6ce7ea0a thicken beard 2021-07-22 16:25:20 +08:00
Justin Lin
9c487ec304 refactor 2021-07-22 13:31:16 +08:00
Justin Lin
5d593ecbc3 fin lifted 2021-07-21 20:55:06 +08:00
Justin Lin
9153c997eb add torus_knot_dragon2 2021-07-21 18:08:19 +08:00
Justin Lin
904e15667d simplify it 2021-07-21 13:36:42 +08:00
Justin Lin
cdccc4723b rename param 2021-07-21 11:08:22 +08:00
Justin Lin
88775366db rename param 2021-07-21 11:08:10 +08:00
Justin Lin
0d188fa96c update README 2021-07-21 11:06:19 +08:00
Justin Lin
fd1b426d4f update doc 2021-07-21 11:06:08 +08:00
Justin Lin
e1a5fcb928 simplify it 2021-07-21 09:20:42 +08:00
Justin Lin
d77581d717 adjust head 2021-07-20 17:21:59 +08:00
Justin Lin
81f5e05840 sharpen mouth 2021-07-20 16:45:09 +08:00
Justin Lin
e312c03414 fix CG error 2021-07-20 16:20:11 +08:00
Justin Lin
6c6093d46b flame mountain 2021-07-20 14:19:59 +08:00
Justin Lin
61faa5ae06 fix CG error 2021-07-20 13:32:34 +08:00
Justin Lin
ccfca4e246 curve nose 2021-07-20 12:47:46 +08:00
Justin Lin
f4fa300fac delete duplicated module 2021-07-20 12:44:17 +08:00
Justin Lin
404a01b29b curved nose 2021-07-20 12:43:10 +08:00
Justin Lin
3cae424fb4 rename 2021-07-19 18:18:25 +08:00
Justin Lin
ad926d2def rotate meme 2021-07-19 17:50:14 +08:00
Justin Lin
96f9d8c38a refactor 2021-07-19 17:49:14 +08:00
Justin Lin
3c43ef8fc2 add ms_paperclip_meme 2021-07-19 15:30:15 +08:00
Justin Lin
0d71103959 random hair 2021-07-19 11:28:07 +08:00
Justin Lin
da07c95497 random hair 2021-07-18 17:58:47 +08:00
Justin Lin
ccafbe8a3a refactor 2021-07-18 10:09:35 +08:00
Justin Lin
bed658178e refactor 2021-07-18 09:20:14 +08:00
Justin Lin
7b6e873b2a del unnecessary code 2021-07-17 20:04:48 +08:00
Justin Lin
780ecc3c06 update params 2021-07-17 18:12:12 +08:00
Justin Lin
97f4cfa60d add maze_tower 2021-07-17 17:54:40 +08:00
Justin Lin
66bf0f89bf fix seed missing 2021-07-17 14:41:46 +08:00
Justin Lin
246fc3006c rename 2021-07-15 13:52:57 +08:00
Justin Lin
aa42d2cd4e delete y_offset 2021-07-15 12:23:48 +08:00
Justin Lin
4583305c76 modify examples 2021-07-15 12:21:06 +08:00
Justin Lin
f3473e8765 add shape 2021-07-15 12:01:54 +08:00
Justin Lin
e855403d7a add shape 2021-07-15 11:31:53 +08:00
Justin Lin
d3a51b280a rename 2021-07-15 11:26:33 +08:00
Justin Lin
9863b718a0 use arc_path 2021-07-15 10:57:24 +08:00
Justin Lin
0551981b07 generalize shape 2021-07-15 10:53:07 +08:00
Justin Lin
e6639cd01c rename 2021-07-14 15:39:33 +08:00
Justin Lin
8d39873360 add twisted_donut 2021-07-14 14:52:54 +08:00
309 changed files with 6404 additions and 2265 deletions

View File

@@ -1,7 +1,7 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="84" height="20"><linearGradient id="b" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="a"><rect width="84" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#a)"><path fill="#555" d="M0 0h47v20H0z"/><path fill="#007ec6" d="M47 0h37v20H47z"/><path fill="url(#b)" d="M0 0h84v20H0z"/></g><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="11"><text x="23.5" y="15" fill="#010101" fill-opacity=".3">license</text><text x="23.5" y="14">license</text><text x="64.5" y="15" fill="#010101" fill-opacity=".3">LGPL</text><text x="64.5" y="14">LGPL</text></g></svg>

Before

Width:  |  Height:  |  Size: 793 B

223
README.md
View File

@@ -1,10 +1,8 @@
# dotSCAD 3.1
# dotSCAD 3.2
> **Reduce the burden of mathematics/algorithm when playing OpenSCAD.**
![dotSCAD](featured_img/TorusKnotMaze.JPG)
[![license/LGPL](LICENSE.svg)](https://github.com/JustinSDK/lib-openscad/blob/master/LICENSE)
![dotSCAD](featured_img/TorusKnotDragon_and_Pearl.JPG)
## Introduction
@@ -12,7 +10,7 @@ Some of my [3D models](https://github.com/JustinSDK/dotSCAD#examples) require co
The idea of the name dotSCAD comes from the filename extension ".scad" of OpenSCAD.
## Get Started
## Getting started
OpenSCAD uses three library locations, the installation library, built-in library, and user defined libraries. Check [Setting OPENSCADPATH](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Libraries#Setting_OPENSCADPATH) in [OpenSCAD User Manual/Libraries](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Libraries) for details.
@@ -39,111 +37,110 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp
[![examples](examples/images/gallery.JPG)](examples#dogfooding-examples)
# API Documentation
# API Reference
## 2D Module
Signature | Description
--|--
[**arc**(radius, angle, width = 1, width_mode = "LINE_CROSS")](https://openhome.cc/eGossip/OpenSCAD/lib3x-arc.html) | create an arc.
[**arc**(radius, angle[, width, width_mode"])](https://openhome.cc/eGossip/OpenSCAD/lib3x-arc.html) | create an arc.
[**hexagons**(radius, spacing, levels)](https://openhome.cc/eGossip/OpenSCAD/lib3x-hexagons.html) | create hexagons in a hexagon.
[**hull_polyline2d**(points, width = 1)](https://openhome.cc/eGossip/OpenSCAD/lib3x-hull_polyline2d.html) | create a 2D polyline from a list of `[x, y]`.
[**line2d**(p1, p2, width = 1, p1Style = "CAP_SQUARE", p2Style = "CAP_SQUARE")](https://openhome.cc/eGossip/OpenSCAD/lib3x-line2d.html) | create a line from two points.
[**multi_line_text**(lines, line_spacing = 15, size = 10, font = "Arial", ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-multi_line_text.html) | create multi-line text from a list of strings.
[**line2d**(p1, p2[, width, p1Style, p2Style])](https://openhome.cc/eGossip/OpenSCAD/lib3x-line2d.html) | create a line from two points.
[**multi_line_text**(lines[, line_spacing, size, font, ...])](https://openhome.cc/eGossip/OpenSCAD/lib3x-multi_line_text.html) | create multi-line text from a list of strings.
[**pie**(radius, angle)](https://openhome.cc/eGossip/OpenSCAD/lib3x-pie.html) | create polyline2de a pie (circular sector).
[**polyline2d**(points, width = 1, startingStyle = "CAP_SQUARE", endingStyle = "CAP_SQUARE", ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyline2d.html) | create a polyline from a list of `[x, y]` coordinates.
[**polyline2d**(points[, width, startingStyle, endingStyle, ...])](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyline2d.html) | create a polyline from a list of `[x, y]` coordinates.
[**polygon_hull**(points)](https://openhome.cc/eGossip/OpenSCAD/lib3x-polygon_hull.html) | create a convex polygon by hulling a list of points. It avoids using hull and small 2D primitives to create the polygon.
[**rounded_square**(size, corner_r, center = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-rounded_square.html) | create a rounded square in the first quadrant.
[**rounded_square**(size, corner_r[, center])](https://openhome.cc/eGossip/OpenSCAD/lib3x-rounded_square.html) | create a rounded square in the first quadrant.
## 3D Module
Signature | Description
--|--
[**crystal_ball**(radius, theta = 360, phi = 180, thickness = undef)](https://openhome.cc/eGossip/OpenSCAD/lib3x-crystal_ball.html) | create a crystal ball based on [spherical coordinates (r, θ, φ) used in mathematics](https://en.wikipedia.org/wiki/Spherical_coordinate_system).
[**hull_polyline3d**(points, diameter = 1)](https://openhome.cc/eGossip/OpenSCAD/lib3x-hull_polyline3d.html) | create a 3D polyline from a list of `[x, y, z]`.
[**line3d**(p1, p2, diameter = 1, p1Style = "CAP_CIRCLE", p2Style = "CAP_CIRCLE")](https://openhome.cc/eGossip/OpenSCAD/lib3x-line3d.html) | create a 3D line from two points.
[**loft**(sections, slices = 1)](https://openhome.cc/eGossip/OpenSCAD/lib3x-loft.html) | develop a smooth skin between crosssections with different geometries.
[**crystal_ball**(radius[, theta, phi, thickness])](https://openhome.cc/eGossip/OpenSCAD/lib3x-crystal_ball.html) | create a crystal ball based on [spherical coordinates (r, θ, φ) used in mathematics](https://en.wikipedia.org/wiki/Spherical_coordinate_system).
[**line3d**(p1, p2[, diameter, p1Style, p2Style])](https://openhome.cc/eGossip/OpenSCAD/lib3x-line3d.html) | create a 3D line from two points.
[**loft**(sections[, slices])](https://openhome.cc/eGossip/OpenSCAD/lib3x-loft.html) | develop a smooth skin between crosssections with different geometries.
[**polyhedron_hull**(points)](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyhedron_hull.html) | create a convex polyhedron by hulling a list of points. It avoids using `hull` and small 3D primitives to create the polyhedron.
[**polyline3d**(points, diameter, startingStyle = "CAP_CIRCLE", endingStyle = "CAP_CIRCLE")](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyline3d.html) | create a polyline from a list of `[x, y, z]`.
[**rounded_cube**(size, corner_r, center = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-rounded_cube.html) | create a cube in the first octant.
[**rounded_cylinder**(radius, h, round_r, convexity = 2, center = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-rounded_cylinder.html) | create a rounded cylinder.
[**starburst**(r1, r2, n, height)](https://openhome.cc/eGossip/OpenSCAD/lib3x-starburst.html) | a 3D version of [`shape_starburst`](https://openhome.cc/eGossip/OpenSCAD/lib3x-starburst.html).
[**sweep**(sections, triangles = "SOLID")](https://openhome.cc/eGossip/OpenSCAD/lib3x-sweep.html) | develop a smooth skin from crosssections with the same umber of sides.
[**polyline3d**(points, diameter[, startingStyle, endingStyle])](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyline3d.html) | create a polyline from a list of `[x, y, z]`.
[**rounded_cube**(size, corner_r[, center])](https://openhome.cc/eGossip/OpenSCAD/lib3x-rounded_cube.html) | create a cube in the first octant.
[**rounded_cylinder**(radius, h, round_r[, convexity, center])](https://openhome.cc/eGossip/OpenSCAD/lib3x-rounded_cylinder.html) | create a rounded cylinder.
[**sweep**(sections[, triangles])](https://openhome.cc/eGossip/OpenSCAD/lib3x-sweep.html) | develop a smooth skin from crosssections with the same umber of sides.
## Transformation
Signature | Description
--|--
[**along_with**(points, angles, twist = 0, scale = 1.0, method = "AXIS_ANGLE")](https://openhome.cc/eGossip/OpenSCAD/lib3x-along_with.html) | put children along the given path. If there's only one child, put the child for each point.
[**bend**(size, angle, frags = 24)](https://openhome.cc/eGossip/OpenSCAD/lib3x-bend.html) | bend a 3D object.
[**along_with**(points, angles[, twist, scale, method])](https://openhome.cc/eGossip/OpenSCAD/lib3x-along_with.html) | put children along the given path. If there's only one child, put the child for each point.
[**bend**(size, angle[, frags])](https://openhome.cc/eGossip/OpenSCAD/lib3x-bend.html) | bend a 3D object.
[**hollow_out**(shell_thickness) ](https://openhome.cc/eGossip/OpenSCAD/lib3x-hollow_out.html)| hollow out a 2D object.
[**shear**(sx = [0, 0], sy = [0, 0], sz = [0, 0])](https://openhome.cc/eGossip/OpenSCAD/lib3x-shear.html) | shear all child elements along the X-axis, Y-axis, or Z-axis.
[**shear**([sx, sy, sz])](https://openhome.cc/eGossip/OpenSCAD/lib3x-shear.html) | shear all child elements along the X-axis, Y-axis, or Z-axis.
[**select**(i)](https://openhome.cc/eGossip/OpenSCAD/lib3x-select.html) | select module objects.
[**polyline_join**(points)](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyline_join.html) | place a join on each point. Hull each pair of joins and union all convex hulls.
## 2D Function
Signature | Description
--|--
[**bijection_offset**(pts, d, epsilon = 0.0001)](https://openhome.cc/eGossip/OpenSCAD/lib3x-bijection_offset.html) | move 2D outlines outward or inward by a given amount. Each point of the offsetted shape is paired with exactly one point of the original shape.
[**bijection_offset**(pts, d[, epsilon])](https://openhome.cc/eGossip/OpenSCAD/lib3x-bijection_offset.html) | move 2D outlines outward or inward by a given amount. Each point of the offsetted shape is paired with exactly one point of the original shape.
[**contours**(points, threshold)](https://openhome.cc/eGossip/OpenSCAD/lib3x-contours.html) | compute contour polygons by applying [marching squares](https://en.wikipedia.org/wiki/Marching_squares) to a rectangular list of numeric values.
[**in_shape**(shapt_pts, pt, include_edge = false, epsilon = 0.0001)](https://openhome.cc/eGossip/OpenSCAD/lib3x-in_shape.html) | check whether a point is inside a shape.
[**trim_shape**(shape_pts, from, to, epsilon = 0.0001)](https://openhome.cc/eGossip/OpenSCAD/lib3x-trim_shape.html) | trim a tangled-edge shape to a non-tangled shape.
[**in_shape**(shapt_pts, pt[, include_edge, epsilon])](https://openhome.cc/eGossip/OpenSCAD/lib3x-in_shape.html) | check whether a point is inside a shape.
[**trim_shape**(shape_pts, from, to[, epsilon])](https://openhome.cc/eGossip/OpenSCAD/lib3x-trim_shape.html) | trim a tangled-edge shape to a non-tangled shape.
## 2D/3D Function
Signature | Description
--|--
[**angle_between**(vt1, vt2)](https://openhome.cc/eGossip/OpenSCAD/lib3x-angle_between.html) | return the angle between two vectors.
[**bezier_smooth**(path_pts, round_d, t_step = 0.1, closed = false, angle_threshold = 0)](https://openhome.cc/eGossip/OpenSCAD/lib3x-bezier_smooth.html) | use bazier curves to smooth a path.
[**cross_sections**(shape_pts, path_pts, angles, twist = 0, scale = 1.0)](https://openhome.cc/eGossip/OpenSCAD/lib3x-cross_sections.html) | given a 2D shape, points and angles along the path, this function returns all cross-sections.
[**in_polyline**(line_pts, pt, epsilon = 0.0001)](https://openhome.cc/eGossip/OpenSCAD/lib3x-in_polyline.html) | check whether a point is on a line.
[**lines_intersection**(line1, line2, ext = false, epsilon = 0.0001)](https://openhome.cc/eGossip/OpenSCAD/lib3x-lines_intersection.html) | find the intersection of two line segments. Return `[]` if lines don't intersect.
[**paths2sections**(paths)](https://openhome.cc/eGossip/OpenSCAD/lib3x-paths2sections.html) | given a list of paths, this function returns all cross-sections described by those paths.
[**bezier_smooth**(path_pts, round_d[, t_step, closed, angle_threshold])](https://openhome.cc/eGossip/OpenSCAD/lib3x-bezier_smooth.html) | use bazier curves to smooth a path.
[**cross_sections**(shape_pts, path_pts, angles[, twist, scale])](https://openhome.cc/eGossip/OpenSCAD/lib3x-cross_sections.html) | given a 2D shape, points and angles along the path, this function returns all cross-sections.
[**in_polyline**(line_pts, pt[, epsilon])](https://openhome.cc/eGossip/OpenSCAD/lib3x-in_polyline.html) | check whether a point is on a line.
[**lines_intersection**(line1, line2[, ext, epsilon])](https://openhome.cc/eGossip/OpenSCAD/lib3x-lines_intersection.html) | find the intersection of two line segments. Return `[]` if lines don't intersect.
[**rails2sections**(rails)](https://openhome.cc/eGossip/OpenSCAD/lib3x-rails2sections.html) | create sections along rails.
[**path_scaling_sections**(shape_pts, edge_path)](https://openhome.cc/eGossip/OpenSCAD/lib3x-path_scaling_sections.html) | given an edge path with the first point at the outline of a shape, this function uses the path to calculate scaling factors and returns all scaled sections in the reversed order of the edge path.
[**midpt_smooth**(points, n, closed = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-midpt_smooth.html) | given a 2D path, this function constructs a mid-point smoothed version by joining the mid-points of the lines of the path.
[**midpt_smooth**(points, n[, closed])](https://openhome.cc/eGossip/OpenSCAD/lib3x-midpt_smooth.html) | given a 2D path, this function constructs a mid-point smoothed version by joining the mid-points of the lines of the path.
## Path
Signature | Description
--|--
[**arc_path**(radius, angle)](https://openhome.cc/eGossip/OpenSCAD/lib3x-arc_path.html) | create an arc path.
[**archimedean_spiral**(arm_distance, init_angle, point_distance, num_of_points, rt_dir = "CT_CLK")](https://openhome.cc/eGossip/OpenSCAD/lib3x-archimedean_spiral.html) | get all points and angles on the path of an archimedean spiral.
[**bauer_spiral**(n, radius = 1, rt_dir = "CT_CLK")](https://openhome.cc/eGossip/OpenSCAD/lib3x-bauer_spiral.html) | create visually even spacing of n points on the surface of the sphere. Successive points will all be approximately the same distance apart.
[**archimedean_spiral**(arm_distance, init_angle, point_distance, num_of_points[, rt_dir])](https://openhome.cc/eGossip/OpenSCAD/lib3x-archimedean_spiral.html) | get all points and angles on the path of an archimedean spiral.
[**bauer_spiral**(n, radius = 1[, rt_dir])](https://openhome.cc/eGossip/OpenSCAD/lib3x-bauer_spiral.html) | create visually even spacing of n points on the surface of the sphere. Successive points will all be approximately the same distance apart.
[**bezier_curve**(t_step, points)](https://openhome.cc/eGossip/OpenSCAD/lib3x-bezier_curve.html) | given a set of control points, this function returns points of the Bézier path.
[**bspline_curve**(t_step, degree, points, knots, weights)](https://openhome.cc/eGossip/OpenSCAD/lib3x-bspline_curve.html) | B-spline interpolation using [de Boor's algorithm](https://en.wikipedia.org/wiki/De_Boor%27s_algorithm).
[**curve**(t_step, points, tightness = 0)](https://openhome.cc/eGossip/OpenSCAD/lib3x-curve.html) | create a curved path. An implementation of [Centripetal Catmull-Rom spline](https://en.wikipedia.org/wiki/Centripetal_Catmull%E2%80%93Rom_spline).
[**fibonacci_lattice**(n, radius = 1, dir = "CT_CLK")](https://openhome.cc/eGossip/OpenSCAD/lib3x-fibonacci_lattice.html) | create visually even spacing of n points on the surface of the sphere. Nearest-neighbor points will all be approximately the same distance apart.
[**golden_spiral**(from, to, point_distance, rt_dir = "CT_CLK")](https://openhome.cc/eGossip/OpenSCAD/lib3x-golden_spiral.html) | get all points and angles on the path of a golden spiral based on Fibonacci numbers. The distance between two points is almost constant.
[**helix**(radius, levels, level_dist, vt_dir = "SPI_DOWN", rt_dir = "CT_CLK")](https://openhome.cc/eGossip/OpenSCAD/lib3x-helix.html) | get all points on the path of a spiral around a cylinder.
[**sphere_spiral**(radius, za_step, z_circles = 1, begin_angle = 0, end_angle = 0, ...) ](https://openhome.cc/eGossip/OpenSCAD/lib3x-sphere_spiral.html)| create all points and angles on the path of a spiral around a sphere. It returns a vector of `[[x, y, z], [ax, ay, az]]`.
[**curve**(t_step, points[, tightness])](https://openhome.cc/eGossip/OpenSCAD/lib3x-curve.html) | create a curved path. An implementation of [Centripetal Catmull-Rom spline](https://en.wikipedia.org/wiki/Centripetal_Catmull%E2%80%93Rom_spline).
[**fibonacci_lattice**(n, radius = 1[, dir])](https://openhome.cc/eGossip/OpenSCAD/lib3x-fibonacci_lattice.html) | create visually even spacing of n points on the surface of the sphere. Nearest-neighbor points will all be approximately the same distance apart.
[**golden_spiral**(from, to, point_distance[, rt_dir)]](https://openhome.cc/eGossip/OpenSCAD/lib3x-golden_spiral.html) | get all points and angles on the path of a golden spiral based on Fibonacci numbers. The distance between two points is almost constant.
[**helix**(radius, levels, level_dist[, vt_dir, rt_dir])](https://openhome.cc/eGossip/OpenSCAD/lib3x-helix.html) | get all points on the path of a spiral around a cylinder.
[**sphere_spiral**(radius, za_step[, z_circles, begin_angle, end_angle, ...]) ](https://openhome.cc/eGossip/OpenSCAD/lib3x-sphere_spiral.html)| create all points and angles on the path of a spiral around a sphere. It returns a vector of `[[x, y, z], [ax, ay, az]]`.
[**torus_knot**(p, q, phi_step)](https://openhome.cc/eGossip/OpenSCAD/lib3x-torus_knot.html) | generate a path of [The (p,q)-torus knot](https://en.wikipedia.org/wiki/Torus_knot).
## Extrusion
Signature | Description
--|--
[**bend_extrude**(size, thickness, angle, frags = 24)](https://openhome.cc/eGossip/OpenSCAD/lib3x-bend_extrude.html) | extrude and bend a 2D shape.
[**box_extrude**(height, shell_thickness, bottom_thickness, offset_mode = "delta", chamfer = false, ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-box_extrude.html) | create a box (container) from a 2D object.
[**ellipse_extrude**(semi_minor_axis, height, center = false, convexity = 10, twist = 0, slices = 20)](https://openhome.cc/eGossip/OpenSCAD/lib3x-ellipse_extrude.html) | extrude a 2D object along the path of an ellipse from 0 to 180 degrees.
[**rounded_extrude**(size, round_r, angle = 90, twist = 0, convexity = 10)](https://openhome.cc/eGossip/OpenSCAD/lib3x-rounded_extrude.html) | extrude a 2D object roundly from 0 to 180 degrees.
[**bend_extrude**(size, thickness, angle[, frags])](https://openhome.cc/eGossip/OpenSCAD/lib3x-bend_extrude.html) | extrude and bend a 2D shape.
[**box_extrude**(height, shell_thickness, bottom_thickness[, offset_mode, chamfer, ...])](https://openhome.cc/eGossip/OpenSCAD/lib3x-box_extrude.html) | create a box (container) from a 2D object.
[**ellipse_extrude**(semi_minor_axis, height[, center, convexity, twist, slices])](https://openhome.cc/eGossip/OpenSCAD/lib3x-ellipse_extrude.html) | extrude a 2D object along the path of an ellipse from 0 to 180 degrees.
[**rounded_extrude**(size, round_r[, angle, twist, convexity])](https://openhome.cc/eGossip/OpenSCAD/lib3x-rounded_extrude.html) | extrude a 2D object roundly from 0 to 180 degrees.
[**stereographic_extrude**(shadow_side_leng)](https://openhome.cc/eGossip/OpenSCAD/lib3x-stereographic_extrude.html) | take a 2D polygon as input and extend it onto a sphere.
## 2D Shape
Signature | Description
--|--
[**shape_arc**(radius, angle, width, width_mode = "LINE_CROSS")](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_arc.html) | return points on the path of an arc shape.
[**shape_arc**(radius, angle, width[, width_mode])](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_arc.html) | return points on the path of an arc shape.
[**shape_circle**(radius, n)](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_circle.html) | return points on the path of a circle.
[**shape_cyclicpolygon**(sides, circle_r, corner_r)](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_cyclicpolygon.html) | return points on the path of a regular cyclic polygon.
[**shape_ellipse**(axes)](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_ellipse.html) | return points on the path of an ellipse.
[**shape_liquid_splitting**(radius, centre_dist, tangent_angle = 30, t_step = 0.1)](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_liquid_splitting.html) | return shape points of two splitting liquid shapes, kind of how cells divide.
[**shape_path_extend**(stroke_pts, path_pts, scale = 1.0, closed = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_path_extend.html) | extend a 2D stroke along a path to create a 2D shape.
[**shape_liquid_splitting**(radius, centre_dist[, tangent_angle, t_step])](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_liquid_splitting.html) | return shape points of two splitting liquid shapes, kind of how cells divide.
[**shape_path_extend**(stroke_pts, path_pts[, scale, closed])](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_path_extend.html) | extend a 2D stroke along a path to create a 2D shape.
[**shape_pentagram**(r)](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_pentagram.html) | return shape points of a pentagram.
[**shape_pie**(radius, angle)](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_pie.html) | return shape points of a pie (circular sector) shape.
[**shape_square**(size, corner_r = 0)](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_square.html) | return shape points of a rounded square or rectangle.
[**shape_starburst**(r1, r2, n)](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_starburst.html) | returns shape points of a star.
[**shape_superformula**(phi_step, m1, m2, n1, n2 = 1, n3 = 1, a = 1, b = 1)](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_superformula.html) | return shape points of [Superformula](https://en.wikipedia.org/wiki/Superformula).
[**shape_taiwan**(h, distance = 0)](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_taiwan.html) | return shape points of [Taiwan](https://www.google.com.tw/maps?q=taiwan&um=1&ie=UTF-8&sa=X&ved=0ahUKEwjai9XrqurTAhVIopQKHbEHClwQ_AUICygC).
[**shape_trapezium**(length, h, corner_r = 0)](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_trapezium.html) | return shape points of an isosceles trapezoid.
[**shape_square**(size[, corner_r])](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_square.html) | return shape points of a rounded square or rectangle.
[**shape_star**([outer_radius, inner_radius, n])](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_star.html) | create a 2D star.
[**shape_superformula**(phi_step, m1, m2, n1, [n2, n3, a, b])](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_superformula.html) | return shape points of [Superformula](https://en.wikipedia.org/wiki/Superformula).
[**shape_taiwan**(h[, distance])](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_taiwan.html) | return shape points of [Taiwan](https://www.google.com.tw/maps?q=taiwan&um=1&ie=UTF-8&sa=X&ved=0ahUKEwjai9XrqurTAhVIopQKHbEHClwQ_AUICygC).
[**shape_trapezium**(length, h[, corner_r])](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_trapezium.html) | return shape points of an isosceles trapezoid.
## 2D Shape Extrusion
@@ -153,7 +150,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp
[**golden_spiral_extrude**(shape_pts, from, to, point_distance, ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-golden_spiral_extrude.html) | extrude a 2D shape along the path of a golden spiral.
[**helix_extrude**(shape_pts, radius, levels, level_dist, ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-helix_extrude.html) | extrude a 2D shape along a helix path.
[**path_extrude**(shape_pts, path_pts, ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-path_extrude.html) | extrude a 2D shape along a path.
[**ring_extrude**(shape_pts, radius, angle = 360, ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-ring_extrude.html) | rotational extrusion spins a 2D shape around the Z-axis.
[**ring_extrude**(shape_pts, radius[, angle = 360])](https://openhome.cc/eGossip/OpenSCAD/lib3x-ring_extrude.html) | rotational extrusion spins a 2D shape around the Z-axis.
[**sphere_spiral_extrude**(shape_pts, radius, za_step, ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-sphere_spiral_extrude.html) | extrude a 2D shape along the path of a sphere spiral.
## Util
@@ -163,13 +160,13 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp
Signature | Description
--|--
[**util/bsearch**(sorted, target)](https://openhome.cc/eGossip/OpenSCAD/lib3x-bsearch.html) | search a value in a list whose elements must be sorted by zyx.
[**util/has**(lt, elem, sorted = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-has.html) | return `true` if `lt` contains elem.
[**util/has**(lt, elem[, sorted])](https://openhome.cc/eGossip/OpenSCAD/lib3x-has.html) | return `true` if `lt` contains elem.
[**util/find_index**(lt, test)](https://openhome.cc/eGossip/OpenSCAD/lib3x-find_index.html) | return the index of the first element that satisfies the testing function.
[**util/dedup**(lt, ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-dedup.html) | eliminate duplicate vectors.
[**util/flat**(lt, depth = 1)](https://openhome.cc/eGossip/OpenSCAD/lib3x-flat.html) | return a new list with all sub-list elements concatenated into it recursively up to the specified depth.
[**util/flat**(lt[, depth])](https://openhome.cc/eGossip/OpenSCAD/lib3x-flat.html) | return a new list with all sub-list elements concatenated into it recursively up to the specified depth.
[**util/reverse**(lt)](https://openhome.cc/eGossip/OpenSCAD/lib3x-reverse.html) | reverse a list.
[**util/slice**(lt, begin, end)](https://openhome.cc/eGossip/OpenSCAD/lib3x-slice.html) | return a list selected from `begin` to `end`, or to the `end` of the list (`end` not included).
[**util/sort**(lt, by = "idx", idx = 0)](https://openhome.cc/eGossip/OpenSCAD/lib3x-sort.html) | sort a list.
[**util/sort**(lt[, by, idx])](https://openhome.cc/eGossip/OpenSCAD/lib3x-sort.html) | sort a list.
[**util/sum**(lt)](https://openhome.cc/eGossip/OpenSCAD/lib3x-sum.html) | use `+` to sum up all elements in a list.
[**util/swap**(lt, i, j)](https://openhome.cc/eGossip/OpenSCAD/lib3x-swap.html) | swap two elements in a list.
[**util/zip**(lts, combine)](https://openhome.cc/eGossip/OpenSCAD/lib3x-zip.html) | make a list that aggregates elements from each of the lists.
@@ -181,8 +178,8 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp
Signature | Description
--|--
[**util/choose**(choices, seed)](https://openhome.cc/eGossip/OpenSCAD/lib3x-choose.html) | choose an element from the given list.
[**util/rand**(min_value = 0, max_value = 1, seed_value = undef)](https://openhome.cc/eGossip/OpenSCAD/lib3x-rand.html) | generate a pseudo random number.
[**util/shuffle**(lt, seed = undef)](https://openhome.cc/eGossip/OpenSCAD/lib3x-shuffle.html) | randomizes the order of the elements.
[**util/rand**([min_value, max_value, seed_value])](https://openhome.cc/eGossip/OpenSCAD/lib3x-rand.html) | generate a pseudo random number.
[**util/shuffle**(lt[, seed])](https://openhome.cc/eGossip/OpenSCAD/lib3x-shuffle.html) | randomizes the order of the elements.
### util/string
@@ -235,7 +232,7 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp
[**matrix/m_mirror**(v)](https://openhome.cc/eGossip/OpenSCAD/lib3x-m_mirror.html) | generate a transformation matrix which can pass into `multmatrix` to mirror the child element on a plane through the origin.
[**matrix/m_rotation**(a, v)](https://openhome.cc/eGossip/OpenSCAD/lib3x-m_rotation.html) | Generate a transformation matrix which can pass into `multmatrix` to rotate the child element about the axis of the coordinate system or around an arbitrary axis.
[**matrix/m_scaling**(s)](https://openhome.cc/eGossip/OpenSCAD/lib3x-m_scaling.html) | generate a transformation matrix which can pass into `multmatrix` to scale its child elements using the specified vector.
[**matrix/m_shearing**(sx = [0, 0], sy = [0, 0], sz = [0, 0])](https://openhome.cc/eGossip/OpenSCAD/lib3x-m_shearing.html) | generate a transformation matrix which can pass into `multmatrix` to shear all child elements along the X-axis, Y-axis, or Z-axis in 3D.
[**matrix/m_shearing**([sx, sy, sz])](https://openhome.cc/eGossip/OpenSCAD/lib3x-m_shearing.html) | generate a transformation matrix which can pass into `multmatrix` to shear all child elements along the X-axis, Y-axis, or Z-axis in 3D.
[**matrix/m_translation**(v)](https://openhome.cc/eGossip/OpenSCAD/lib3x-m_translation.html) | generate a transformation matrix which can pass into multmatrix to translates (moves) its child elements along the specified vector.
[**maxtrix/m_transpose**(m)](https://openhome.cc/eGossip/OpenSCAD/lib3x-m_transpose.html) | transpose a matrix.
@@ -245,10 +242,10 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp
--|--
[**ptf/ptf_bend**(size, point, radius, angle)](https://openhome.cc/eGossip/OpenSCAD/lib3x-ptf_bend.html) | transform a point inside a rectangle to a point of an arc.
[**ptf/ptf_circle**(size, point)](https://openhome.cc/eGossip/OpenSCAD/lib3x-ptf_circle.html) | transform a point inside a rectangle to a point inside a circle.
[**ptf/ptf_ring**(size, point, radius, angle = 360, twist = 0)](https://openhome.cc/eGossip/OpenSCAD/lib3x-ptf_ring.html) | transform a point inside a rectangle to a point of a ring.
[**ptf/ptf_ring**(size, point, radius[, angle, twist])](https://openhome.cc/eGossip/OpenSCAD/lib3x-ptf_ring.html) | transform a point inside a rectangle to a point of a ring.
[**ptf/ptf_rotate**(point, a, v)](https://openhome.cc/eGossip/OpenSCAD/lib3x-ptf_rotate.html) | rotate a point a degrees around the axis of the coordinate system or an arbitrary axis.
[**ptf/ptf_sphere**(size, point, radius, angle = [180, 360])](https://openhome.cc/eGossip/OpenSCAD/lib3x-ptf_sphere.html) | transform a point inside a rectangle to a point of a sphere.
[**ptf/ptf_torus**(size, point, radius, angle = [360, 360], twist = 0)](https://openhome.cc/eGossip/OpenSCAD/lib3x-ptf_torus.html) | transform a point inside a rectangle to a point of a torus.
[**ptf/ptf_sphere**(size, point, radius[, angle])](https://openhome.cc/eGossip/OpenSCAD/lib3x-ptf_sphere.html) | transform a point inside a rectangle to a point of a sphere.
[**ptf/ptf_torus**(size, point, radius[, angle, twist])](https://openhome.cc/eGossip/OpenSCAD/lib3x-ptf_torus.html) | transform a point inside a rectangle to a point of a torus.
[**ptf/ptf_x_twist**(size, point, angle)](https://openhome.cc/eGossip/OpenSCAD/lib3x-ptf_x_twist.html) | twist a point along the x-axis.
[**ptf/ptf_y_twist**(size, point, angle)](https://openhome.cc/eGossip/OpenSCAD/lib3x-ptf_y_twist.html) | twist a point along the y-axis.
@@ -258,8 +255,8 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp
--|--
[**triangle/tri_circumcenter**(shape_pts)](https://openhome.cc/eGossip/OpenSCAD/lib3x-tri_circumcenter.html) | return the circumcenter of a triangle.
[**triangle/tri_incenter**(shape_pts)](https://openhome.cc/eGossip/OpenSCAD/lib3x-tri_incenter.html) | return the incenter of a triangle.
[**triangle/tri_ear_clipping**(shape_pts, ret = "TRI_INDICES", ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-tri_ear_clipping.html) | triangulation by [ear clipping](https://en.wikipedia.org/wiki/Polygon_triangulation#Ear_clipping_method).
[**triangle/tri_delaunay**(points, ret = "TRI_INDICES")](https://openhome.cc/eGossip/OpenSCAD/lib3x-tri_delaunay.html) | Join a set of points to make a [Delaunay triangulation](https://en.wikipedia.org/wiki/Delaunay_triangulation).
[**triangle/tri_ear_clipping**(shape_pts[, ret, ...])](https://openhome.cc/eGossip/OpenSCAD/lib3x-tri_ear_clipping.html) | triangulation by [ear clipping](https://en.wikipedia.org/wiki/Polygon_triangulation#Ear_clipping_method).
[**triangle/tri_delaunay**(points[, ret])](https://openhome.cc/eGossip/OpenSCAD/lib3x-tri_delaunay.html) | Join a set of points to make a [Delaunay triangulation](https://en.wikipedia.org/wiki/Delaunay_triangulation).
[**triangle/tri_delaunay_indices**(d)](https://openhome.cc/eGossip/OpenSCAD/lib3x-tri_delaunay_indices.html) | return triangle indices from a delaunay object.
[**triangle/tri_delaunay_shapes**(d)](https://openhome.cc/eGossip/OpenSCAD/lib3x-tri_delaunay_shapes.html) | return triangle shapes from a delaunay object.
[**triangle/tri_delaunay_voronoi**(d)](https://openhome.cc/eGossip/OpenSCAD/lib3x-tri_delaunay_voronoi.html) | return [Voronoi](https://en.wikipedia.org/wiki/Voronoi_diagram) cells from a delaunay object.
@@ -270,10 +267,10 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp
Signature | Description
--|--
[**turtle/footprints2**(cmds, start = [0, 0])](https://openhome.cc/eGossip/OpenSCAD/lib3x-footprints2.html) | drive a turtle with `["forward", length]` or `["turn", angle]`. This function is intended to use a turtle to imitate freehand drawing.
[**turtle/footprints3**(cmds, start = [0, 0, 0])](https://openhome.cc/eGossip/OpenSCAD/lib3x-footprints3.html) | a 3D verion of `footprint2`.
[**turtle/lsystem2**(axiom, rules, n, angle, leng = 1, heading = 0, ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-lsystem2.html) | 2D implementation of [L-system](https://en.wikipedia.org/wiki/L-system).
[**turtle/lsystem3**(axiom, rules, n, angle, leng = 1, heading = 0, ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-lsystem3.html) | 3D implementation of [L-system](https://en.wikipedia.org/wiki/L-system).
[**turtle/footprints2**(cmds[, start])](https://openhome.cc/eGossip/OpenSCAD/lib3x-footprints2.html) | drive a turtle with `["forward", length]` or `["turn", angle]`. This function is intended to use a turtle to imitate freehand drawing.
[**turtle/footprints3**(cmds[, start])](https://openhome.cc/eGossip/OpenSCAD/lib3x-footprints3.html) | a 3D verion of `footprint2`.
[**turtle/lsystem2**(axiom, rules, n, angle[, leng, heading, ...])](https://openhome.cc/eGossip/OpenSCAD/lib3x-lsystem2.html) | 2D implementation of [L-system](https://en.wikipedia.org/wiki/L-system).
[**turtle/lsystem3**(axiom, rules, n, angle[, leng, heading, ...])](https://openhome.cc/eGossip/OpenSCAD/lib3x-lsystem3.html) | 3D implementation of [L-system](https://en.wikipedia.org/wiki/L-system).
[**turtle/t2d**(t, cmd, point, angle, leng)](https://openhome.cc/eGossip/OpenSCAD/lib3x-t2d.html) | an implementation of Turtle Graphics.
[**turtle/t3d**(t, cmd, point, unit_vectors, leng, angle)](https://openhome.cc/eGossip/OpenSCAD/lib3x-t3d.html) | a 3D version of `t2d`.
@@ -281,40 +278,40 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp
Signature | Description
--|--
[**voxel/vx_ascii**(char, center = false, invert = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_ascii.html) | generate 8x8 voxel points of printable ASCII characters (codes 32dec to 126dec).
[**voxel/vx_ascii**(char[, center, invert])](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_ascii.html) | generate 8x8 voxel points of printable ASCII characters (codes 32dec to 126dec).
[**voxel/vx_bezier**(p1, p2, p3, p4)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_bezier.html) | return voxel-by-voxel points of Bézier Curve.
[**voxel/vx_circle**(radius, filled = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_circle.html) | return points that can be used to draw a voxel-style circle.
[**voxel/vx_contour**(points, sorted = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_contour.html) | return the contour which encircles the area.
[**voxel/vx_curve**(points, tightness = 0)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_curve.html) | the curve is drawn only from the 2nd control point to the second-last control point.
[**voxel/vx_cylinder**(r, h, filled = false, thickness = 1)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_cylinder.html) | return points that can be used to draw a voxel-style cylinder.
[**voxel/vx_circle**(radius[, filled])](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_circle.html) | return points that can be used to draw a voxel-style circle.
[**voxel/vx_contour**(points[, sorted])](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_contour.html) | return the contour which encircles the area.
[**voxel/vx_curve**(points[, tightness])](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_curve.html) | the curve is drawn only from the 2nd control point to the second-last control point.
[**voxel/vx_cylinder**(r, h[, filled, thickness])](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_cylinder.html) | return points that can be used to draw a voxel-style cylinder.
[**voxel/vx_difference**(points1, points2)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_difference.html) | create a difference of two lists of points.
[**voxel/vx_from**(binaries, center = false, invert = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_from.html) | given a list of 0s and 1s that represent a black-and-white image. This function translates them into voxel points.
[**voxel/vx_gray**(levels, center = false, invert = false, normalize = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_gray.html) | given a list of numbers (0 ~ 255) that represent a gray image. This function translates them into a list of `[x, y, level]`s.
[**voxel/vx_from**(binaries[, center, invert])](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_from.html) | given a list of 0s and 1s that represent a black-and-white image. This function translates them into voxel points.
[**voxel/vx_gray**(levels[, center, invert, normalize])](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_gray.html) | given a list of numbers (0 ~ 255) that represent a gray image. This function translates them into a list of `[x, y, level]`s.
[**voxel/vx_intersection**(points1, points2)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_intersection.html) | create an intersection of two lists of points.
[**voxel/vx_line**(p1, p2)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_line.html) | given two points. it returns points that can be used to draw a voxel-style line.
[**voxel/vx_polygon**(points, filled = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_polygon.html) | return points that can be used to draw a voxel-style polygon.
[**voxel/vx_polygon**(points[, filled])](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_polygon.html) | return points that can be used to draw a voxel-style polygon.
[**voxel/vx_polyline**(points)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_polyline.html) | return points that can be used to draw a voxel-style polyline.
[**voxel/vx_sphere**(radius, filled = false, thickness = 1)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_sphere.html) | return points that can be used to draw a voxel-style sphere.
[**voxel/vx_sphere**(radius[, filled, thickness])](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_sphere.html) | return points that can be used to draw a voxel-style sphere.
[**voxel/vx_union**(points1, points2)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_union.html) | create a union of two lists of points.
## Part
Signature | Description
--|--
[**part/cone**(radius, length = 0, spacing = 0.5, angle = 50, void = false, ends = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-cone.html) | create a cone for rotatable models.
[**part/connector_peg**(radius, height, spacing = 0.5, void = false, ends = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-connector_peg.html) | create a connector peg.
[**part/joint_T**(shaft_r, shaft_h, t_leng, thickness, spacing = 0.5, center = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-joint_T.html) | create a joint_T for rotatable models.
[**part/cone**(radius[, length, spacing, angle, void, ends])](https://openhome.cc/eGossip/OpenSCAD/lib3x-cone.html) | create a cone for rotatable models.
[**part/connector_peg**(radius, height[, spacing, void, ends])](https://openhome.cc/eGossip/OpenSCAD/lib3x-connector_peg.html) | create a connector peg.
[**part/joint_T**(shaft_r, shaft_h, t_leng, thickness,[ spacing, center])](https://openhome.cc/eGossip/OpenSCAD/lib3x-joint_T.html) | create a joint_T for rotatable models.
## Surface
Signature | Description
--|--
[**surface/sf_bend**(levels, radius, thickness, depth, angle = 180, invert = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_bend.html) | bend a photo.
[**surface/sf_ring**(levels, radius, thickness, depth, angle = 360, twist = 0, invert = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_ring.html) | turn a photo into a ring.
[**surface/sf_solidify**(surface1, surface2, slicing = "SLASH")](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_solidify.html) | solidify two square surfaces.
[**surface/sf_sphere**(levels, radius, thickness, depth, angle = [180, 360], invert = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_sphere.html) | map a photo onto a sphere.
[**surface/sf_square**(levels, thickness, depth, x_twist = 0, y_twist = 0, invert = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_square.html) | turn a photo into a twistable square.
[**surface/sf_torus**(levels, radius, thickness, depth, angle = [360, 360], twist = 0, invert = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_torus.html) | turn a photo to a torus.
[**surface/sf_bend**(levels, radius, thickness, depth[, angle, invert])](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_bend.html) | bend a photo.
[**surface/sf_ring**(levels, radius, thickness, depth[, angle, twist, invert])](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_ring.html) | turn a photo into a ring.
[**surface/sf_solidify**(surface1, surface2[, slicing])](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_solidify.html) | solidify two square surfaces.
[**surface/sf_sphere**(levels, radius, thickness, depth[, angle, invert)]](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_sphere.html) | map a photo onto a sphere.
[**surface/sf_square**(levels, thickness, depth[, x_twist, y_twist, invert])](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_square.html) | turn a photo into a twistable square.
[**surface/sf_torus**(levels, radius, thickness, depth[, angle, twist, invert])](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_torus.html) | turn a photo to a torus.
[**surface/sf_curve**(levels, curve_path, ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_curve.html) | curve a photo.
[**surface/sf_splines**(ctrl_pts, row_spline, column_spline)](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_splines.html) | generalized-spline surface.
[**surface/sf_thicken**(points, thickness, ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_thicken.html) | thicken a surface.
@@ -325,38 +322,54 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp
Signature | Description
--|--
[**noise/nz_cell**(points, p, dist = "euclidean")](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_cell.html) | an implementation of [Worley noise](https://en.wikipedia.org/wiki/Worley_noise).
[**noise/nz_perlin1**(x, seed = undef)](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_perlin1.html) | return the 1D [Perlin noise](https://en.wikipedia.org/wiki/Perlin_noise) value at the x coordinate.
[**noise/nz_perlin1s**(xs, seed = undef)](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_perlin1s.html) | return 1D [Perlin noise](https://en.wikipedia.org/wiki/Perlin_noise) values at x coordinates.
[**noise/nz_perlin2**(x, y, seed = undef)](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_perlin2.html) | return the 2D [Perlin noise](https://en.wikipedia.org/wiki/Perlin_noise) value at the (x, y) coordinate.
[**noise/nz_perlin2s**(points, seed = undef)](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_perlin2s.html) | return 2D [Perlin noise](https://en.wikipedia.org/wiki/Perlin_noise) values at (x, y) coordinates.
[**noise/nz_perlin3**(x, y, z, seed = undef)](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_perlin3.html) | return the 3D [Perlin noise](https://en.wikipedia.org/wiki/Perlin_noise) value at the (x, y, z) coordinate.
[**noise/nz_perlin3s**(points, seed = undef)](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_perlin3s.html) | return 3D [Perlin noise](https://en.wikipedia.org/wiki/Perlin_noise) values at (x, y, z) coordinates.
[**noise/nz_worley2**(x, y, seed = undef, grid_w = 10, dist = "euclidean")](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_worley2.html) | return the 2D [Worley noise](https://en.wikipedia.org/wiki/Worley_noise) value at the (x, y) coordinate.
[**noise/nz_worley2s**(points, seed = undef, grid_w = 10, dist = "euclidean")](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_worley2s.html) | return 2D [Worley noise](https://en.wikipedia.org/wiki/Worley_noise) values at (x, y) coordinates.
[**noise/nz_worley3**(x, y, z, seed = undef, tile_w = 10, dist = "euclidean")](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_worley3.html) | return the 3D [Worley noise](https://en.wikipedia.org/wiki/Worley_noise) value at the (x, y, z) coordinate.
[**noise/nz_worley3s**(points, seed = undef, tile_w = 10, dist = "euclidean")](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_worley3s.html) | return 3D [Worley noise](https://en.wikipedia.org/wiki/Worley_noise) values at (x, y, z) coordinates.
[**noise/nz_cell**(points, p[, dist])](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_cell.html) | an implementation of [Worley noise](https://en.wikipedia.org/wiki/Worley_noise).
[**noise/nz_perlin1**(x[, seed])](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_perlin1.html) | return the 1D [Perlin noise](https://en.wikipedia.org/wiki/Perlin_noise) value at the x coordinate.
[**noise/nz_perlin1s**(xs[, seed])](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_perlin1s.html) | return 1D [Perlin noise](https://en.wikipedia.org/wiki/Perlin_noise) values at x coordinates.
[**noise/nz_perlin2**(x, y[, seed])](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_perlin2.html) | return the 2D [Perlin noise](https://en.wikipedia.org/wiki/Perlin_noise) value at the (x, y) coordinate.
[**noise/nz_perlin2s**(points[, seed])](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_perlin2s.html) | return 2D [Perlin noise](https://en.wikipedia.org/wiki/Perlin_noise) values at (x, y) coordinates.
[**noise/nz_perlin3**(x, y, z[, seed])](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_perlin3.html) | return the 3D [Perlin noise](https://en.wikipedia.org/wiki/Perlin_noise) value at the (x, y, z) coordinate.
[**noise/nz_perlin3s**(points[, seed])](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_perlin3s.html) | return 3D [Perlin noise](https://en.wikipedia.org/wiki/Perlin_noise) values at (x, y, z) coordinates.
[**noise/nz_worley2**(x, y[, seed, grid_w, dist])](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_worley2.html) | return the 2D [Worley noise](https://en.wikipedia.org/wiki/Worley_noise) value at the (x, y) coordinate.
[**noise/nz_worley2s**(points[, seed, grid_w, dist])](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_worley2s.html) | return 2D [Worley noise](https://en.wikipedia.org/wiki/Worley_noise) values at (x, y) coordinates.
[**noise/nz_worley3**(x, y, z[, seed, grid_w, dist])](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_worley3.html) | return the 3D [Worley noise](https://en.wikipedia.org/wiki/Worley_noise) value at the (x, y, z) coordinate.
[**noise/nz_worley3s**(points[, seed, grid_w, dist])](https://openhome.cc/eGossip/OpenSCAD/lib3x-nz_worley3s.html) | return 3D [Worley noise](https://en.wikipedia.org/wiki/Worley_noise) values at (x, y, z) coordinates.
## Voronoi
Signature | Description
--|--
[**voronoi/vrn2_cells_from**(points)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vrn2_cells_from.html) | create cell shapes of [Voronoi](https://en.wikipedia.org/wiki/Voronoi_diagram) from a list of points.
[**voronoi/vrn2_cells_space**(size, grid_w, seed = undef)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vrn2_cells_space.html) | create cell shapes of [Voronoi](https://en.wikipedia.org/wiki/Voronoi_diagram) in the first quadrant.
[**voronoi/vrn2_from**(points, spacing = 1, ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vrn2_from.html) | create a [Voronoi](https://en.wikipedia.org/wiki/Voronoi_diagram) from a list of points.
[**voronoi/vrn2_space**(size, grid_w, seed = undef, spacing = 1, ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vrn2_space.html) | create a [Voronoi](https://en.wikipedia.org/wiki/Voronoi_diagram) in the first quadrant.
[**voronoi/vrn3_from**(points, spacing = 1)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vrn3_from.html) | create a 3D version of [Voronoi](https://en.wikipedia.org/wiki/Voronoi_diagram).
[**voronoi/vrn3_space**(size, grid_w, seed = undef, spacing = 1)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vrn3_space.html) | create a [Voronoi](https://en.wikipedia.org/wiki/Voronoi_diagram) in the first octant.
[**voronoi/vrn2_cells_space**(size, grid_w[, seed])](https://openhome.cc/eGossip/OpenSCAD/lib3x-vrn2_cells_space.html) | create cell shapes of [Voronoi](https://en.wikipedia.org/wiki/Voronoi_diagram) in the first quadrant.
[**voronoi/vrn2_from**(points[, spacing, ...])](https://openhome.cc/eGossip/OpenSCAD/lib3x-vrn2_from.html) | create a [Voronoi](https://en.wikipedia.org/wiki/Voronoi_diagram) from a list of points.
[**voronoi/vrn2_space**(size, grid_w[, seed, spacing, ...])](https://openhome.cc/eGossip/OpenSCAD/lib3x-vrn2_space.html) | create a [Voronoi](https://en.wikipedia.org/wiki/Voronoi_diagram) in the first quadrant.
[**voronoi/vrn3_from**(points[, spacing])](https://openhome.cc/eGossip/OpenSCAD/lib3x-vrn3_from.html) | create a 3D version of [Voronoi](https://en.wikipedia.org/wiki/Voronoi_diagram).
[**voronoi/vrn3_space**(size, grid_w[, seed, spacing])](https://openhome.cc/eGossip/OpenSCAD/lib3x-vrn3_space.html) | create a [Voronoi](https://en.wikipedia.org/wiki/Voronoi_diagram) in the first octant.
## Maze
Signature | Description
--|--
[**maze/mz_square_cells**(rows, columns, start = [0, 0], ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-mz_square_cells.html) | return cell data of a square maze.
[**maze/mz_square_cells**(rows, columns[, start, ...])](https://openhome.cc/eGossip/OpenSCAD/lib3x-mz_square_cells.html) | return cell data of a square maze.
[**maze/mz_square_get**(cell, query)](https://openhome.cc/eGossip/OpenSCAD/lib3x-mz_square_get.html) | a helper for getting data from a square-maze cell.
[**maze/mz_square_walls**(cells, rows, columns, cell_width, ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-mz_square_walls.html) | a helper for creating square wall data from maze cells.
[**maze/mz_hex_walls**(cells, rows, columns, cell_radius, ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-mz_hex_walls.html) | a helper for creating hex wall data from maze cells.
[**maze/mz_square_initialize**(rows, columns, mask)](https://openhome.cc/eGossip/OpenSCAD/lib3x-mz_square_initialize.html) | a helper for initializing cell data of a maze.
[**maze/mz_hamiltonian**(rows, columns, start = [0, 0], seed = undef)](https://openhome.cc/eGossip/OpenSCAD/lib3x-mz_hamiltonian.html) | create a hamiltonian path from a maze.
[**maze/mz_theta_cells**(rows, beginning_number, start = [0, 0], seed = undef)](https://openhome.cc/eGossip/OpenSCAD/lib3x-mz_theta_cells.html) | return cell data of a theta maze.
[**maze/mz_hamiltonian**(rows, columns[, start, seed])](https://openhome.cc/eGossip/OpenSCAD/lib3x-mz_hamiltonian.html) | create a hamiltonian path from a maze.
[**maze/mz_theta_cells**(rows, beginning_number[, start, seed])](https://openhome.cc/eGossip/OpenSCAD/lib3x-mz_theta_cells.html) | return cell data of a theta maze.
[**maze/mz_theta_get**(cell, query)](https://openhome.cc/eGossip/OpenSCAD/lib3x-mz_theta_get.html) | a helper for getting data from a theta-maze cell.
## Polyhedra
Signature | Description
--|--
[**polyhedra/star**([outerRadius, innerRadius, height, n])](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyhedra_star.html) | create a 3D star.
[**polyhedra/polar_zonohedra**(n[, theta])](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyhedra_polar_zonohedra.html) | create a [polar zonohedra](https://mathworld.wolfram.com/PolarZonohedron.html).
[**polyhedra/tetrahedron**(radius[, detail])](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyhedra_tetrahedron.html) | create a tetrahedron.
[**polyhedra/hexahedron**(radius[, detail])](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyhedra_hexahedron.html) | create a hexahedron.
[**polyhedra/octahedron**(radius[, detail])](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyhedra_octahedron.html) | create a octahedron.
[**polyhedra/dodecahedron**(radius[, detail])](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyhedra_dodecahedron.html) | create a dodecahedron.
[**polyhedra/icosahedron**(radius[, detail])](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyhedra_icosahedron.html) | create a icosahedron.
[**polyhedra/superellipsoid**(radius[, detail])](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyhedra_superellipsoid.html) | create a superellipsoid.
----

View File

@@ -1,5 +1,56 @@
> Version numbers are based on [Semantic Versioning](https://semver.org/).
# v3.2
## Deprecated:
Name | Description
--|--
**paths2sections** | use **rails2sections** instead.
**hull_polyline2d**, **hull_polyline3d** | use **polyline_join** instead.
**shape_starburst**, **shape_pentagram** | use **shape_star** instead.
**starburst** | use **polyhedra/star** instead.
## New parameters:
- `angle_between` adds `ccw`.
## New modules/functions:
### Matrix
## 2D/3D Function
Signature | Description
--|--
[**rails2sections**(rails)](https://openhome.cc/eGossip/OpenSCAD/lib3x-rails2sections.html) | create sections along rails.
## Transformation
Signature | Description
--|--
[**select**(i)](https://openhome.cc/eGossip/OpenSCAD/lib3x-select.html) | select module objects.
[**polyline_join**(points)](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyline_join.html) | place a join on each point. Hull each pair of joins and union all convex hulls.
## 2D Shape
Signature | Description
--|--
[**shape_star**([outer_radius, inner_radius, n])](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_star.html) | create a 2D star.
## Polyhedra
Signature | Description
--|--
[**polyhedra/star**([outerRadius, innerRadius, height, n])](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyhedra_star.html) | create a 3D star.
[**polyhedra/polar_zonohedra**(n[, theta])](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyhedra_polar_zonohedra.html) | create a [polar zonohedra](https://mathworld.wolfram.com/PolarZonohedron.html).
[**polyhedra/tetrahedron**(radius[, detail])](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyhedra_tetrahedron.html) | create a tetrahedron.
[**polyhedra/hexahedron**(radius[, detail])](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyhedra_hexahedron.html) | create a hexahedron.
[**polyhedra/octahedron**(radius[, detail])](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyhedra_octahedron.html) | create a octahedron.
[**polyhedra/dodecahedron**(radius[, detail])](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyhedra_dodecahedron.html) | create a dodecahedron.
[**polyhedra/icosahedron**(radius[, detail])](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyhedra_icosahedron.html) | create a icosahedron.
[**polyhedra/superellipsoid**(radius[, detail])](https://openhome.cc/eGossip/OpenSCAD/lib3x-polyhedra_superellipsoid.html) | create a superellipsoid.
# v3.1
## Deprecated:

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -73,7 +73,8 @@ Puts children along the given path. If there's only one child, it will put the c
scale([2, 1])
circle(1.25, $fn = 24);
}
rotate([90, 0, 0])
for(a = [0:30:330]) {
rotate(a)
translate([5, 0, 0])

View File

@@ -11,21 +11,21 @@ Creates an arc path. You can pass a 2 element vector to define the central angle
## Examples
use <arc_path.scad>;
use <hull_polyline2d.scad>;
$fn = 24;
points = arc_path(radius = 20, angle = [45, 290]);
hull_polyline2d(points, width = 2);
use <arc_path.scad>;
use <polyline_join.scad>;
$fn = 24;
points = arc_path(radius = 20, angle = [45, 290]);
polyline_join(points) circle(1);
![arc_path](images/lib3x-arc_path-1.JPG)
use <arc_path.scad>;
use <hull_polyline2d.scad>;
use <polyline_join.scad>;
$fn = 24;
points = arc_path(radius = 20, angle = 135);
hull_polyline2d(points, width = 2);
polyline_join(points) circle(1);
![arc_path](images/lib3x-arc_path-2.JPG)

View File

@@ -48,7 +48,7 @@ An `init_angle` less than 180 degrees is not recommended because the function us
![archimedean_spiral](images/lib3x-archimedean_spiral-2.JPG)
include <archimedean_spiral.scad>;
use <archimedean_spiral.scad>;
t = "3.141592653589793238462643383279502884197169399375105820974944592307816406286";
@@ -60,8 +60,8 @@ An `init_angle` less than 180 degrees is not recommended because the function us
);
for(i = [0: len(points) - 1]) {
translate(points[i][0])
rotate(points[i][1] + 90)
translate(points[i].x)
rotate(points[i].y + 90)
text(t[i], valign = "center", halign = "center");
}

View File

@@ -15,7 +15,7 @@ Creates visually even spacing of n points on the surface of the sphere. Successi
## Examples
use <bauer_spiral.scad>;
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
n = 200;
radius = 20;
@@ -26,7 +26,7 @@ Creates visually even spacing of n points on the surface of the sphere. Successi
sphere(1, $fn = 24);
}
hull_polyline3d(pts, 1);
polyline_join(pts) sphere(.5);
![bauer_spiral](images/lib3x-bauer_spiral-1.JPG)

View File

@@ -1,6 +1,6 @@
# bezier_curve
Given a set of control points, the `bezier_curve` function returns points of the Bézier path. Combined with the `polyline`, `polyline3d` or `hull_polyline3d` module defined in my library, you can create a Bézier curve.
Given a set of control points, the `bezier_curve` function returns points of the Bézier path.
## Parameters
@@ -9,13 +9,13 @@ Given a set of control points, the `bezier_curve` function returns points of the
## Examples
If you have four control points and combine with the `hull_polyline3d` module:
If you have four control points:
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
use <bezier_curve.scad>;
t_step = 0.05;
width = 2;
radius = 2;
p0 = [0, 0, 0];
p1 = [40, 60, 35];
@@ -26,6 +26,7 @@ If you have four control points and combine with the `hull_polyline3d` module:
[p0, p1, p2, p3]
);
hull_polyline3d(points, width);
polyline_join(points)
sphere(radius);
![bezier_curve](images/lib3x-bezier_curve-1.JPG)

View File

@@ -12,7 +12,7 @@ Given a path, the `bezier_smooth` function uses bazier curves to smooth all corn
## Examples
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
use <bezier_smooth.scad>;
width = 2;
@@ -25,15 +25,15 @@ Given a path, the `bezier_smooth` function uses bazier curves to smooth all corn
[-10, -10, 50]
];
hull_polyline3d(
path_pts, width
);
polyline_join(path_pts)
sphere(width / 2);
smoothed_path_pts = bezier_smooth(path_pts, round_d);
color("red") translate([30, 0, 0]) hull_polyline3d(
smoothed_path_pts, width
);
color("red")
translate([30, 0, 0])
polyline_join(smoothed_path_pts)
sphere(width / 2);
![bezier_smooth](images/lib3x-bezier_smooth-1.JPG)

View File

@@ -1,6 +1,6 @@
# bspline_curve
[B-spline](https://en.wikipedia.org/wiki/B-spline) interpolation using [de Boor's algorithm](https://en.wikipedia.org/wiki/De_Boor%27s_algorithm). This function returns points of the B-spline path. Combined with the `polyline`, `polyline3d` or `hull_polyline3d` module, you can create a B-spline curve.
[B-spline](https://en.wikipedia.org/wiki/B-spline) interpolation using [de Boor's algorithm](https://en.wikipedia.org/wiki/De_Boor%27s_algorithm). This function returns points of the B-spline path.
**Since:** 2.1

View File

@@ -11,7 +11,7 @@ Computes contour polygons by applying [marching squares](https://en.wikipedia.or
## Examples
use <hull_polyline2d.scad>;
use <polyline_join.scad>;
use <surface/sf_thicken.scad>;
use <contours.scad>;
@@ -36,7 +36,8 @@ Computes contour polygons by applying [marching squares](https://en.wikipedia.or
translate([0, 0, z])
linear_extrude(1)
for(isoline = contours(points, z)) {
hull_polyline2d(isoline, width = 1);
polyline_join(isoline)
circle(.5);
}
}

View File

@@ -17,7 +17,7 @@ Draws a curved line from control points. The curve is drawn only from the 2nd co
## Examples
use <curve.scad>;
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
pts = [
[28, 2, 1],
@@ -32,12 +32,14 @@ Draws a curved line from control points. The curve is drawn only from the 2nd co
tightness = 0;
points = curve(t_step, pts, tightness);
hull_polyline3d(points, 1);
polyline_join(points)
sphere(.5);
#for(pt = pts) {
translate(pt)
sphere(1);
}
#hull_polyline3d(pts, .1);
#polyline_join(pts)
sphere(.05);
![curve](images/lib3x-curve-3.JPG)

View File

@@ -31,7 +31,7 @@ Creates visually even spacing of n points on the surface of the sphere. Nearest-
![fibonacci_lattice](images/lib3x-fibonacci_lattice-1.JPG)
use <fibonacci_lattice.scad>;
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
n = 200;
radius = 20;
@@ -49,7 +49,8 @@ Creates visually even spacing of n points on the surface of the sphere. Nearest-
];
for(spiral = spirals) {
hull_polyline3d(spiral, 1);
polyline_join(spiral)
sphere(.5);
}
![fibonacci_lattice](images/lib3x-fibonacci_lattice-2.JPG)

View File

@@ -11,7 +11,7 @@ Drive a turtle with `["forward", length]` or `["turn", angle]`. This function is
## Examples
use <polyline2d.scad>;
use <polyline_join.scad>;
use <turtle/footprints2.scad>;
function arc_cmds(radius, angle, steps) =
@@ -48,7 +48,8 @@ Drive a turtle with `["forward", length]` or `["turn", angle]`. This function is
)
);
polyline2d(poly, width = 1);
polyline_join(poly)
circle(.5);
![footprints2](images/lib3x-footprints2-1.JPG)

View File

@@ -11,7 +11,7 @@ A 3D verion of [footprint2](https://openhome.cc/eGossip/OpenSCAD/lib3x-footprint
## Examples
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
use <turtle/footprints3.scad>;
function xy_arc_cmds(radius, angle, steps) =
@@ -49,7 +49,8 @@ A 3D verion of [footprint2](https://openhome.cc/eGossip/OpenSCAD/lib3x-footprint
)
);
hull_polyline3d(poly, thickness = 1);
polyline_join(poly)
sphere(.5);
![footprints3](images/lib3x-footprints3-1.JPG)

View File

@@ -7,7 +7,7 @@ This function deletes the mapping for the specified key from a [util/map/hashmap
## Parameters
- `map` : The original map.
- `key` : Adds the specified element to the specified set
- `key` : The specified key.
- `eq` : A equality function. If it's ignored, use `==` to compare elements.
- `hash` : A hash function. If it's ignored, convert each element to a string and hash it.

View File

@@ -7,7 +7,7 @@ This function gets the value of the specified key from a [util/map/hashmap](http
## Parameters
- `map` : The original map.
- `key` : Adds the specified element to the specified set
- `key` : The specified key.
- `eq` : A equality function. If it's ignored, use `==` to compare elements.
- `hash` : A hash function. If it's ignored, convert each element to a string and hash it.

View File

@@ -7,6 +7,10 @@ Puts a key/value pair to a [util/map/hashmap](https://openhome.cc/eGossip/OpenSC
## Parameters
- `map` : The original map.
- `key` : The specified key.
- `value` : The specified value.
- `eq` : A equality function. If it's ignored, use `==` to compare elements.
- `hash` : A hash function. If it's ignored, convert each element to a string and hash it.
## Examples

View File

@@ -14,7 +14,7 @@ Gets all points on the path of a spiral around a cylinder. Its `$fa`, `$fs` and
## Examples
use <helix.scad>;
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
$fn = 12;
@@ -30,12 +30,13 @@ Gets all points on the path of a spiral around a cylinder. Its `$fa`, `$fs` and
translate(p) sphere(5);
}
hull_polyline3d(points, 2);
polyline_join(points)
sphere(1);
![helix](images/lib3x-helix-1.JPG)
use <helix.scad>;
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
$fn = 12;
@@ -47,7 +48,8 @@ Gets all points on the path of a spiral around a cylinder. Its `$fa`, `$fs` and
rt_dir = "CLK"
);
hull_polyline3d(points, 2);
polyline_join(points)
sphere(1);
%cylinder(h = 100, r1 = 40, r2 = 20);

View File

@@ -1,22 +0,0 @@
# hull_polyline2d
Creates a 2D polyline from a list of `[x, y]` coordinates. As the name says, it uses the built-in hull operation for each pair of points (created by the `circle` module). It's slow. However, it can be used to create metallic effects for a small `$fn`, large `$fa` or `$fs`.
## Parameters
- `points` : The list of `[x, y]` points of the polyline. The points are indexed from 0 to n-1.
- `width` : The line width. Default to 1.
- `$fa`, `$fs`, `$fn` : Check [the circle module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_the_2D_Subsystem#circle) for more details.
## Examples
use <hull_polyline2d.scad>;
$fn = 4;
hull_polyline2d(
points = [[1, 2], [-5, -4], [-5, 3], [5, 5]],
width = 1
);
![hull_polyline3d](images/lib3x-hull_polyline2d-1.JPG)

View File

@@ -1,45 +0,0 @@
# hull_polyline3d
Creates a 3D polyline from a list of `[x, y, z]` coordinates. As the name says, it uses the built-in hull operation for each pair of points (created by the `sphere` module). It's slow. However, it can be used to create metallic effects for a small `$fn`, large `$fa` or `$fs`.
## Parameters
- `points` : The list of `[x, y, z]` points of the polyline. The points are indexed from 0 to n-1.
- `diameter` : The line diameter. Default to 1.
- `$fa`, `$fs`, `$fn` : Check [the sphere module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Primitive_Solids#sphere) for more details.
## Examples
use <hull_polyline3d.scad>;
hull_polyline3d(
points = [
[1, 2, 3],
[4, -5, -6],
[-1, -3, -5],
[0, 0, 0]
],
diameter = 1,
$fn = 3
);
![polyline3d](images/lib3x-hull_polyline3d-1.JPG)
use <hull_polyline3d.scad>;
r = 50;
points = [
for(a = [0:180])
[
r * cos(-90 + a) * cos(a),
r * cos(-90 + a) * sin(a),
r * sin(-90 + a)
]
];
for(i = [0:7]) {
rotate(45 * i)
hull_polyline3d(points, 2, $fn = 3);
}
![polyline3d](images/lib3x-hull_polyline3d-2.JPG)

View File

@@ -11,7 +11,7 @@ When having uniform cross sections, you can use [sweep](https://openhome.cc/eGos
## Examples
use <shape_starburst.scad>;
use <shape_star.scad>;
use <shape_circle.scad>;
use <ptf/ptf_rotate.scad>;
use <loft.scad>;
@@ -19,7 +19,7 @@ When having uniform cross sections, you can use [sweep](https://openhome.cc/eGos
sects = [
for(i = 10; i >= 4; i = i - 1)
[
for(p = shape_starburst(15, 12, i % 2 == 1 ? i : i - 1)) ptf_rotate([p[0], p[1], 5 * (i - 4)], i * 10)
for(p = shape_star(15, 12, i % 2 == 1 ? i : i - 1)) ptf_rotate([p.x, p.y, 5 * (i - 4)], i * 10)
]
];
loft(sects, slices = 3);
@@ -28,16 +28,16 @@ When having uniform cross sections, you can use [sweep](https://openhome.cc/eGos
difference() {
loft(
[
[for(p = shape_circle(10, $fn = 3)) [p[0], p[1], 15]],
[for(p = shape_circle(15, $fn = 24)) [p[0], p[1], 0]]
[for(p = shape_circle(10, $fn = 3)) [p.x, p.y, 15]],
[for(p = shape_circle(15, $fn = 24)) [p.x, p.y, 0]]
],
slices = 4
);
loft(
[
[for(p = shape_circle(8, $fn = 3)) [p[0], p[1], 15.1]],
[for(p = shape_circle(13, $fn = 24)) [p[0], p[1], -0.1]]
[for(p = shape_circle(8, $fn = 3)) [p.x, p.y, 15.1]],
[for(p = shape_circle(13, $fn = 24)) [p.x, p.y, -0.1]]
],
slices = 4
);

View File

@@ -33,14 +33,11 @@
[lsystem3-collections.scad](https://github.com/JustinSDK/dotSCAD/blob/master/examples/turtle/lsystem3_collection.scad) collects several L-system grammars. Here's one of them.
use <turtle/lsystem3.scad>;
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
for(line = hilbert_curve()) {
hull_polyline3d(
[line[0], line[1]],
thickness = 0.5,
$fn = 4
);
polyline_join([line[0], line[1]])
sphere(.25, $fn = 4);
}
function hilbert_curve(n = 3, angle = 90, leng = 1, heading = 0, start = [0, 0, 0]) =
@@ -60,14 +57,11 @@
// a stochastic L-system
use <turtle/lsystem3.scad>;
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
for(line = vine()) {
hull_polyline3d(
[line[0], line[1]],
thickness = 0.5,
$fn = 4
);
polyline_join([line[0], line[1]])
sphere(.25, $fn = 4);
}
function vine(n = 3, angle = 18, leng = 1, heading = 0, start = [0, 0, 0]) =

View File

@@ -12,14 +12,14 @@ Given a 2D path, this function constructs a mid-point smoothed version by joinin
## Examples
use <hull_polyline2d.scad>;
use <polyline_join.scad>;
use <shape_taiwan.scad>;
use <midpt_smooth.scad>;
taiwan = shape_taiwan(50);
smoothed = midpt_smooth(taiwan, 20, true);
translate([0, 0, 0]) hull_polyline2d(taiwan, .25);
#translate([10, 0, 0]) hull_polyline2d(smoothed, .25);
translate([0, 0, 0]) polyline_join(taiwan) circle(.125);
#translate([10, 0, 0]) polyline_join(smoothed) circle(.125);
![midpt_smooth](images/lib3x-midpt_smooth-1.JPG)

View File

@@ -14,13 +14,14 @@ Creates a hamiltonian path from a maze. The path is the result of maze traversal
## Examples
use <maze/mz_hamiltonian.scad>;
use <hull_polyline2d.scad>;
use <polyline_join.scad>;
rows = 5;
columns = 10;
path = mz_hamiltonian(rows, columns, [0, 0]);
hull_polyline2d(path, .5);
polyline_join(path)
circle(.25);
![mz_hamiltonian](images/lib3x-mz_hamiltonian-1.JPG)

View File

@@ -17,7 +17,7 @@ It's a helper for creating wall data from maze cells. You can transform wall poi
use <maze/mz_square_cells.scad>;
use <maze/mz_hex_walls.scad>;
use <hull_polyline2d.scad>;
use <polyline_join.scad>;
rows = 10;
columns = 12;
@@ -28,7 +28,8 @@ It's a helper for creating wall data from maze cells. You can transform wall poi
walls = mz_hex_walls(cells, rows, columns, cell_width);
for(wall = walls) {
hull_polyline2d(wall, wall_thickness, $fn = 24);
polyline_join(wall)
circle(wall_thickness, $fn = 24);
}
![mz_hex_walls](images/lib3x-mz_hex_walls-1.JPG)

View File

@@ -25,7 +25,7 @@ The value of `type` is the wall type of the cell. It can be `0`, `1`, `2` or `3`
## Examples
use <maze/mz_theta_cells.scad>;
use <hull_polyline2d.scad>;
use <polyline_join.scad>;
rows = 8;
beginning_number = 8;
@@ -58,11 +58,13 @@ The value of `type` is the wall type of the cell. It can be `0`, `1`, `2` or `3`
outerVt2 = vt_from_angle(theta2, outerR);
if(type == INWARD_WALL || type == INWARD_CCW_WALL) {
hull_polyline2d([innerVt1, innerVt2], width = wall_thickness);
polyline_join([innerVt1, innerVt2])
circle(wall_thickness / 2);
}
if(type == CCW_WALL || type == INWARD_CCW_WALL) {
hull_polyline2d([innerVt2, outerVt2], width = wall_thickness);
polyline_join([innerVt1, innerVt2])
circle(wall_thickness / 2);
}
}
}
@@ -73,7 +75,8 @@ The value of `type` is the wall type of the cell. It can be `0`, `1`, `2` or `3`
for(theta = [0:thetaStep:360 - thetaStep]) {
vt1 = vt_from_angle(theta, r);
vt2 = vt_from_angle(theta + thetaStep, r);
hull_polyline2d([vt1, vt2], width = wall_thickness);
polyline_join([vt1, vt2])
circle(wall_thickness / 2);
}
![mz_theta_cells](images/lib3x-mz_theta_cells-3.JPG)

View File

@@ -13,7 +13,7 @@ It's a helper for getting data from a theta-maze cell.
use <maze/mz_theta_cells.scad>;
use <maze/mz_theta_get.scad>;
use <hull_polyline2d.scad>;
use <polyline_join.scad>;
rows = 8;
beginning_number = 8;
@@ -39,11 +39,13 @@ It's a helper for getting data from a theta-maze cell.
outerVt2 = vt_from_angle(theta2, outerR);
if(type == "INWARD_WALL" || type == "INWARD_CCW_WALL") {
hull_polyline2d([innerVt1, innerVt2], width = wall_thickness);
polyline_join([innerVt1, innerVt2])
circle(wall_thickness / 2);
}
if(type == "CCW_WALL" || type == "INWARD_CCW_WALL") {
hull_polyline2d([innerVt2, outerVt2], width = wall_thickness);
polyline_join([innerVt1, innerVt2])
circle(wall_thickness / 2);
}
}
}
@@ -53,7 +55,8 @@ It's a helper for getting data from a theta-maze cell.
for(theta = [0:thetaStep:360 - thetaStep]) {
vt1 = vt_from_angle(theta, r);
vt2 = vt_from_angle(theta + thetaStep, r);
hull_polyline2d([vt1, vt2], width = wall_thickness);
polyline_join([vt1, vt2])
circle(wall_thickness / 2);
}
![mz_theta_get](images/lib3x-mz_theta_get-1.JPG)

View File

@@ -26,8 +26,8 @@ It's an implementation of [Worley noise](https://en.wikipedia.org/wiki/Worley_no
feature_points = [for(pt_angle = pts_angles) pt_angle[0] + half_size];
noised = [
for(y = [0:size[1] - 1])
for(x = [0:size[0] - 1])
for(y = [0:size.y - 1])
for(x = [0:size.x - 1])
[x, y, nz_cell(feature_points, [x, y])]
];

View File

@@ -11,13 +11,12 @@ Returns the 1D [Perlin noise](https://en.wikipedia.org/wiki/Perlin_noise) value
## Examples
use <hull_polyline2d.scad>;
use <polyline_join.scad>;
use <util/rand.scad>;
use <noise/nz_perlin1.scad>;
seed = rand();
hull_polyline2d(
[for(x = [0:.1:10]) [x, nz_perlin1(x, seed)]], width = .1
);
polyline_join([for(x = [0:.1:10]) [x, nz_perlin1(x, seed)]])
circle(.05);
![nz_perlin1](images/lib3x-nz_perlin1-1.JPG)

View File

@@ -11,13 +11,14 @@ Returns 1D [Perlin noise](https://en.wikipedia.org/wiki/Perlin_noise) values at
## Examples
use <hull_polyline2d.scad>;
use <polyline_join.scad>;
use <noise/nz_perlin1s.scad>;
xs = [for(x = [0:.1:10]) x];
ys = nz_perlin1s(xs);
points = [for(i = [0:len(xs) - 1]) [xs[i], ys[i]]];
hull_polyline2d(points, width = .1);
polyline_join(points)
circle(.05);
![nz_perlin1s](images/lib3x-nz_perlin1s-1.JPG)

View File

@@ -13,7 +13,7 @@ Returns the 2D [Perlin noise](https://en.wikipedia.org/wiki/Perlin_noise) value
## Examples
use <util/rand.scad>;
use <hull_polyline2d.scad>;
use <polyline_join.scad>;
use <surface/sf_thicken.scad>;
use <noise/nz_perlin2.scad>;
use <contours.scad>;
@@ -31,7 +31,8 @@ Returns the 2D [Perlin noise](https://en.wikipedia.org/wiki/Perlin_noise) value
translate([11, 0])
for(isoline = contours(points, 0)) {
hull_polyline2d(isoline, width = .1);
polyline_join(isoline)
circle(.05);
}
![nz_perlin2](images/lib3x-nz_perlin2-1.JPG)

View File

@@ -27,12 +27,12 @@ It divides the space into grids. The nucleus of each cell is randomly placed in
seed = 51;
points = [
for(y = [0:size[1] - 1])
for(x = [0:size[0] - 1])
for(y = [0:size.y - 1])
for(x = [0:size.x - 1])
[x, y]
];
cells = [for(p = points) nz_worley2(p[0], p[1], seed, grid_w, dist)];
cells = [for(p = points) nz_worley2(p.x, p.y, seed, grid_w, dist)];
max_dist = max([for(c = cells) c[2]]);
for(i = [0:len(cells) - 1]) {

View File

@@ -25,8 +25,8 @@ It divides the space into grids. The nucleus of each cell is randomly placed in
seed = 51;
points = [
for(y = [0:size[1] - 1])
for(x = [0:size[0] - 1])
for(y = [0:size.y - 1])
for(x = [0:size.x - 1])
[x, y]
];

View File

@@ -26,7 +26,7 @@ It divides the space into grids. The nucleus of each cell is randomly placed in
points = vx_sphere(20);
cells = [for(p = points) nz_worley3(p[0], p[1], p[2], seed, grid_w, dist)];
cells = [for(p = points) nz_worley3(p.x, p.y, p.z, seed, grid_w, dist)];
max_dist = max([for(c = cells) c[3]]);
for(i = [0:len(cells) - 1]) {

View File

@@ -18,12 +18,12 @@ It divides the space into grids. The nucleus of each cell is randomly placed in
use <voxel/vx_sphere.scad>;
use <noise/nz_worley3s.scad>;
tile_w = 10;
grid_w = 10;
dist = "euclidean"; // [euclidean, manhattan, chebyshev, border]
seed = 51;
points = vx_sphere(20);
cells = nz_worley3s(points, seed, tile_w, dist);
cells = nz_worley3s(points, seed, grid_w, dist);
for(i = [0:len(cells) - 1]) {
c = (norm([cells[i][0], cells[i][1], cells[i][2]]) % 20) / 20;

View File

@@ -15,7 +15,7 @@ You can use any point as the first point of the edge path. Just remember that yo
## Examples
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
use <shape_taiwan.scad>;
use <path_scaling_sections.scad>;
use <sweep.scad>;
@@ -33,12 +33,13 @@ You can use any point as the first point of the edge path. Just remember that yo
fst_pt + [0, 0, 60]
];
#hull_polyline3d(edge_path);
#polyline_join(edge_path)
sphere(.5);
sweep(path_scaling_sections(taiwan, edge_path));
![path_scaling_sections](images/lib3x-path_scaling_sections-1.JPG)
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
use <shape_taiwan.scad>;
use <path_scaling_sections.scad>;
use <sweep.scad>;
@@ -58,7 +59,8 @@ You can use any point as the first point of the edge path. Just remember that yo
fst_pt + [0, 0, 60]
]);
#hull_polyline3d(edge_path);
#polyline_join(edge_path)
sphere(.5);
sweep(path_scaling_sections(taiwan, edge_path));
![path_scaling_sections](images/lib3x-path_scaling_sections-2.JPG)
@@ -67,7 +69,7 @@ You can use any point as the first point of the edge path. Just remember that yo
use <path_scaling_sections.scad>;
use <sweep.scad>;
use <bezier_curve.scad>;
use <rotate_p.scad>;
use <ptf/ptf_rotate.scad>;
taiwan = shape_taiwan(100);
fst_pt = [13, 0, 0];
@@ -91,7 +93,7 @@ You can use any point as the first point of the edge path. Just remember that yo
for(i = [0:leng - 1])
[
for(p = sections[i])
rotate_p(p, twist_step * i)
ptf_rotate(p, twist_step * i)
]
];
@@ -99,11 +101,11 @@ You can use any point as the first point of the edge path. Just remember that yo
![path_scaling_sections](images/lib3x-path_scaling_sections-3.JPG)
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
use <shape_taiwan.scad>;
use <path_scaling_sections.scad>;
use <sweep.scad>;
use <rotate_p.scad>;
use <ptf/ptf_rotate.scad>;
taiwan = shape_taiwan(100);
@@ -115,15 +117,16 @@ You can use any point as the first point of the edge path. Just remember that yo
a = atan2(fst_pt[1], fst_pt[0]);
edge_path = [
fst_pt,
fst_pt + rotate_p([0, 0, 10], a),
fst_pt + rotate_p([10, 0, 20], a),
fst_pt + rotate_p([8, 0, 30], a),
fst_pt + rotate_p([10, 0, 40], a),
fst_pt + rotate_p([0, 0, 50], a),
fst_pt + rotate_p([0, 0, 60], a)
fst_pt + ptf_rotate([0, 0, 10], a),
fst_pt + ptf_rotate([10, 0, 20], a),
fst_pt + ptf_rotate([8, 0, 30], a),
fst_pt + ptf_rotate([10, 0, 40], a),
fst_pt + ptf_rotate([0, 0, 50], a),
fst_pt + ptf_rotate([0, 0, 60], a)
];
#hull_polyline3d(edge_path);
#polyline_join(edge_path)
sphere(.5);
sweep(path_scaling_sections(taiwan, edge_path));
![path_scaling_sections](images/lib3x-path_scaling_sections-4.JPG)

View File

@@ -11,7 +11,7 @@ You paths should be indexed count-clockwisely.
## Examples
use <paths2sections.scad>;
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
use <sweep.scad>;
paths = [
@@ -26,14 +26,15 @@ You paths should be indexed count-clockwisely.
sweep(sections);
#for(path = paths) {
hull_polyline3d(path, 0.5);
polyline_join(path)
sphere(.25);
}
![paths2sections](images/lib3x-paths2sections-1.JPG)
use <bezier_curve.scad>;
use <paths2sections.scad>;
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
use <sweep.scad>;
t_step = 0.05;
@@ -59,7 +60,8 @@ You paths should be indexed count-clockwisely.
sweep(sections);
#for(path = paths) {
hull_polyline3d(path, 0.5);
polyline_join(path)
sphere(.25);
}
![paths2sections](images/lib3x-paths2sections-2.JPG)

View File

@@ -0,0 +1,22 @@
# dodecahedron
Creates a dodecahedron.
**Since:** 3.2
## Parameters
- `radius` : Radius of the dodecahedron.
- `detail` : Default to 0. Setting this to a value greater than 0 adds vertices making it no longer a dodecahedron.
## Examples
use <polyhedra/dodecahedron.scad>;
for(i = [0:5]) {
translate([i * 2, 0])
dodecahedron(radius = 1, detail = i);
}
![dodecahedron](images/lib3x-polyhedra_dodecahedron-1.JPG)

View File

@@ -0,0 +1,22 @@
# hexahedron
Creates a hexahedron.
**Since:** 3.2
## Parameters
- `radius` : Radius of the hexahedron.
- `detail` : Default to 0. Setting this to a value greater than 0 adds vertices making it no longer a hexahedron.
## Examples
use <polyhedra/hexahedron.scad>;
for(i = [0:5]) {
translate([i * 2, 0])
hexahedron(radius = 1, detail = i);
}
![hexahedron](images/lib3x-polyhedra_hexahedron-1.JPG)

View File

@@ -0,0 +1,22 @@
# icosahedron
Creates a icosahedron.
**Since:** 3.2
## Parameters
- `radius` : Radius of the icosahedron.
- `detail` : Default to 0. Setting this to a value greater than 0 adds vertices making it no longer a icosahedron.
## Examples
use <polyhedra/icosahedron.scad>;
for(i = [0:5]) {
translate([i * 2, 0])
icosahedron(radius = 1, detail = i);
}
![icosahedron](images/lib3x-polyhedra_icosahedron-1.JPG)

View File

@@ -0,0 +1,22 @@
# octahedron
Creates a octahedron.
**Since:** 3.2
## Parameters
- `radius` : Radius of the octahedron.
- `detail` : Default to 0. Setting this to a value greater than 0 adds vertices making it no longer a octahedron.
## Examples
use <polyhedra/octahedron.scad>;
for(i = [0:5]) {
translate([i * 2, 0])
octahedron(radius = 1, detail = i);
}
![octahedron](images/lib3x-polyhedra_octahedron-1.JPG)

View File

@@ -0,0 +1,22 @@
# polar_zonohedra
Creates a [polar zonohedra](https://mathworld.wolfram.com/PolarZonohedron.html).
**Since:** 3.2
## Parameters
- `n` : n equal rhombs surrounding one vertex. (rotational symmetry)
- `theta` : the pitch angle of the edges. Default to 35.5.
## Examples
use <polyhedra/polar_zonohedra.scad>;
for(n = [3:8]) {
translate([0.5 * n * (n - 3), 0, 0])
polar_zonohedra(n);
}
![polar_zonohedra](images/lib3x-polyhedra_polar_zonohedra-1.JPG)

View File

@@ -0,0 +1,24 @@
# star
Create a star. Default to a pentagram.
**Since:** 3.2
## Parameters
- `outer_radius`: The outer radius of the star. Default to 1.
- `inner_radius`: The inner radius of the star. Default to 0.381966.
- `height`: The star height. Default to 0.5.
- `n`: The burst number. Default to 5.
## Examples
use <polyhedra/star.scad>;
for(i = [3:6]) {
translate([(i - 3) * 2, 0])
star(n = i);
}
![star](images/lib3x-polyhedra_star-1.JPG)

View File

@@ -0,0 +1,27 @@
# superellipsoid
Creates a [superellipsoid](https://en.wikipedia.org/wiki/Superellipsoid).
**Since:** 3.2
## Parameters
- `e` : The east-west parameter.
- `n` : The north-south parameter.
## Examples
use <polyhedra/superellipsoid.scad>;
$fn = 24;
step = 0.5;
for(e = [0:step:4]) {
for(n = [0:step:4])
translate([e / step, n / step] * 3)
superellipsoid(e, n);
}
![superellipsoid](images/lib3x-polyhedra_superellipsoid-1.JPG)

View File

@@ -0,0 +1,22 @@
# tetrahedron
Creates a tetrahedron.
**Since:** 3.2
## Parameters
- `radius` : Radius of the tetrahedron.
- `detail` : Default to 0. Setting this to a value greater than 0 adds vertices making it no longer a tetrahedron.
## Examples
use <polyhedra/tetrahedron.scad>;
for(i = [0:5]) {
translate([i * 2, 0])
tetrahedron(radius = 1, detail = i);
}
![tetrahedron](images/lib3x-polyhedra_tetrahedron-1.JPG)

View File

@@ -0,0 +1,42 @@
# polyline_join
Place a join on each point. Hull each pair of joins and union all convex hulls.
**Since:** 3.2
## Parameters
- `points` : a list of points.
## Examples
use <polyline_join.scad>;
polyline_join([[0, 0], [10, 0], [10, 10], [0, 10]])
square(1);
polyline_join([[15, 0], [25, 0], [25, 10], [15, 10]]) {
square(1);
circle(1);
square(1);
circle(2);
}
![polyline_join](images/lib3x-polyline_join-1.JPG)
use <polyline_join.scad>;
polyline_join([[0, 0, 0], [10, 0, 0], [10, 0, 10], [10, 10, 10]])
cube(1);
polyline_join([[15, 0, 0], [25, 0, 0], [25, 0, 10], [25, 10, 10]]) {
cube(1);
sphere(1);
cube(1);
sphere(2);
}
![polyline_join](images/lib3x-polyline_join-2.JPG)

View File

@@ -1,141 +0,0 @@
# polysections
Crosscutting a tube-like shape at different points gets several cross-sections. This module can operate reversely. It uses cross-sections to construct a tube-like shape. For example, imagine that you have the following cross-sections:
![polysections](images/lib3x-polysections-1.JPG)
This module can use them to construct the following model:
![polysections](images/lib3x-polysections-2.JPG)
Looks like extruding along the path? Yes, it can perform the task; however, it's more flexible.
You can also view it as a better polyline3d module if you want. If you have only the points of a path, using `polyline3d` or `hull_polyline3d` is a simple solution. If you know the cross sections along a path, you can use `polysections` to do more.
When using this module, you should use points to represent each cross section. The points of your cross section should have count-clockwise indexes. For example:
![polysections](images/lib3x-polysections-10.JPG)
If your cross section is hollow, set the `triangles` parameter to `"HOLLOW"` and index the points as the following:
![polysections](images/lib3x-polysections-5.JPG)
You can cut triangles by yourself. For example, the above shape can be cut into triangles such as:
![polysections](images/lib3x-polysections-6.JPG)
The indexes of the above triangles is:
[
[0, 3, 1],
[1, 3, 4],
[1, 4, 2],
[2, 4, 5],
[2, 5, 0],
[0, 5, 3]
]
When defining triangles, you can use clockwise or counter-clockwise indexes.
## Parameters
- `sections` : A list of cross-sections. Each cross-section is represented by a list of points. See the example below.
- `triangles` : `"SOLID"` (default), `"HOLLOW"`, or user-defined indexes. See example below.
## Examples
use <rotate_p.scad>;
use <polysections.scad>;
section1 = [
[20, 0, 0],
[18, 9, 0],
[15, 10, 0],
[10, 0, 0]
];
// spin section1
sections = [
for(i = [0:55])
[
for(p = section1)
let(pt = rotate_p(p, [90, 0, 10 * i]))
[pt[0], pt[1] , pt[2] + i]
]
];
polysections(sections);
![polysections](images/lib3x-polysections-7.JPG)
use <rotate_p.scad>;
use <polysections.scad>;
section1 = [
// outer
[20, 0, 0],
[18, 9, 0],
[15, 10, 0],
[10, 0, 0],
// inner
[18, 2, 0],
[17, 7, 0],
[15, 7, 0],
[12, 2, 0]
];
// spin section1
sections = [
for(i = [0:55])
[
for(p = section1)
let(pt = rotate_p(p, [90, 0, 10 * i]))
[pt[0], pt[1] , pt[2] + i]
]
];
polysections(sections, "HOLLOW");
![polysections](images/lib3x-polysections-8.JPG)
use <rotate_p.scad>;
use <polysections.scad>;
section1 = [
// outer
[30, 0, 0],
[15, 10, 0],
[10, 0, 0],
// inner
[26, 1, 0],
[15, 8, 0],
[12, 1, 0],
];
// spin section1
sections = [
for(i = [0:55])
[
for(p = section1)
let(pt = rotate_p(p, [90, 0, 10 * i]))
[pt[0], pt[1] , pt[2] + i]
]
];
polysections(
sections = sections,
triangles = [
[0, 3, 1],
[1, 3, 4],
[1, 4, 2],
[2, 4, 5],
[2, 5, 0],
[0, 5, 3]
]
);
![polysections](images/lib3x-polysections-9.JPG)

View File

@@ -13,29 +13,31 @@ Transform a point inside a rectangle to a point inside a circle. You can use it
## Examples
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
use <ptf/ptf_circle.scad>;
size = [10, 10];
rows = [
for(y = [0:size[1]])
[for(x = [0:size[0]]) [x, y]]
for(y = [0:size.y])
[for(x = [0:size.x]) [x, y]]
];
columns = [
for(x = [0:size[0]])
[for(y = [0:size[1]]) [x, y]]
for(x = [0:size.x])
[for(y = [0:size.y]) [x, y]]
];
for(line = rows) {
transformed = [for(p = line) ptf_circle(size, p)];
hull_polyline3d(transformed, thickness = .1);
polyline_join(transformed)
sphere(.05);
}
for(line = columns) {
transformed = [for(p = line) ptf_circle(size, p)];
hull_polyline3d(transformed, thickness = .1);
polyline_join(transformed)
sphere(.05);
}
![ptf_circle](images/lib3x-ptf_circle-2.JPG)

View File

@@ -16,30 +16,32 @@ Transforms a point inside a rectangle to a point of a ring. It can create things
## Examples
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
use <ptf/ptf_ring.scad>;
size = [20, 10];
radius = 5;
rows = [
for(y = [0:size[1]])
[for(x = [0:size[0]]) [x, y]]
for(y = [0:size.y])
[for(x = [0:size.x]) [x, y]]
];
columns = [
for(x = [0:size[0]])
[for(y = [0:size[1]]) [x, y]]
for(x = [0:size.x])
[for(y = [0:size.y]) [x, y]]
];
for(line = rows) {
transformed = [for(p = line) ptf_ring(size, p, radius, 360, 180)];
hull_polyline3d(transformed, thickness = .5);
polyline_join(transformed)
sphere(.25);
}
for(line = columns) {
transformed = [for(p = line) ptf_ring(size, p, radius, 360, 180)];
hull_polyline3d(transformed, thickness = .5);
polyline_join(transformed)
sphere(.25);
}
![ptf_ring](images/lib3x-ptf_ring-2.JPG)

View File

@@ -26,7 +26,7 @@ Rotates a point `a` degrees around the axis of the coordinate system or an arbit
sphere(1);
}
![ptf_rotate](images/lib3x-rotate_p-1.JPG)
![ptf_rotate](images/lib3x-ptf_rotate-1.JPG)
use <ptf/ptf_rotate.scad>;
@@ -48,7 +48,7 @@ Rotates a point `a` degrees around the axis of the coordinate system or an arbit
%sphere(radius);
![ptf_rotate](images/lib3x-rotate_p-2.JPG)
![ptf_rotate](images/lib3x-ptf_rotate-2.JPG)
use <ptf/ptf_rotate.scad>;
@@ -66,4 +66,4 @@ Rotates a point `a` degrees around the axis of the coordinate system or an arbit
sphere(1);
}
![ptf_rotate](images/lib3x-rotate_p-3.JPG)
![ptf_rotate](images/lib3x-ptf_rotate-3.JPG)

View File

@@ -15,7 +15,7 @@ Transforms a point inside a rectangle to a point of a sphere. It can create thin
## Examples
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
use <ptf/ptf_sphere.scad>;
size = [20, 10];
@@ -23,23 +23,25 @@ Transforms a point inside a rectangle to a point of a sphere. It can create thin
angle = [180, 270];
rows = [
for(y = [0:size[1]])
[for(x = [0:size[0]]) [x, y]]
for(y = [0:size.y])
[for(x = [0:size.x]) [x, y]]
];
columns = [
for(x = [0:size[0]])
[for(y = [0:size[1]]) [x, y]]
for(x = [0:size.x])
[for(y = [0:size.y]) [x, y]]
];
for(line = rows) {
transformed = [for(p = line) ptf_sphere(size, p, radius, angle)];
hull_polyline3d(transformed, thickness = .5);
polyline_join(transformed)
sphere(.25);
}
for(line = columns) {
transformed = [for(p = line) ptf_sphere(size, p, radius, angle)];
hull_polyline3d(transformed, thickness = .5);
polyline_join(transformed)
sphere(.25);
}
![ptf_sphere](images/lib3x-ptf_sphere-2.JPG)

View File

@@ -16,7 +16,7 @@ Transforms a point inside a rectangle to a point of a torus. It can create thing
## Examples
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
use <ptf/ptf_torus.scad>;
size = [20, 10];
@@ -25,23 +25,25 @@ Transforms a point inside a rectangle to a point of a torus. It can create thing
twist = 90;
rows = [
for(y = [0:size[1]])
[for(x = [0:size[0]]) [x, y]]
for(y = [0:size.y])
[for(x = [0:size.x]) [x, y]]
];
columns = [
for(x = [0:size[0]])
[for(y = [0:size[1]]) [x, y]]
for(x = [0:size.x])
[for(y = [0:size.y]) [x, y]]
];
for(line = rows) {
transformed = [for(p = line) ptf_torus(size, p, radius, angle, twist)];
hull_polyline3d(transformed, thickness = .5);
polyline_join(transformed)
sphere(.25);
}
for(line = columns) {
transformed = [for(p = line) ptf_torus(size, p, radius, angle, twist)];
hull_polyline3d(transformed, thickness = .5);
polyline_join(transformed)
sphere(.25);
}
![ptf_torus](images/lib3x-ptf_torus-2.JPG)

View File

@@ -14,29 +14,31 @@ Twist a point along the x-axis. You can use it to create something such as a [tw
## Examples
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
use <ptf/ptf_x_twist.scad>;
size = [20, 10];
rows = [
for(y = [0:size[1]])
[for(x = [0:size[0]]) [x, y]]
for(y = [0:size.y])
[for(x = [0:size.x]) [x, y]]
];
columns = [
for(x = [0:size[0]])
[for(y = [0:size[1]]) [x, y]]
for(x = [0:size.x])
[for(y = [0:size.y]) [x, y]]
];
for(line = rows) {
twisted = [for(p = line) ptf_x_twist(size, p, 90)];
hull_polyline3d(twisted, thickness = .1);
polyline_join(twisted)
sphere(.05);
}
for(line = columns) {
twisted = [for(p = line) ptf_x_twist(size, p, 90)];
hull_polyline3d(twisted, thickness = .1);
polyline_join(twisted)
sphere(.05);
}
![ptf_x_twist](images/lib3x-ptf_x_twist-1.JPG)

View File

@@ -14,29 +14,31 @@ Twist a point along the y-axis. You can use it to create something such as a [tw
## Examples
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
use <ptf/ptf_y_twist.scad>;
size = [10, 20];
rows = [
for(y = [0:size[1]])
[for(x = [0:size[0]]) [x, y]]
for(y = [0:size.y])
[for(x = [0:size.x]) [x, y]]
];
columns = [
for(x = [0:size[0]])
[for(y = [0:size[1]]) [x, y]]
for(x = [0:size.x])
[for(y = [0:size.y]) [x, y]]
];
for(line = rows) {
twisted = [for(p = line) ptf_y_twist(size, p, 90)];
hull_polyline3d(twisted, thickness = .1);
polyline_join(twisted)
sphere(.05);
}
for(line = columns) {
twisted = [for(p = line) ptf_y_twist(size, p, 90)];
hull_polyline3d(twisted, thickness = .1);
polyline_join(twisted)
sphere(.05);
}
![ptf_y_twist](images/lib3x-ptf_y_twist-1.JPG)

View File

@@ -0,0 +1,69 @@
# rails2sections
Create sections along rails. Combined with the `sweep` module, you can describe a more complex model.
Rails should be indexed count-clockwisely.
**Since:** 3.2
## Parameters
- `rails` : A list of rails used to describe the surface of the model.
## Examples
use <rails2sections.scad>;
use <polyline_join.scad>;
use <sweep.scad>;
rails = [
[[5, 0, 5], [15, 10, 10], [25, 20, 5]],
[[-5, 0, 5], [-15, 10, 10], [-25, 20, 5]],
[[-5, 0, -5], [-15, 10, -10], [-25, 20, -5]],
[[5, 0, -5], [15, 10, -10], [25, 20, -5]]
];
sections = rails2sections(rails);
sweep(sections);
#for(path = rails) {
polyline_join(path)
sphere(.25);
}
![rails2sections](images/lib3x-rails2sections-1.JPG)
use <bezier_curve.scad>;
use <rails2sections.scad>;
use <polyline_join.scad>;
use <sweep.scad>;
t_step = 0.05;
rails = [
bezier_curve(t_step,
[[1.25, 0, 5], [5, 20, 5], [16, 20, -2], [18, 20, 10], [30, 15, 8]]
),
bezier_curve(t_step,
[[-1.25, 0, 5], [0, 20, 5], [16, 22, -2], [18, 20, 10], [30, 25, 8]]
),
bezier_curve(t_step,
[[-1.25, 0, -5], [0, 20, -5], [16, 20, 1], [18, 27, -3], [20, 27, -5]]
),
bezier_curve(t_step,
[[1.25, 0, -5], [5, 20, -5], [16, 20, 1], [18, 17.5, -3], [20, 17.5, -5]]
)
];
sections = rails2sections(rails);
sweep(sections);
#for(path = rails) {
polyline_join(path)
sphere(.25);
}
![rails2sections](images/lib3x-rails2sections-2.JPG)

View File

@@ -1,82 +0,0 @@
# rotate_p
Rotates a point `a` degrees about the axis of the coordinate system or around an arbitrary axis. It behaves as the built-in `rotate` module
## Parameters
- `point` : A 3D point `[x, y, z]` or a 2D point `[x, y]`.
- `a` : If it's `[deg_x, deg_y, deg_z]`, the rotation is applied in the order `x`, `y`, `z`. If it's `[deg_x, deg_y]`, the rotation is applied in the order `x`, `y`. If it's`[deg_x]`, the rotation is only applied to the `x` axis. If it's an number, the rotation is only applied to the `z` axis or an arbitrary axis.
- `v`: A vector allows you to set an arbitrary axis about which the object will be rotated. When `a` is an array, the `v` argument is ignored. **Since:** 1.1.
## Examples
You can use the code below to create a line.
use <rotate_p.scad>;
hull() {
sphere(1);
rotate([0, -45, 45])
translate([20, 0, 0])
sphere(1);
}
The following code has the same effect.
use <rotate_p.scad>;
point = [20, 0, 0];
a = [0, -45, 45];
hull() {
sphere(1);
translate(rotate_p(point, a))
rotate(a)
sphere(1);
}
![rotate_p](images/lib3x-rotate_p-1.JPG)
The `rotate_p` function is useful in some situations. For example, you probably want to get all points on the path of a spiral around a sphere.
use <rotate_p.scad>;
radius = 40;
step_angle = 10;
z_circles = 20;
points = [for(a = [0:step_angle:90 * z_circles])
rotate_p(
[radius, 0, 0],
[0, -90 + 2 * a / z_circles, a]
)
];
// Once you get all points on the path, you can place anything at each point.
// I just place a sphere as a simple demonstration.
for(p = points) {
translate(p)
sphere(1);
}
%sphere(radius);
![rotate_p](images/lib3x-rotate_p-2.JPG)
use <rotate_p.scad>;
v = [10, 10, 10];
hull() {
sphere(1);
translate(v)
sphere(1);
}
p = [10, 10, 0];
for(i = [0:20:340]) {
translate(rotate_p(p, a = i, v = v))
sphere(1);
}
![rotate_p](images/lib3x-rotate_p-3.JPG)

37
docs/lib3x-select.md Normal file
View File

@@ -0,0 +1,37 @@
# select
Selects module objects.
**Since:** 3.2
## Parameters
- `i` : An index value, range, or list. Select all module objects if `i` is ignored.
## Examples
If you write code like this:
i = 0;
if(i == 0) {
sphere(1);
}
else if(i == 1) {
cube(1);
}
else if(i == 2) {
cylinder(1, 1);
}
You may use `select`:
use <select.scad>;
i = 0;
select(i) {
sphere(1);
cube(1);
cylinder(1, 1);
}

View File

@@ -20,7 +20,7 @@ Follow the steps described in [img2gray](https://github.com/JustinSDK/img2gray).
## Examples
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
use <bezier_curve.scad>;
use <surface/sf_curve.scad>;
@@ -146,4 +146,5 @@ Follow the steps described in [img2gray](https://github.com/JustinSDK/img2gray).
sf_curve(levels, curve_path, thickness, depth, invert);
#hull_polyline3d(curve_path, 5);
#polyline_join(curve_path)
sphere(2.5);

View File

@@ -18,8 +18,8 @@ It solidifies two surfaces with triangular mesh.
points = [for(i = [0:50]) rands(-300, 300, 2)];
triangles = tri_delaunay(points);
pts = [for(p = points) [p[0], p[1], rands(100, 150, 1)[0]]];
pts2 = [for(p = pts) [p[0], p[1], p[2] - 100]];
pts = [for(p = points) [p.x, p.y, rands(100, 150, 1)[0]]];
pts2 = [for(p = pts) [p.x, p.y, p.z - 100]];
sf_solidifyT(pts, pts2, triangles = triangles);
@@ -45,8 +45,8 @@ It solidifies two surfaces with triangular mesh.
[x, y]
];
points1 = [for(p = pts2d) scale * [p[0], p[1], f(p[0], p[1])]];
points2 = [for(p = points1) [p[0], p[1], p[2] - scale * thickness]];
points1 = [for(p = pts2d) scale * [p.x, p.y, f(p.x, p.y)]];
points2 = [for(p = points1) [p.x, p.y, p.z - scale * thickness]];
triangles = tri_delaunay(pts2d);

22
docs/lib3x-shape_star.md Normal file
View File

@@ -0,0 +1,22 @@
# shape_star
Create a star. Default to a pentagram.
**Since:** 3.2
## Parameters
- `outer_radius`: the outer radius of the star. Default to 1.
- `inner_radius`: the inner radius of the star. Default to 0.381966.
- `n`: the burst number. Default to 5.
## Examples
use <shape_star.scad>;
polygon(shape_star());
translate([3, 0, 0])
polygon(shape_star(n = 8));
![shape_star](images/lib3x-shape_star-1.JPG)

View File

@@ -14,7 +14,7 @@ Creates all points and angles on the path of a spiral around a sphere. It return
## Examples
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
use <sphere_spiral.scad>;
points_angles = sphere_spiral(
@@ -25,7 +25,8 @@ Creates all points and angles on the path of a spiral around a sphere. It return
end_angle = 90
);
hull_polyline3d([for(pa = points_angles) pa[0]], 1);
polyline_join([for(pa = points_angles) pa[0]])
sphere(.5);
%sphere(40);
@@ -54,7 +55,7 @@ Creates all points and angles on the path of a spiral around a sphere. It return
![sphere_spiral](images/lib3x-sphere_spiral-5.JPG)
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
use <sphere_spiral.scad>;
points_angles = sphere_spiral(
@@ -64,7 +65,8 @@ Creates all points and angles on the path of a spiral around a sphere. It return
for(a = [0:30:360]) {
rotate(a)
hull_polyline3d([for(pa = points_angles) pa[0]], 2);
polyline_join([for(pa = points_angles) pa[0]])
sphere(1);
}
![sphere_spiral](images/lib3x-sphere_spiral-6.JPG)

View File

@@ -40,7 +40,7 @@ The indexes of the above triangles is:
## Examples
use <rotate_p.scad>;
use <ptf/ptf_rotate.scad>;
use <sweep.scad>;
section1 = [
@@ -55,8 +55,8 @@ The indexes of the above triangles is:
for(i = [0:55])
[
for(p = section1)
let(pt = rotate_p(p, [90, 0, 10 * i]))
[pt[0], pt[1] , pt[2] + i]
let(pt = ptf_rotate(p, [90, 0, 10 * i]))
[pt.x, pt.y , pt.z + i]
]
];
@@ -64,7 +64,7 @@ The indexes of the above triangles is:
![sweep](images/lib3x-sweep-7.JPG)
use <rotate_p.scad>;
use <ptf/ptf_rotate.scad>;
use <sweep.scad>;
section1 = [
@@ -85,8 +85,8 @@ The indexes of the above triangles is:
for(i = [0:55])
[
for(p = section1)
let(pt = rotate_p(p, [90, 0, 10 * i]))
[pt[0], pt[1] , pt[2] + i]
let(pt = ptf_rotate(p, [90, 0, 10 * i]))
[pt.x, pt.y , pt.z + i]
]
];
@@ -94,7 +94,7 @@ The indexes of the above triangles is:
![sweep](images/lib3x-sweep-8.JPG)
use <rotate_p.scad>;
use <ptf/ptf_rotate.scad>;
use <sweep.scad>;
section1 = [
@@ -113,8 +113,8 @@ The indexes of the above triangles is:
for(i = [0:55])
[
for(p = section1)
let(pt = rotate_p(p, [90, 0, 10 * i]))
[pt[0], pt[1] , pt[2] + i]
let(pt = ptf_rotate(p, [90, 0, 10 * i]))
[pt.x, pt.y , pt.z + i]
]
];

View File

@@ -81,7 +81,7 @@ The code below creates the same drawing.
![t2d](images/lib3x-t2d-1.JPG)
use <hull_polyline2d.scad>;
use <polyline_join.scad>;
use <turtle/t2d.scad>;
side_leng = 100;
@@ -100,10 +100,8 @@ The code below creates the same drawing.
["forward", side_leng]
]);
hull_polyline2d(
[for(turtle = [t, t2, t3, t]) t2d(turtle, "point")],
thickness
);
polyline_join([for(turtle = [t, t2, t3, t]) t2d(turtle, "point")])
circle(thickness / 2);
}
module sierpinski_triangle(t, side_leng, min_leng, thickness) {

View File

@@ -20,7 +20,7 @@ For more details, please see [3D turtle graphics](https://openhome.cc/eGossip/Op
## Examples
use <turtle/t3d.scad>;
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
leng = 10;
angle = 120;
@@ -37,10 +37,9 @@ For more details, please see [3D turtle graphics](https://openhome.cc/eGossip/Op
["xforward", leng]
]);
hull_polyline3d(
[for(turtle = [t, t2, t3, t4]) t3d(turtle, "point")],
thickness
);
polyline_join(
[for(turtle = [t, t2, t3, t4]) t3d(turtle, "point")]
) sphere(thickness / 2);
![t3d](images/lib3x-t3d-1.JPG)

View File

@@ -12,7 +12,7 @@ Join a set of points to make a [Delaunay triangulation](https://en.wikipedia.org
## Examples
use <triangle/tri_delaunay.scad>;
use <hull_polyline2d.scad>;
use <polyline_join.scad>;
points = [for(i = [0:20]) rands(-100, 100, 2)];
@@ -32,7 +32,8 @@ Join a set of points to make a [Delaunay triangulation](https://en.wikipedia.org
color("red")
linear_extrude(3)
for(t = tri_delaunay(points, ret = "VORONOI_CELLS")) {
hull_polyline2d(concat(t, [t[0]]), 2);
polyline_join(concat(t, [t[0]]))
circle(1);
}
![tri_delaunay](images/lib3x-tri_delaunay-1.JPG)

View File

@@ -14,7 +14,7 @@ A method of [`tri_delaunay`](lib3x-tri_delaunay.html). Returns the indices from
use <triangle/tri_delaunay_indices.scad>;
use <triangle/tri_delaunay_shapes.scad>;
use <triangle/tri_delaunay_voronoi.scad>;
use <hull_polyline2d.scad>;
use <polyline_join.scad>;
points = [for(i = [0:20]) rands(-100, 100, 2)];
@@ -36,7 +36,8 @@ A method of [`tri_delaunay`](lib3x-tri_delaunay.html). Returns the indices from
color("red")
linear_extrude(3)
for(t = tri_delaunay_voronoi(delaunay)) {
hull_polyline2d(concat(t, [t[0]]), 2);
polyline_join(concat(t, [t[0]]))
circle(1);
}
![tri_delaunay_indices](images/lib3x-tri_delaunay_indices-1.JPG)

View File

@@ -14,7 +14,7 @@ A method of [`tri_delaunay`](lib3x-tri_delaunay.html). Returns triangle shapes f
use <triangle/tri_delaunay_indices.scad>;
use <triangle/tri_delaunay_shapes.scad>;
use <triangle/tri_delaunay_voronoi.scad>;
use <hull_polyline2d.scad>;
use <polyline_join.scad>;
points = [for(i = [0:20]) rands(-100, 100, 2)];
@@ -36,7 +36,8 @@ A method of [`tri_delaunay`](lib3x-tri_delaunay.html). Returns triangle shapes f
color("red")
linear_extrude(3)
for(t = tri_delaunay_voronoi(delaunay)) {
hull_polyline2d(concat(t, [t[0]]), 2);
polyline_join(concat(t, [t[0]]))
circle(1);
}
![tri_delaunay_shapes](images/lib3x-tri_delaunay_shapes-1.JPG)

View File

@@ -14,7 +14,7 @@ A method of [`tri_delaunay`](lib3x-tri_delaunay.html). Returns voronoi cells fro
use <triangle/tri_delaunay_indices.scad>;
use <triangle/tri_delaunay_shapes.scad>;
use <triangle/tri_delaunay_voronoi.scad>;
use <hull_polyline2d.scad>;
use <polyline_join.scad>;
points = [for(i = [0:20]) rands(-100, 100, 2)];
@@ -36,7 +36,8 @@ A method of [`tri_delaunay`](lib3x-tri_delaunay.html). Returns voronoi cells fro
color("red")
linear_extrude(3)
for(t = tri_delaunay_voronoi(delaunay)) {
hull_polyline2d(concat(t, [t[0]]), 2);
polyline_join(concat(t, [t[0]]))
circle(1);
}
![tri_delaunay_voronoi](images/lib3x-tri_delaunay_voronoi-1.JPG)

View File

@@ -13,7 +13,7 @@ Given a tangled-edge shape. This function trims the shape to a non-tangled shape
## Examples
use <hull_polyline2d.scad>;
use <polyline_join.scad>;
use <trim_shape.scad>;
use <shape_taiwan.scad>;
use <bijection_offset.scad>;
@@ -24,10 +24,13 @@ Given a tangled-edge shape. This function trims the shape to a non-tangled shape
trimmed = trim_shape(offseted, 3, len(offseted) - 6);
smoothed = midpt_smooth(trimmed, 3);
#hull_polyline2d(taiwan, .1);
#polyline_join(taiwan)
circle(.05);
%translate([25, 0, 0])
hull_polyline2d(offseted, .2);
hull_polyline2d(smoothed, .1);
polyline_join(offseted)
circle(.1);
polyline_join(smoothed)
circle(.05);
![trim_shape](images/lib3x-trim_shape-1.JPG)

View File

@@ -10,7 +10,7 @@ Create cell shapes of Voronoi from a list of points.
## Examples
use <hull_polyline2d.scad>;
use <polyline_join.scad>;
use <voronoi/vrn2_cells_from.scad>;
points = [for(i = [0:50]) rands(-100, 100, 2)];
@@ -21,7 +21,8 @@ Create cell shapes of Voronoi from a list of points.
cell = cells[i];
linear_extrude(1)
hull_polyline2d(concat(cell, [cell[0]]), width = 1);
polyline_join(concat(cell, [cell[0]]))
circle(.5);
color(rands(0, 1, 3))
translate(pt)

View File

@@ -12,7 +12,7 @@ Create cell shapes of Voronoi in the first quadrant. You specify a space and a g
## Examples
use <hull_polyline2d.scad>;
use <polyline_join.scad>;
use <voronoi/vrn2_cells_space.scad>;
size = [20, 20];
@@ -24,7 +24,8 @@ Create cell shapes of Voronoi in the first quadrant. You specify a space and a g
cell_poly = cell[1];
linear_extrude(1)
hull_polyline2d(concat(cell_poly, [cell_poly[0]]), width = 1);
polyline_join(concat(cell_poly, [cell_poly[0]]))
circle(.5);
color(rands(0, 1, 3))
translate(cell_pt)
@@ -35,7 +36,7 @@ Create cell shapes of Voronoi in the first quadrant. You specify a space and a g
![vrn2_cells_space](images/lib3x-vrn2_cells_space-1.JPG)
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
use <ptf/ptf_torus.scad>;
use <voronoi/vrn2_cells_space.scad>;
@@ -48,7 +49,8 @@ Create cell shapes of Voronoi in the first quadrant. You specify a space and a g
for(cell = cells) {
cell_poly = [for(p = cell[1]) ptf_torus(size, p, [10, 5], [360, 360])];
hull_polyline3d(cell_poly, thickness = 1);
polyline_join(cell_poly)
sphere(.5);
}
![vrn2_cells_space](images/lib3x-vrn2_cells_space-2.JPG)

View File

@@ -12,7 +12,7 @@ Draws a voxel-by-voxel curve from control points. The curve is drawn only from t
## Examples
use <voxel/vx_curve.scad>;
use <hull_polyline3d.scad>;
use <polyline_join.scad>;
pts = [
[28, 2, 1],
@@ -32,6 +32,7 @@ Draws a voxel-by-voxel curve from control points. The curve is drawn only from t
translate(pt)
sphere(1);
}
#hull_polyline3d(pts, .1);
#polyline_join(pts)
sphere(.05);
![vx_curve](images/lib3x-vx_curve-1.JPG)

View File

@@ -16,7 +16,7 @@ Returns points that can be used to draw a voxel-style polygon.
pentagram = [
for(pt = shape_pentagram(15))
[round(pt[0]), round(pt[1])]
[round(pt.x), round(pt.y)]
];
for(pt = vx_polygon(pentagram)) {

View File

@@ -15,7 +15,7 @@ Given a list of points. `vx_polyline` returns points that can be used to draw a
pentagram = [
for(pt = shape_pentagram(15))
[round(pt[0]), round(pt[1])]
[round(pt.x), round(pt.y)]
];
for(pt = vx_polyline(concat(pentagram, [pentagram[0]]))) {
@@ -37,7 +37,7 @@ Given a list of points. `vx_polyline` returns points that can be used to draw a
points = [
for(pa = points_angles)
let(pt = pa[0])
[round(pt[0]), round(pt[1]), round(pt[2])]
[round(pt.x), round(pt.y), round(pt.z)]
];
for(a = [0:30:330]) {

220
examples/caterpillar.scad Normal file
View File

@@ -0,0 +1,220 @@
use <arc.scad>;
use <pie.scad>;
use <hollow_out.scad>;
$fn = 96;
module track(radius) {
module wheels(radius) {
module wheel() {
rotate_extrude()
translate([radius, 0, 0])
circle(radius / 2);
}
for(i = [0:4:8]) {
translate([radius * i, 0, 0])
wheel();
}
}
module track_profile() {
hull() {
circle(1.7 * radius );
translate([radius * 8, 0, 0])
circle(1.7 * radius);
}
}
translate([-radius * 4, 0, -radius])
scale([1, 1, 1.5]) {
color("black")
linear_extrude(radius * 1.5)
hollow_out(shell_thickness = 0.45 * radius)
track_profile();
color("white")
translate([0, 0, radius * 0.75])
scale([1, 1, 1.5])
wheels(radius);
}
}
module body(radius) {
module eye() {
translate([-radius / 15, 0, 0])
rotate([0, 0, 90])
arc(radius / 2, [0, 180], radius / 5, width_mode = "LINE_OUTWARD");
translate([0, radius / 3, 0])
circle(radius / 3);
}
module eyebrow() {
rotate([0, 0, 90])
arc(radius / 1.25, [25, 155], radius / 10, width_mode = "LINE_OUTWARD");
}
scale([1, 1, 0.9]) {
color("yellow")
sphere(radius * 4);
color("Aqua")
rotate([85, 0, 90])
intersection() {
linear_extrude(radius * 4.5)
pie(radius * 3.5, [0, 180]);
difference() {
sphere(radius * 4 + radius / 5);
sphere(radius * 4);
}
}
// eyes
color("black") {
rotate([0, 65, 16])
linear_extrude(radius * 4.25)
eye();
rotate([0, 65, -16])
linear_extrude(radius * 4.25)
eye();
}
// eyebrows
color("black") {
rotate([0, 55, 20])
linear_extrude(radius * 4.25)
eyebrow();
rotate([0, 55, -20])
linear_extrude(radius * 4.25)
eyebrow();
}
}
}
module arm(radius) {
translate([0, 0, -radius]) {
translate([0, 0, radius / 2])
linear_extrude(radius) {
translate([0, -radius * 0.75, 0])
square([radius * 9, radius * 1.5]);
rotate(80)
translate([0, -radius * 0.5, 0])
square([radius * 9, radius]);
}
translate([0, 0, radius * 0.25])
linear_extrude(radius * 1.5)
circle(radius);
linear_extrude(radius * 2)
translate([radius * 9, 0, 0])
circle(radius);
}
}
module glove(radius) {
scale([0.8, 0.8, 1.2]) {
color("white") {
hull() {
scale([1.1, 1, 0.5])
sphere(radius * 2.5);
translate([-radius * 1.75, 0, radius / 1.5])
scale([1, 1.75, 0.8])
sphere(radius);
}
translate([-radius * 2.5, 0, radius / 1.5])
scale([1.2, 2, 1])
sphere(radius);
rotate(-10)
translate([0, -radius * 2.5, 0])
scale([1.75, 1, 0.8])
sphere(radius / 1.5);
}
color("black")
intersection() {
scale([1.1, 1, 0.55])
sphere(radius * 2.5);
union() {
translate([0, radius * 0.75, -radius * 2])
linear_extrude(radius)
square([radius * 2, radius / 4], center = true);
translate([0, -radius * 0.75, -radius * 2])
linear_extrude(radius)
square([radius * 2, radius / 4], center = true);
}
}
}
}
module big_caterpillar(radius) {
translate([0, -radius * 4, 0])
rotate([90, 0, 0])
track(radius);
translate([0, 0, radius * 3])
body(radius);
translate([0, radius * 4, 0])
rotate([90, 0, 0])
track(radius);
color("yellow")
translate([radius * 6, -radius * 4.5, radius * 9.5])
rotate([90, 135, 0])
arm(radius);
translate([radius * 10.75, -radius * 4.5, radius / 2.325])
rotate([0, 70, 180])
glove(radius);
}
module small_caterpillar(radius) {
body_pts = [
[0, 0, -radius / 3],
[radius * 1.5, 0, 0],
[radius * 3, 0, radius],
[radius * 4.25, 0, radius * 2]
];
color("LimeGreen")
for(p = body_pts) {
translate(p)
sphere(radius);
}
module eye() {
color("white")
translate([0, 0, 0])
sphere(radius / 1.5);
color("black")
translate([.5 * radius, radius / 4, 0])
sphere(radius / 3);
color("white")
translate([.655 * radius, radius / 2.75, 0])
sphere(radius / 6);
}
half_r = radius / 2;
translate([radius * 4.75, 0, radius * 3]) {
translate([0, half_r, 0]) eye();
translate([0, -half_r, 0]) eye();
}
}
module caterpillars(radius) {
big_caterpillar(radius);
translate([radius * 3.5, -radius * 4.5, radius * 9.75])
rotate([0, -15, 0])
scale([0.8, 0.8, 0.8]) small_caterpillar(radius);
}
caterpillars(5);

225
examples/daruma.scad Normal file
View File

@@ -0,0 +1,225 @@
use <shear.scad>;
text = "順暢";
font = "思源黑體 Heavy";
font_size = 15;
nose = true;
smoothing = false; // warning: previewing is slow if it's true.
scale(smoothing ? 0.985 : 1)
daruma(nose);
wish_decoration(text, font, font_size);
module daruma(nose) {
radius = 10;
module body() {
translate([0, 0, radius * 2.75])
shear(sy = [.025, 0])
minkowski() {
linear_extrude(radius * 2, scale = 0.4)
translate([0, -radius / 4])
circle(radius);
sphere(radius * 4, $fn = 48);
}
}
module mask_face() {
module bend_extrude(size, thickness, angle, frags = 24) {
x = size[0];
y = size[1];
frag_width = x / frags ;
frag_angle = angle / frags;
half_frag_width = 0.5 * frag_width;
half_frag_angle = 0.5 * frag_angle;
r = half_frag_width / sin(half_frag_angle);
s = (r - thickness) / r;
module get_frag(i) {
offsetX = i * frag_width;
translate([0, y / 2, 0])
linear_extrude(thickness, scale = s)
translate([-offsetX - half_frag_width, -y / 2, 0])
intersection() {
translate([x, 0, 0])
mirror([1, 0, 0])
children();
translate([offsetX, 0, 0])
square([frag_width, y]);
}
}
offsetY = -r * cos(half_frag_angle) ;
rotate(angle - 90)
mirror([0, 1, 0])
mirror([0, 0, 1])
for(i = [0 : frags - 1]) {
rotate(i * frag_angle + half_frag_angle)
translate([0, offsetY, 0])
rotate([-90, 0, 0])
get_frag(i)
children();
}
}
translate([0, -radius, radius * 1.4])
scale([1.27, 1, 1])
rotate([-24, 0, 0])
rotate(225)
bend_extrude(size = [radius * 16, radius * 8], thickness = radius, angle = 180, frags = 36)
translate([radius * 4, radius * 2.5])
hull() {
$fn = 12;
translate([0, radius * 1.75])
circle(radius * 1.2);
translate([radius * 1.45, radius * 1.5])
circle(radius * 1.25, $fn = 24);
translate([-radius * 1.45, radius * 1.5])
circle(radius * 1.25, $fn = 24);
translate([radius * 1.85, radius * 0.25])
rotate(25)
scale([1, 1.3])
circle(radius * 1.3);
translate([-radius * 1.85, radius * 0.25])
rotate(-25)
scale([1, 1.3])
circle(radius * 1.3);
translate([radius * 2.75, -radius * 1.2])
circle(radius / 2);
translate([-radius * 2.75, -radius * 1.2])
circle(radius / 2);
}
}
module eyes_nose() {
module eye() {
translate([radius * 1.4, -3.1 * radius, radius * 5.9])
rotate([66, 0, 15])
linear_extrude(radius / 4, scale = 0.9)
circle(radius * 1.15);
}
eye();
mirror([1, 0, 0])
eye();
// nose
if(nose) {
translate([0, -3.75 * radius, radius * 4.85])
rotate([67.5, 0, 0])
linear_extrude(radius / 4, scale = 0.9)
circle(radius * 0.4);
}
}
if(smoothing) {
minkowski() {
union() {
difference() {
body();
mask_face();
}
eyes_nose();
}
sphere(radius / 9.5, $fn = 8);
}
} else {
difference() {
body();
mask_face();
}
eyes_nose();
}
}
module wish_decoration(text, font, font_size) {
$fn = 48;
translate([0, -2, 0])
intersection() {
union() {
wish();
decoration();
mirror([1, 0, 0])
decoration();
}
translate([0, 0, 31])
sphere(52.25);
}
module wish() {
if(len(text) == 1) {
translate([0, -43, 21])
rotate([90, 0, 0])
linear_extrude(10, scale = .8)
text(
text,
font = font,
size = font_size,
valign = "center",
halign = "center"
);
}
else {
translate([0, -43, 29.5])
rotate([85, 0, 0])
linear_extrude(10, scale = .8)
text(
text[0],
font = font,
size = font_size,
valign = "center",
halign = "center"
);
translate([0, -42.5, 12])
rotate([105, 0, 0])
linear_extrude(10, scale = .8)
text(
text[1],
font = font,
size = font_size,
valign = "center",
halign = "center"
);
}
}
module decoration() {
translate([18, -38, 21])
rotate([100, 0, 0])
linear_extrude(10, scale = .8)
scale(.85)
scale([1, 1.825])
offset(.5)
difference() {
circle(10);
translate([-9, 0])
circle(11.5);
}
translate([28, -30, 21])
rotate([100, 0, 30])
linear_extrude(10, scale = .8)
scale(.7)
scale([1, 1.825])
offset(.5)
difference() {
circle(10);
translate([-9, 0])
circle(11.5);
}
}
}

View File

@@ -11,11 +11,11 @@ beginning_radius = 15;
thickness = 2;
fn = 180;
amplitude = 10;
curve_step = 0.02;
curve_step = 0.01;
smoothness = 15;
// Perlin noise 2D or 3D
perlin = 2; // [2, 3]
bottom = "NO"; // ["YES", "NO"]
bottom = "YES"; // ["YES", "NO"]
epsilon = 0.000001;
distorted_vase(beginning_radius, thickness, fn, amplitude, curve_step, smoothness, perlin, epsilon);
@@ -77,7 +77,10 @@ module distorted_vase(beginning_radius, thickness, fn, amplitude,curve_step, smo
sweep(all, triangles = "HOLLOW");
if(bottom == "YES") {
linear_extrude(thickness)
polygon([for(p = offset_noisy[len(offset_noisy) - 1]) [p[0], p[1]]]);
sweep([
for(section = noisy)
if(section[0][2] < thickness)
section
]);
}
}

View File

@@ -0,0 +1,112 @@
use <bezier_curve.scad>;
use <shear.scad>;
use <along_with.scad>;
use <bezier_smooth.scad>;
use <fibonacci_lattice.scad>;
use <polyhedron_hull.scad>;
use <dragon_head.scad>;
use <dragon_scales.scad>;
use <dragon_foot.scad>;
dragon_and_perl();
module one_segment(body_r, body_fn, one_scale_data) {
// scales
rotate([-90, 0, 0])
dragon_body_scales(body_r, body_fn, one_scale_data);
// dorsal fin
translate([0, 3.2, -3])
rotate([-61, 0, 0])
shear(sy = [0, 2.25])
linear_extrude(3.25, scale = 0.3)
square([1.5, 10], center = true);
// belly
translate([0, -2.5, .8])
rotate([-5, 0, 0])
scale([1, 1, 1.4])
sphere(body_r * 0.966, $fn = 8);
}
module tail() {
$fn = 4;
tail_scales(75, 2.5, 4.25, -4, 1.25);
tail_scales(100, 1.25, 4.5, -7, 1);
tail_scales(110, 1.25, 3, -9, 1);
tail_scales(120, 2.5, 2, -9, 1);
}
module dragon_and_perl() {
function __angy_angz(p1, p2) =
let(
dx = p2.x - p1.x,
dy = p2.y - p1.y,
dz = p2.z - p1.z,
ya = atan2(dz, sqrt(pow(dx, 2) + pow(dy, 2))),
za = atan2(dy, dx)
) [ya, za];
body_path = bezier_curve(0.02, [
[0, 7.5, 15],
[0, 30, 0],
[-30, 50, -55],
[-50, 70, 0],
[20, 90, 60],
[50, 110, 0],
[0, 130, -30],
[-10, 150, 0],
[-5, 170, 0]
]);
leng_body_path = len(body_path);
angy_angz = __angy_angz(body_path[0], body_path[1]);
translate([1, 7, 14])
rotate([-135, 0, 3])
scale(1.15)
rotate([0, angy_angz[0], angy_angz[1]])
dragon_head();
body_r = 6;
body_fn = 12;
scale_fn = 4;
scale_tilt_a = 6;
one_body_scale_data = one_body_scale(body_r, body_fn, scale_fn, scale_tilt_a);
along_with(body_path, scale = [0.25, 0.25, 0.5], method = "EULER_ANGLE")
one_segment(body_r, body_fn, one_body_scale_data);
ayz = __angy_angz(body_path[leng_body_path - 2], body_path[leng_body_path - 1]);
translate(body_path[leng_body_path - 1])
rotate([0, ayz[0] + 82, ayz[1]])
mirror([0, 0, 1])
rotate(-12)
scale([0.3, 0.3, 0.6])
tail();
translate([-5, 25, -12.5])
rotate([-20, 0, -15])
foot();
translate([-10, 15, -6.5])
rotate([-60, 45, 25])
mirror([1, 0, 0])
foot();
translate([11.5, 107, -.5])
rotate([-10, 20, -50])
scale(0.65)
foot();
translate([7, 108, .25])
rotate([5, 20, 60])
rotate([10, -30, 0])
scale(0.65)
mirror([1, 0, 0])
foot();
translate([-27.5, 11.75, -14])
polyhedron_hull(fibonacci_lattice(66, 7));
}

View File

@@ -0,0 +1,42 @@
use <curve.scad>;
use <polyline2d.scad>;
use <ptf/ptf_rotate.scad>;
use <util/dedup.scad>;
module dragon_claw() {
pts = [
[0, 0.55], [1, 0.45], [2.5, 0.375], [6, 0.825], [8, -0.375],
[8, -0.375], [6, 1.875], [4, 1.6], [1.8, 2.5], [1.5, 2.8], [1.2, 3.3], [1.05, 3.8], [1, 4], [0, 8]
];
$fn = 16;
a = 360 / $fn;
x = 6.2 * cos(a);
y = 6.2 * sin(a);
path = [
[0, 0], [2.5, 0], [x, y], [x + 1, y + 1]
];
path2 = [
for(i = len(path) - 1; i > -1; i = i - 1)
ptf_rotate([path[i][0], -path[i][1]], a * 2)
];
t_step = 0.25;
claw_path_basic = concat(curve(t_step, path), curve(t_step, path2));
claw_path1 = [for(p = claw_path_basic) [p[0] * 1.15, p[1] * 1.1]];
claw_path2 = [for(p = claw_path_basic) ptf_rotate(p * 1.2, a * 2)];
claw_path3 = [for(p = claw_path_basic) ptf_rotate(p * 1.15, a * 4)];
claw_path4 = [for(p = claw_path_basic) ptf_rotate(p * 1.1, a * 6)];
claw_path5 = [for(p = claw_path_basic) ptf_rotate(p, a * 11)];
rotate(-15)
scale([1.15, 1.3, 1])
rotate(15)
intersection() {
rotate_extrude($fn = 7)
polygon(pts);
linear_extrude(5)
polygon(dedup(concat(claw_path1, claw_path2, claw_path3, claw_path4, [[-2, -.75], [-1.45, -1.45]], claw_path5, [[1.45, -1.45], [2, -.75]])));
}
}

View File

@@ -0,0 +1,44 @@
use <along_with.scad>;
use <dragon_scales.scad>;
use <dragon_claw.scad>;
module knee() {
$fn = 4;
scale([1,0.85, 1]) union() {
knee_scales(75, 2.5, 4.25, -4, 1.25);
knee_scales(100, 1.25, 4.5, -7, 1);
knee_scales(110, 1.25, 3, -9, 1);
knee_scales(120, 2.5, 2, -9, 1);
}
}
module foot() {
upper_arm_r = 3.6;
lower_arm_r = 2.7;
arm_fn = 6;
scale_fn = 4;
scale_tilt_a = 6;
upper_arm_path = [[.5, 1, 10], [1.25, 6.25, 11.25], [2, 11.5, 12.5], [2, 16.75, 13.75], [1.9, 20, 14.25]];
lower_arm_path = [[2, 22, 14], [3.5, 21, 10], [4.5, 20.3, 7]];
upper_arm_scale_data = one_body_scale(upper_arm_r, arm_fn, scale_fn, scale_tilt_a);
lower_arm_scale_data = one_body_scale(lower_arm_r, arm_fn, scale_fn, scale_tilt_a);
along_with(upper_arm_path, scale = 0.75, method = "EULER_ANGLE")
rotate([-90, 0, 0])
dragon_body_scales(upper_arm_r, arm_fn, upper_arm_scale_data);
along_with(lower_arm_path, scale = 0.7, method = "EULER_ANGLE")
rotate([-90, 0, 0])
dragon_body_scales(lower_arm_r, arm_fn, lower_arm_scale_data);
translate([2.25, 14.5, 12.75])
scale([0.7, 1.15, .8])
rotate([108, 9, 1])
knee();
translate([6.4, 18.95, .25])
rotate([11, 13, 185])
scale([1.2, 1.2, 1.2])
dragon_claw();
}

View File

@@ -0,0 +1,138 @@
use <ellipse_extrude.scad>;
use <curve.scad>;
use <sweep.scad>;
use <rails2sections.scad>;
use <shape_trapezium.scad>;
use <ptf/ptf_rotate.scad>;
module dragon_head() {
module hair() {
for(i = [16:36]) {
rotate(i * 10 + rands(0, 5, 1, i)[0])
translate([0, -13, 0])
rotate([8 + rands(0, 2, 1, i)[0], 0, 0])
linear_extrude(12 + rands(0, 5, 1, i)[0], scale = 0.05, twist = 50 - rands(0, 100, 1, seed = i)[0])
translate([0, 10, 0])
circle(3, $fn = 5);
}
for(i = [0:35]) {
rotate(i * 12 + rands(0, 5, 1, i)[0])
translate([0, -11.5, 0])
rotate([4 + rands(0, 2, 1, i)[0], 0, 0])
linear_extrude(14 + rands(0, 5, 1, i)[0], scale = 0.05, twist = 50 - rands(0, 100, 1, seed = i + 1)[0])
translate([0, 10, 0])
circle(3.5, $fn = 6);
}
for(i = [0:35]) {
rotate(i * 10)
translate([0, -10, 0])
rotate([2, 0, 0])
linear_extrude(16 + rands(0, 5, 1, i)[0], scale = 0.05, twist = 50 - rands(0, 100, 1, seed = i + 2)[0])
translate([0, 10, 0])
circle(3.5, $fn = 5);
}
}
module one_horn() {
translate([-9, -4, -2])
rotate([45, -25, 0])
linear_extrude(27.5, scale = 0.1, twist = -90)
translate([7.5, 0, 0])
circle(3, $fn = 4);
}
module mouth() {
path1 = curve(0.4, [[0, -8, -1], [0, -11, .25], [0, -12, 5], [0, -9, 5], [0, -4, 6], [0, -0.5, 8], [0, 5, 6.5], [0, 8, 6], [0, 12, 1], [0, 16, 0]]);
path2 = [for(p = path1) ptf_rotate(p, [0, -12, 0]) * 0.9 + [-2, 0, 0]];
path3 = [for(i = [0:len(path1) - 1]) [-i / 6 - 1.5, i / 1.65 - 9, 0]];
path4 = [for(p = path3) [-p[0], p[1], p[2]]];
path5 = [for(p = path2) [-p[0], p[1], p[2]]];
translate([0, 0, -2])
rotate([90, 0, -90])
sweep(rails2sections([path1, path2, path3, path4, path5]));
translate([0, 0, -3.25])
rotate([90, 0, -90])
ellipse_extrude(5.5, slices = 2)
polygon(
shape_trapezium([5, 18],
h = 20,
corner_r = 2, $fn = 4)
);
scale([1.5, 1, 1])
intersection() {
mirror([1, 0, 0])
translate([0, 0, -2.25])
rotate([85, 0, -90])
ellipse_extrude(4, slices = 2)
polygon(
shape_trapezium([5, 18],
h = 20,
corner_r = 2, $fn = 5)
);
jpath1 = curve(0.4, [[-10, 16], [0, 8], [4, 5], [3, 0], [2, -5], [2, -10], [0, -13.5], [-3, -14]]);
rotate([90, -4, 0])
linear_extrude(25, center = true)
polygon(jpath1);
}
translate([0, -2.5, -11])
rotate([0, 95, 0])
linear_extrude(1.4, scale = 0.1)
translate([.4, 0, 0])
circle(.5, $fn = 6);
translate([0, 2.5, -11])
rotate([0, 95, 0])
linear_extrude(1.5, scale = 0.1)
translate([.4, 0, 0])
circle(.5, $fn = 6);
}
module one_eye() {
translate([-5, 2.5, -2])
rotate([-5, -8, -10])
scale([1, 1, 1.75])
sphere(1.75, $fn = 6);
translate([-5.1, 3.75, -2.25])
rotate([-25, 0, 75])
sphere(0.65, $fn = 6);
}
module one_beard() {
translate([-10, -12, -10])
rotate(180)
linear_extrude(8, scale = 0.15, twist = 35)
translate([-9, -10, 0])
circle(1, $fn = 8);
}
// mouth();
rotate([0, 15, 0])
translate([0, 0, -25 / 2])
scale(1.15) {
scale([0.8, 0.9, 1]) hair();
translate([0, 0, 2])
{
rotate(-90) {
one_horn();
mirror([-1, 0, 0]) one_horn();
}
mouth();
one_eye();
mirror([0, 1, 0]) one_eye();
one_beard();
mirror([0, 1, 0]) one_beard();
}
}
}

View File

@@ -1,50 +1,8 @@
use <bezier_curve.scad>;
use <ellipse_extrude.scad>;
use <path_extrude.scad>;
use <shape_circle.scad>;
use <torus_knot.scad>;
use <util/reverse.scad>;
torus_knot_dragon();
module torus_knot_dragon() {
phi_step = 0.04;
knot = torus_knot(2, 3, phi_step);
dragon_body_path = reverse([for(i = [9:len(knot) - 3]) knot[i]]);
body_shape = concat(
bezier_curve(0.25,
[
[30, -35], [16, 0], [4, 13],
[3, -5], [0, 26], [-3, -5],
[-4, 13], [-16, 0], [-30, -35]
]
),
bezier_curve(0.25,
[[-22, -35], [-15, -45], [0, -55], [15, -45], [22, -35]]
)
);
pts = [for(p = body_shape) p * 0.015];
p = dragon_body_path[0];
path_extrude(pts, concat([p + [0.00001, 0.0000055, 0.000008]], dragon_body_path), scale = 0.9);
translate([2.975, -0.75, -0.75])
scale(0.01825)
rotate([-52, -9, -25])
dragon_head();
translate([1.84, 1.635, -0.885])
rotate([104.95, -154.35, 66.25])
ellipse_extrude(1.2, slices = 7, twist = 15)
scale(0.9 * 0.0150)
polygon(body_shape);
}
module dragon_head() {
module dragon_head_low_poly() {
module palate() {
t_step = 0.15;

Some files were not shown because too many files have changed in this diff Show More