1
0
mirror of https://github.com/JustinSDK/dotSCAD.git synced 2025-09-26 06:19:12 +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 GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007 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 Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. 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.** > **Reduce the burden of mathematics/algorithm when playing OpenSCAD.**
![dotSCAD](featured_img/TorusKnotMaze.JPG) ![dotSCAD](featured_img/TorusKnotDragon_and_Pearl.JPG)
[![license/LGPL](LICENSE.svg)](https://github.com/JustinSDK/lib-openscad/blob/master/LICENSE)
## Introduction ## 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. 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. 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) [![examples](examples/images/gallery.JPG)](examples#dogfooding-examples)
# API Documentation # API Reference
## 2D Module ## 2D Module
Signature | Description 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. [**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, p1Style, p2Style])](https://openhome.cc/eGossip/OpenSCAD/lib3x-line2d.html) | create a line from two points.
[**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, size, font, ...])](https://openhome.cc/eGossip/OpenSCAD/lib3x-multi_line_text.html) | create multi-line text from a list of strings.
[**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.
[**pie**(radius, angle)](https://openhome.cc/eGossip/OpenSCAD/lib3x-pie.html) | create polyline2de a pie (circular sector). [**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. [**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 ## 3D Module
Signature | Description 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). [**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).
[**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, p1Style, p2Style])](https://openhome.cc/eGossip/OpenSCAD/lib3x-line3d.html) | create a 3D line from two points.
[**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])](https://openhome.cc/eGossip/OpenSCAD/lib3x-loft.html) | develop a smooth skin between crosssections with different geometries.
[**loft**(sections, slices = 1)](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. [**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]`. [**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 = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-rounded_cube.html) | create a cube in the first octant. [**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 = 2, center = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-rounded_cylinder.html) | create a rounded cylinder. [**rounded_cylinder**(radius, h, round_r[, convexity, center])](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])](https://openhome.cc/eGossip/OpenSCAD/lib3x-sweep.html) | develop a smooth skin from crosssections with the same umber of sides.
[**sweep**(sections, triangles = "SOLID")](https://openhome.cc/eGossip/OpenSCAD/lib3x-sweep.html) | develop a smooth skin from crosssections with the same umber of sides.
## Transformation ## Transformation
Signature | Description 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. [**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 = 24)](https://openhome.cc/eGossip/OpenSCAD/lib3x-bend.html) | bend a 3D object. [**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. [**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 ## 2D Function
Signature | Description 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. [**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. [**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 = 0.0001)](https://openhome.cc/eGossip/OpenSCAD/lib3x-trim_shape.html) | trim a tangled-edge shape to a non-tangled 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 ## 2D/3D Function
Signature | Description Signature | Description
--|-- --|--
[**angle_between**(vt1, vt2)](https://openhome.cc/eGossip/OpenSCAD/lib3x-angle_between.html) | return the angle between two vectors. [**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. [**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 = 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. [**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 = 0.0001)](https://openhome.cc/eGossip/OpenSCAD/lib3x-in_polyline.html) | check whether a point is on a line. [**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 = 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. [**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.
[**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. [**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. [**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 ## Path
Signature | Description Signature | Description
--|-- --|--
[**arc_path**(radius, angle)](https://openhome.cc/eGossip/OpenSCAD/lib3x-arc_path.html) | create an arc path. [**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. [**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 = "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. [**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. [**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). [**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). [**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 = "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. [**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 = "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. [**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 = "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. [**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 = 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]]`. [**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). [**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 ## Extrusion
Signature | Description Signature | Description
--|-- --|--
[**bend_extrude**(size, thickness, angle, frags = 24)](https://openhome.cc/eGossip/OpenSCAD/lib3x-bend_extrude.html) | extrude and bend a 2D shape. [**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 = "delta", chamfer = false, ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-box_extrude.html) | create a box (container) from a 2D object. [**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 = 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. [**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 = 90, twist = 0, convexity = 10)](https://openhome.cc/eGossip/OpenSCAD/lib3x-rounded_extrude.html) | extrude a 2D object roundly 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. [**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 ## 2D Shape
Signature | Description 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_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_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_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_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 = 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_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_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_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_square**(size[, corner_r])](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_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 = 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_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 = 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_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 = 0)](https://openhome.cc/eGossip/OpenSCAD/lib3x-shape_trapezium.html) | return shape points of an isosceles trapezoid. [**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 ## 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. [**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. [**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. [**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. [**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 ## Util
@@ -163,13 +160,13 @@ These examples incubate dotSCAD and dotSCAD refactors these examples. See [examp
Signature | Description 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/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/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/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/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/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/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/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. [**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 Signature | Description
--|-- --|--
[**util/choose**(choices, seed)](https://openhome.cc/eGossip/OpenSCAD/lib3x-choose.html) | choose an element from the given list. [**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/rand**([min_value, max_value, seed_value])](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/shuffle**(lt[, seed])](https://openhome.cc/eGossip/OpenSCAD/lib3x-shuffle.html) | randomizes the order of the elements.
### util/string ### 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_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_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_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. [**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. [**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_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_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_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_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 = [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_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_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. [**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_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_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_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 = "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_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_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_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. [**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 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/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 = [0, 0, 0])](https://openhome.cc/eGossip/OpenSCAD/lib3x-footprints3.html) | a 3D verion of `footprint2`. [**turtle/footprints3**(cmds[, start])](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/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 = 1, heading = 0, ...)](https://openhome.cc/eGossip/OpenSCAD/lib3x-lsystem3.html) | 3D 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/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`. [**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 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_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_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 = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_contour.html) | return the contour which encircles the area. [**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 = 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_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 = 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_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_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_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 = 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_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_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_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_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. [**voxel/vx_union**(points1, points2)](https://openhome.cc/eGossip/OpenSCAD/lib3x-vx_union.html) | create a union of two lists of points.
## Part ## Part
Signature | Description 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/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 = 0.5, void = false, ends = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-connector_peg.html) | create a connector peg. [**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 = 0.5, center = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-joint_T.html) | create a joint_T for rotatable models. [**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 ## Surface
Signature | Description 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_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 = 360, twist = 0, invert = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_ring.html) | turn a photo into a ring. [**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 = "SLASH")](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_solidify.html) | solidify two square surfaces. [**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 = [180, 360], invert = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_sphere.html) | map a photo onto a sphere. [**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 = 0, y_twist = 0, invert = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_square.html) | turn a photo into a twistable square. [**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 = [360, 360], twist = 0, invert = false)](https://openhome.cc/eGossip/OpenSCAD/lib3x-sf_torus.html) | turn a photo to a torus. [**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_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_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. [**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 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_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 = 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_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 = 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_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 = 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_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 = 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_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 = 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_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 = 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_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 = 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_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 = 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_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 = 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_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 = 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_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 ## Voronoi
Signature | Description 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_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_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 = 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_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 = 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/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 = 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_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 = 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/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 ## Maze
Signature | Description 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_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_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_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_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_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 = [0, 0], seed = undef)](https://openhome.cc/eGossip/OpenSCAD/lib3x-mz_theta_cells.html) | return cell data of a theta 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. [**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/). > 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 # v3.1
## Deprecated: ## 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]) scale([2, 1])
circle(1.25, $fn = 24); circle(1.25, $fn = 24);
} }
rotate([90, 0, 0])
for(a = [0:30:330]) { for(a = [0:30:330]) {
rotate(a) rotate(a)
translate([5, 0, 0]) 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 ## Examples
use <arc_path.scad>; use <arc_path.scad>;
use <hull_polyline2d.scad>; use <polyline_join.scad>;
$fn = 24; $fn = 24;
points = arc_path(radius = 20, angle = [45, 290]); points = arc_path(radius = 20, angle = [45, 290]);
hull_polyline2d(points, width = 2); polyline_join(points) circle(1);
![arc_path](images/lib3x-arc_path-1.JPG) ![arc_path](images/lib3x-arc_path-1.JPG)
use <arc_path.scad>; use <arc_path.scad>;
use <hull_polyline2d.scad>; use <polyline_join.scad>;
$fn = 24; $fn = 24;
points = arc_path(radius = 20, angle = 135); 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) ![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) ![archimedean_spiral](images/lib3x-archimedean_spiral-2.JPG)
include <archimedean_spiral.scad>; use <archimedean_spiral.scad>;
t = "3.141592653589793238462643383279502884197169399375105820974944592307816406286"; 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]) { for(i = [0: len(points) - 1]) {
translate(points[i][0]) translate(points[i].x)
rotate(points[i][1] + 90) rotate(points[i].y + 90)
text(t[i], valign = "center", halign = "center"); 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 ## Examples
use <bauer_spiral.scad>; use <bauer_spiral.scad>;
use <hull_polyline3d.scad>; use <polyline_join.scad>;
n = 200; n = 200;
radius = 20; radius = 20;
@@ -26,7 +26,7 @@ Creates visually even spacing of n points on the surface of the sphere. Successi
sphere(1, $fn = 24); sphere(1, $fn = 24);
} }
hull_polyline3d(pts, 1); polyline_join(pts) sphere(.5);
![bauer_spiral](images/lib3x-bauer_spiral-1.JPG) ![bauer_spiral](images/lib3x-bauer_spiral-1.JPG)

View File

@@ -1,6 +1,6 @@
# bezier_curve # 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 ## Parameters
@@ -9,13 +9,13 @@ Given a set of control points, the `bezier_curve` function returns points of the
## Examples ## 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>; use <bezier_curve.scad>;
t_step = 0.05; t_step = 0.05;
width = 2; radius = 2;
p0 = [0, 0, 0]; p0 = [0, 0, 0];
p1 = [40, 60, 35]; 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] [p0, p1, p2, p3]
); );
hull_polyline3d(points, width); polyline_join(points)
sphere(radius);
![bezier_curve](images/lib3x-bezier_curve-1.JPG) ![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 ## Examples
use <hull_polyline3d.scad>; use <polyline_join.scad>;
use <bezier_smooth.scad>; use <bezier_smooth.scad>;
width = 2; width = 2;
@@ -25,15 +25,15 @@ Given a path, the `bezier_smooth` function uses bazier curves to smooth all corn
[-10, -10, 50] [-10, -10, 50]
]; ];
hull_polyline3d( polyline_join(path_pts)
path_pts, width sphere(width / 2);
);
smoothed_path_pts = bezier_smooth(path_pts, round_d); smoothed_path_pts = bezier_smooth(path_pts, round_d);
color("red") translate([30, 0, 0]) hull_polyline3d( color("red")
smoothed_path_pts, width translate([30, 0, 0])
); polyline_join(smoothed_path_pts)
sphere(width / 2);
![bezier_smooth](images/lib3x-bezier_smooth-1.JPG) ![bezier_smooth](images/lib3x-bezier_smooth-1.JPG)

View File

@@ -1,6 +1,6 @@
# bspline_curve # 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 **Since:** 2.1

View File

@@ -11,7 +11,7 @@ Computes contour polygons by applying [marching squares](https://en.wikipedia.or
## Examples ## Examples
use <hull_polyline2d.scad>; use <polyline_join.scad>;
use <surface/sf_thicken.scad>; use <surface/sf_thicken.scad>;
use <contours.scad>; use <contours.scad>;
@@ -36,7 +36,8 @@ Computes contour polygons by applying [marching squares](https://en.wikipedia.or
translate([0, 0, z]) translate([0, 0, z])
linear_extrude(1) linear_extrude(1)
for(isoline = contours(points, z)) { 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 ## Examples
use <curve.scad>; use <curve.scad>;
use <hull_polyline3d.scad>; use <polyline_join.scad>;
pts = [ pts = [
[28, 2, 1], [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; tightness = 0;
points = curve(t_step, pts, tightness); points = curve(t_step, pts, tightness);
hull_polyline3d(points, 1); polyline_join(points)
sphere(.5);
#for(pt = pts) { #for(pt = pts) {
translate(pt) translate(pt)
sphere(1); sphere(1);
} }
#hull_polyline3d(pts, .1); #polyline_join(pts)
sphere(.05);
![curve](images/lib3x-curve-3.JPG) ![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) ![fibonacci_lattice](images/lib3x-fibonacci_lattice-1.JPG)
use <fibonacci_lattice.scad>; use <fibonacci_lattice.scad>;
use <hull_polyline3d.scad>; use <polyline_join.scad>;
n = 200; n = 200;
radius = 20; radius = 20;
@@ -49,7 +49,8 @@ Creates visually even spacing of n points on the surface of the sphere. Nearest-
]; ];
for(spiral = spirals) { for(spiral = spirals) {
hull_polyline3d(spiral, 1); polyline_join(spiral)
sphere(.5);
} }
![fibonacci_lattice](images/lib3x-fibonacci_lattice-2.JPG) ![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 ## Examples
use <polyline2d.scad>; use <polyline_join.scad>;
use <turtle/footprints2.scad>; use <turtle/footprints2.scad>;
function arc_cmds(radius, angle, steps) = 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) ![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 ## Examples
use <hull_polyline3d.scad>; use <polyline_join.scad>;
use <turtle/footprints3.scad>; use <turtle/footprints3.scad>;
function xy_arc_cmds(radius, angle, steps) = 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) ![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 ## Parameters
- `map` : The original map. - `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. - `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. - `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 ## Parameters
- `map` : The original map. - `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. - `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. - `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 ## Parameters
- `map` : The original map. - `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 ## Examples

View File

@@ -14,7 +14,7 @@ Gets all points on the path of a spiral around a cylinder. Its `$fa`, `$fs` and
## Examples ## Examples
use <helix.scad>; use <helix.scad>;
use <hull_polyline3d.scad>; use <polyline_join.scad>;
$fn = 12; $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); translate(p) sphere(5);
} }
hull_polyline3d(points, 2); polyline_join(points)
sphere(1);
![helix](images/lib3x-helix-1.JPG) ![helix](images/lib3x-helix-1.JPG)
use <helix.scad>; use <helix.scad>;
use <hull_polyline3d.scad>; use <polyline_join.scad>;
$fn = 12; $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" rt_dir = "CLK"
); );
hull_polyline3d(points, 2); polyline_join(points)
sphere(1);
%cylinder(h = 100, r1 = 40, r2 = 20); %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 ## Examples
use <shape_starburst.scad>; use <shape_star.scad>;
use <shape_circle.scad>; use <shape_circle.scad>;
use <ptf/ptf_rotate.scad>; use <ptf/ptf_rotate.scad>;
use <loft.scad>; use <loft.scad>;
@@ -19,7 +19,7 @@ When having uniform cross sections, you can use [sweep](https://openhome.cc/eGos
sects = [ sects = [
for(i = 10; i >= 4; i = i - 1) 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); loft(sects, slices = 3);
@@ -28,16 +28,16 @@ When having uniform cross sections, you can use [sweep](https://openhome.cc/eGos
difference() { difference() {
loft( loft(
[ [
[for(p = shape_circle(10, $fn = 3)) [p[0], p[1], 15]], [for(p = shape_circle(10, $fn = 3)) [p.x, p.y, 15]],
[for(p = shape_circle(15, $fn = 24)) [p[0], p[1], 0]] [for(p = shape_circle(15, $fn = 24)) [p.x, p.y, 0]]
], ],
slices = 4 slices = 4
); );
loft( loft(
[ [
[for(p = shape_circle(8, $fn = 3)) [p[0], p[1], 15.1]], [for(p = shape_circle(8, $fn = 3)) [p.x, p.y, 15.1]],
[for(p = shape_circle(13, $fn = 24)) [p[0], p[1], -0.1]] [for(p = shape_circle(13, $fn = 24)) [p.x, p.y, -0.1]]
], ],
slices = 4 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. [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 <turtle/lsystem3.scad>;
use <hull_polyline3d.scad>; use <polyline_join.scad>;
for(line = hilbert_curve()) { for(line = hilbert_curve()) {
hull_polyline3d( polyline_join([line[0], line[1]])
[line[0], line[1]], sphere(.25, $fn = 4);
thickness = 0.5,
$fn = 4
);
} }
function hilbert_curve(n = 3, angle = 90, leng = 1, heading = 0, start = [0, 0, 0]) = function hilbert_curve(n = 3, angle = 90, leng = 1, heading = 0, start = [0, 0, 0]) =
@@ -60,14 +57,11 @@
// a stochastic L-system // a stochastic L-system
use <turtle/lsystem3.scad>; use <turtle/lsystem3.scad>;
use <hull_polyline3d.scad>; use <polyline_join.scad>;
for(line = vine()) { for(line = vine()) {
hull_polyline3d( polyline_join([line[0], line[1]])
[line[0], line[1]], sphere(.25, $fn = 4);
thickness = 0.5,
$fn = 4
);
} }
function vine(n = 3, angle = 18, leng = 1, heading = 0, start = [0, 0, 0]) = 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 ## Examples
use <hull_polyline2d.scad>; use <polyline_join.scad>;
use <shape_taiwan.scad>; use <shape_taiwan.scad>;
use <midpt_smooth.scad>; use <midpt_smooth.scad>;
taiwan = shape_taiwan(50); taiwan = shape_taiwan(50);
smoothed = midpt_smooth(taiwan, 20, true); smoothed = midpt_smooth(taiwan, 20, true);
translate([0, 0, 0]) hull_polyline2d(taiwan, .25); translate([0, 0, 0]) polyline_join(taiwan) circle(.125);
#translate([10, 0, 0]) hull_polyline2d(smoothed, .25); #translate([10, 0, 0]) polyline_join(smoothed) circle(.125);
![midpt_smooth](images/lib3x-midpt_smooth-1.JPG) ![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 ## Examples
use <maze/mz_hamiltonian.scad>; use <maze/mz_hamiltonian.scad>;
use <hull_polyline2d.scad>; use <polyline_join.scad>;
rows = 5; rows = 5;
columns = 10; columns = 10;
path = mz_hamiltonian(rows, columns, [0, 0]); path = mz_hamiltonian(rows, columns, [0, 0]);
hull_polyline2d(path, .5); polyline_join(path)
circle(.25);
![mz_hamiltonian](images/lib3x-mz_hamiltonian-1.JPG) ![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_square_cells.scad>;
use <maze/mz_hex_walls.scad>; use <maze/mz_hex_walls.scad>;
use <hull_polyline2d.scad>; use <polyline_join.scad>;
rows = 10; rows = 10;
columns = 12; 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); walls = mz_hex_walls(cells, rows, columns, cell_width);
for(wall = walls) { 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) ![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 ## Examples
use <maze/mz_theta_cells.scad>; use <maze/mz_theta_cells.scad>;
use <hull_polyline2d.scad>; use <polyline_join.scad>;
rows = 8; rows = 8;
beginning_number = 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); outerVt2 = vt_from_angle(theta2, outerR);
if(type == INWARD_WALL || type == INWARD_CCW_WALL) { 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) { 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]) { for(theta = [0:thetaStep:360 - thetaStep]) {
vt1 = vt_from_angle(theta, r); vt1 = vt_from_angle(theta, r);
vt2 = vt_from_angle(theta + thetaStep, 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) ![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_cells.scad>;
use <maze/mz_theta_get.scad>; use <maze/mz_theta_get.scad>;
use <hull_polyline2d.scad>; use <polyline_join.scad>;
rows = 8; rows = 8;
beginning_number = 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); outerVt2 = vt_from_angle(theta2, outerR);
if(type == "INWARD_WALL" || type == "INWARD_CCW_WALL") { 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") { 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]) { for(theta = [0:thetaStep:360 - thetaStep]) {
vt1 = vt_from_angle(theta, r); vt1 = vt_from_angle(theta, r);
vt2 = vt_from_angle(theta + thetaStep, 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) ![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]; feature_points = [for(pt_angle = pts_angles) pt_angle[0] + half_size];
noised = [ noised = [
for(y = [0:size[1] - 1]) for(y = [0:size.y - 1])
for(x = [0:size[0] - 1]) for(x = [0:size.x - 1])
[x, y, nz_cell(feature_points, [x, y])] [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 ## Examples
use <hull_polyline2d.scad>; use <polyline_join.scad>;
use <util/rand.scad>; use <util/rand.scad>;
use <noise/nz_perlin1.scad>; use <noise/nz_perlin1.scad>;
seed = rand(); seed = rand();
hull_polyline2d( polyline_join([for(x = [0:.1:10]) [x, nz_perlin1(x, seed)]])
[for(x = [0:.1:10]) [x, nz_perlin1(x, seed)]], width = .1 circle(.05);
);
![nz_perlin1](images/lib3x-nz_perlin1-1.JPG) ![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 ## Examples
use <hull_polyline2d.scad>; use <polyline_join.scad>;
use <noise/nz_perlin1s.scad>; use <noise/nz_perlin1s.scad>;
xs = [for(x = [0:.1:10]) x]; xs = [for(x = [0:.1:10]) x];
ys = nz_perlin1s(xs); ys = nz_perlin1s(xs);
points = [for(i = [0:len(xs) - 1]) [xs[i], ys[i]]]; 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) ![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 ## Examples
use <util/rand.scad>; use <util/rand.scad>;
use <hull_polyline2d.scad>; use <polyline_join.scad>;
use <surface/sf_thicken.scad>; use <surface/sf_thicken.scad>;
use <noise/nz_perlin2.scad>; use <noise/nz_perlin2.scad>;
use <contours.scad>; use <contours.scad>;
@@ -31,7 +31,8 @@ Returns the 2D [Perlin noise](https://en.wikipedia.org/wiki/Perlin_noise) value
translate([11, 0]) translate([11, 0])
for(isoline = contours(points, 0)) { for(isoline = contours(points, 0)) {
hull_polyline2d(isoline, width = .1); polyline_join(isoline)
circle(.05);
} }
![nz_perlin2](images/lib3x-nz_perlin2-1.JPG) ![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; seed = 51;
points = [ points = [
for(y = [0:size[1] - 1]) for(y = [0:size.y - 1])
for(x = [0:size[0] - 1]) for(x = [0:size.x - 1])
[x, y] [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]]); max_dist = max([for(c = cells) c[2]]);
for(i = [0:len(cells) - 1]) { 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; seed = 51;
points = [ points = [
for(y = [0:size[1] - 1]) for(y = [0:size.y - 1])
for(x = [0:size[0] - 1]) for(x = [0:size.x - 1])
[x, y] [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); 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]]); max_dist = max([for(c = cells) c[3]]);
for(i = [0:len(cells) - 1]) { 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 <voxel/vx_sphere.scad>;
use <noise/nz_worley3s.scad>; use <noise/nz_worley3s.scad>;
tile_w = 10; grid_w = 10;
dist = "euclidean"; // [euclidean, manhattan, chebyshev, border] dist = "euclidean"; // [euclidean, manhattan, chebyshev, border]
seed = 51; seed = 51;
points = vx_sphere(20); 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]) { for(i = [0:len(cells) - 1]) {
c = (norm([cells[i][0], cells[i][1], cells[i][2]]) % 20) / 20; 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 ## Examples
use <hull_polyline3d.scad>; use <polyline_join.scad>;
use <shape_taiwan.scad>; use <shape_taiwan.scad>;
use <path_scaling_sections.scad>; use <path_scaling_sections.scad>;
use <sweep.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] fst_pt + [0, 0, 60]
]; ];
#hull_polyline3d(edge_path); #polyline_join(edge_path)
sphere(.5);
sweep(path_scaling_sections(taiwan, edge_path)); sweep(path_scaling_sections(taiwan, edge_path));
![path_scaling_sections](images/lib3x-path_scaling_sections-1.JPG) ![path_scaling_sections](images/lib3x-path_scaling_sections-1.JPG)
use <hull_polyline3d.scad>; use <polyline_join.scad>;
use <shape_taiwan.scad>; use <shape_taiwan.scad>;
use <path_scaling_sections.scad>; use <path_scaling_sections.scad>;
use <sweep.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] fst_pt + [0, 0, 60]
]); ]);
#hull_polyline3d(edge_path); #polyline_join(edge_path)
sphere(.5);
sweep(path_scaling_sections(taiwan, edge_path)); sweep(path_scaling_sections(taiwan, edge_path));
![path_scaling_sections](images/lib3x-path_scaling_sections-2.JPG) ![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 <path_scaling_sections.scad>;
use <sweep.scad>; use <sweep.scad>;
use <bezier_curve.scad>; use <bezier_curve.scad>;
use <rotate_p.scad>; use <ptf/ptf_rotate.scad>;
taiwan = shape_taiwan(100); taiwan = shape_taiwan(100);
fst_pt = [13, 0, 0]; 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(i = [0:leng - 1])
[ [
for(p = sections[i]) 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) ![path_scaling_sections](images/lib3x-path_scaling_sections-3.JPG)
use <hull_polyline3d.scad>; use <polyline_join.scad>;
use <shape_taiwan.scad>; use <shape_taiwan.scad>;
use <path_scaling_sections.scad>; use <path_scaling_sections.scad>;
use <sweep.scad>; use <sweep.scad>;
use <rotate_p.scad>; use <ptf/ptf_rotate.scad>;
taiwan = shape_taiwan(100); 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]); a = atan2(fst_pt[1], fst_pt[0]);
edge_path = [ edge_path = [
fst_pt, fst_pt,
fst_pt + rotate_p([0, 0, 10], a), fst_pt + ptf_rotate([0, 0, 10], a),
fst_pt + rotate_p([10, 0, 20], a), fst_pt + ptf_rotate([10, 0, 20], a),
fst_pt + rotate_p([8, 0, 30], a), fst_pt + ptf_rotate([8, 0, 30], a),
fst_pt + rotate_p([10, 0, 40], a), fst_pt + ptf_rotate([10, 0, 40], a),
fst_pt + rotate_p([0, 0, 50], a), fst_pt + ptf_rotate([0, 0, 50], a),
fst_pt + rotate_p([0, 0, 60], 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)); sweep(path_scaling_sections(taiwan, edge_path));
![path_scaling_sections](images/lib3x-path_scaling_sections-4.JPG) ![path_scaling_sections](images/lib3x-path_scaling_sections-4.JPG)

View File

@@ -11,7 +11,7 @@ You paths should be indexed count-clockwisely.
## Examples ## Examples
use <paths2sections.scad>; use <paths2sections.scad>;
use <hull_polyline3d.scad>; use <polyline_join.scad>;
use <sweep.scad>; use <sweep.scad>;
paths = [ paths = [
@@ -26,14 +26,15 @@ You paths should be indexed count-clockwisely.
sweep(sections); sweep(sections);
#for(path = paths) { #for(path = paths) {
hull_polyline3d(path, 0.5); polyline_join(path)
sphere(.25);
} }
![paths2sections](images/lib3x-paths2sections-1.JPG) ![paths2sections](images/lib3x-paths2sections-1.JPG)
use <bezier_curve.scad>; use <bezier_curve.scad>;
use <paths2sections.scad>; use <paths2sections.scad>;
use <hull_polyline3d.scad>; use <polyline_join.scad>;
use <sweep.scad>; use <sweep.scad>;
t_step = 0.05; t_step = 0.05;
@@ -59,7 +60,8 @@ You paths should be indexed count-clockwisely.
sweep(sections); sweep(sections);
#for(path = paths) { #for(path = paths) {
hull_polyline3d(path, 0.5); polyline_join(path)
sphere(.25);
} }
![paths2sections](images/lib3x-paths2sections-2.JPG) ![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 ## Examples
use <hull_polyline3d.scad>; use <polyline_join.scad>;
use <ptf/ptf_circle.scad>; use <ptf/ptf_circle.scad>;
size = [10, 10]; size = [10, 10];
rows = [ rows = [
for(y = [0:size[1]]) for(y = [0:size.y])
[for(x = [0:size[0]]) [x, y]] [for(x = [0:size.x]) [x, y]]
]; ];
columns = [ columns = [
for(x = [0:size[0]]) for(x = [0:size.x])
[for(y = [0:size[1]]) [x, y]] [for(y = [0:size.y]) [x, y]]
]; ];
for(line = rows) { for(line = rows) {
transformed = [for(p = line) ptf_circle(size, p)]; transformed = [for(p = line) ptf_circle(size, p)];
hull_polyline3d(transformed, thickness = .1); polyline_join(transformed)
sphere(.05);
} }
for(line = columns) { for(line = columns) {
transformed = [for(p = line) ptf_circle(size, p)]; 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) ![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 ## Examples
use <hull_polyline3d.scad>; use <polyline_join.scad>;
use <ptf/ptf_ring.scad>; use <ptf/ptf_ring.scad>;
size = [20, 10]; size = [20, 10];
radius = 5; radius = 5;
rows = [ rows = [
for(y = [0:size[1]]) for(y = [0:size.y])
[for(x = [0:size[0]]) [x, y]] [for(x = [0:size.x]) [x, y]]
]; ];
columns = [ columns = [
for(x = [0:size[0]]) for(x = [0:size.x])
[for(y = [0:size[1]]) [x, y]] [for(y = [0:size.y]) [x, y]]
]; ];
for(line = rows) { for(line = rows) {
transformed = [for(p = line) ptf_ring(size, p, radius, 360, 180)]; transformed = [for(p = line) ptf_ring(size, p, radius, 360, 180)];
hull_polyline3d(transformed, thickness = .5); polyline_join(transformed)
sphere(.25);
} }
for(line = columns) { for(line = columns) {
transformed = [for(p = line) ptf_ring(size, p, radius, 360, 180)]; 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) ![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); sphere(1);
} }
![ptf_rotate](images/lib3x-rotate_p-1.JPG) ![ptf_rotate](images/lib3x-ptf_rotate-1.JPG)
use <ptf/ptf_rotate.scad>; 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); %sphere(radius);
![ptf_rotate](images/lib3x-rotate_p-2.JPG) ![ptf_rotate](images/lib3x-ptf_rotate-2.JPG)
use <ptf/ptf_rotate.scad>; 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); 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 ## Examples
use <hull_polyline3d.scad>; use <polyline_join.scad>;
use <ptf/ptf_sphere.scad>; use <ptf/ptf_sphere.scad>;
size = [20, 10]; 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]; angle = [180, 270];
rows = [ rows = [
for(y = [0:size[1]]) for(y = [0:size.y])
[for(x = [0:size[0]]) [x, y]] [for(x = [0:size.x]) [x, y]]
]; ];
columns = [ columns = [
for(x = [0:size[0]]) for(x = [0:size.x])
[for(y = [0:size[1]]) [x, y]] [for(y = [0:size.y]) [x, y]]
]; ];
for(line = rows) { for(line = rows) {
transformed = [for(p = line) ptf_sphere(size, p, radius, angle)]; transformed = [for(p = line) ptf_sphere(size, p, radius, angle)];
hull_polyline3d(transformed, thickness = .5); polyline_join(transformed)
sphere(.25);
} }
for(line = columns) { for(line = columns) {
transformed = [for(p = line) ptf_sphere(size, p, radius, angle)]; 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) ![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 ## Examples
use <hull_polyline3d.scad>; use <polyline_join.scad>;
use <ptf/ptf_torus.scad>; use <ptf/ptf_torus.scad>;
size = [20, 10]; 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; twist = 90;
rows = [ rows = [
for(y = [0:size[1]]) for(y = [0:size.y])
[for(x = [0:size[0]]) [x, y]] [for(x = [0:size.x]) [x, y]]
]; ];
columns = [ columns = [
for(x = [0:size[0]]) for(x = [0:size.x])
[for(y = [0:size[1]]) [x, y]] [for(y = [0:size.y]) [x, y]]
]; ];
for(line = rows) { for(line = rows) {
transformed = [for(p = line) ptf_torus(size, p, radius, angle, twist)]; transformed = [for(p = line) ptf_torus(size, p, radius, angle, twist)];
hull_polyline3d(transformed, thickness = .5); polyline_join(transformed)
sphere(.25);
} }
for(line = columns) { for(line = columns) {
transformed = [for(p = line) ptf_torus(size, p, radius, angle, twist)]; 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) ![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 ## Examples
use <hull_polyline3d.scad>; use <polyline_join.scad>;
use <ptf/ptf_x_twist.scad>; use <ptf/ptf_x_twist.scad>;
size = [20, 10]; size = [20, 10];
rows = [ rows = [
for(y = [0:size[1]]) for(y = [0:size.y])
[for(x = [0:size[0]]) [x, y]] [for(x = [0:size.x]) [x, y]]
]; ];
columns = [ columns = [
for(x = [0:size[0]]) for(x = [0:size.x])
[for(y = [0:size[1]]) [x, y]] [for(y = [0:size.y]) [x, y]]
]; ];
for(line = rows) { for(line = rows) {
twisted = [for(p = line) ptf_x_twist(size, p, 90)]; twisted = [for(p = line) ptf_x_twist(size, p, 90)];
hull_polyline3d(twisted, thickness = .1); polyline_join(twisted)
sphere(.05);
} }
for(line = columns) { for(line = columns) {
twisted = [for(p = line) ptf_x_twist(size, p, 90)]; 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) ![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 ## Examples
use <hull_polyline3d.scad>; use <polyline_join.scad>;
use <ptf/ptf_y_twist.scad>; use <ptf/ptf_y_twist.scad>;
size = [10, 20]; size = [10, 20];
rows = [ rows = [
for(y = [0:size[1]]) for(y = [0:size.y])
[for(x = [0:size[0]]) [x, y]] [for(x = [0:size.x]) [x, y]]
]; ];
columns = [ columns = [
for(x = [0:size[0]]) for(x = [0:size.x])
[for(y = [0:size[1]]) [x, y]] [for(y = [0:size.y]) [x, y]]
]; ];
for(line = rows) { for(line = rows) {
twisted = [for(p = line) ptf_y_twist(size, p, 90)]; twisted = [for(p = line) ptf_y_twist(size, p, 90)];
hull_polyline3d(twisted, thickness = .1); polyline_join(twisted)
sphere(.05);
} }
for(line = columns) { for(line = columns) {
twisted = [for(p = line) ptf_y_twist(size, p, 90)]; 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) ![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 ## Examples
use <hull_polyline3d.scad>; use <polyline_join.scad>;
use <bezier_curve.scad>; use <bezier_curve.scad>;
use <surface/sf_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); 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)]; points = [for(i = [0:50]) rands(-300, 300, 2)];
triangles = tri_delaunay(points); triangles = tri_delaunay(points);
pts = [for(p = points) [p[0], p[1], rands(100, 150, 1)[0]]]; pts = [for(p = points) [p.x, p.y, rands(100, 150, 1)[0]]];
pts2 = [for(p = pts) [p[0], p[1], p[2] - 100]]; pts2 = [for(p = pts) [p.x, p.y, p.z - 100]];
sf_solidifyT(pts, pts2, triangles = triangles); sf_solidifyT(pts, pts2, triangles = triangles);
@@ -45,8 +45,8 @@ It solidifies two surfaces with triangular mesh.
[x, y] [x, y]
]; ];
points1 = [for(p = pts2d) scale * [p[0], p[1], f(p[0], p[1])]]; points1 = [for(p = pts2d) scale * [p.x, p.y, f(p.x, p.y)]];
points2 = [for(p = points1) [p[0], p[1], p[2] - scale * thickness]]; points2 = [for(p = points1) [p.x, p.y, p.z - scale * thickness]];
triangles = tri_delaunay(pts2d); 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 ## Examples
use <hull_polyline3d.scad>; use <polyline_join.scad>;
use <sphere_spiral.scad>; use <sphere_spiral.scad>;
points_angles = sphere_spiral( 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 end_angle = 90
); );
hull_polyline3d([for(pa = points_angles) pa[0]], 1); polyline_join([for(pa = points_angles) pa[0]])
sphere(.5);
%sphere(40); %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) ![sphere_spiral](images/lib3x-sphere_spiral-5.JPG)
use <hull_polyline3d.scad>; use <polyline_join.scad>;
use <sphere_spiral.scad>; use <sphere_spiral.scad>;
points_angles = sphere_spiral( 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]) { for(a = [0:30:360]) {
rotate(a) 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) ![sphere_spiral](images/lib3x-sphere_spiral-6.JPG)

View File

@@ -40,7 +40,7 @@ The indexes of the above triangles is:
## Examples ## Examples
use <rotate_p.scad>; use <ptf/ptf_rotate.scad>;
use <sweep.scad>; use <sweep.scad>;
section1 = [ section1 = [
@@ -55,8 +55,8 @@ The indexes of the above triangles is:
for(i = [0:55]) for(i = [0:55])
[ [
for(p = section1) for(p = section1)
let(pt = rotate_p(p, [90, 0, 10 * i])) let(pt = ptf_rotate(p, [90, 0, 10 * i]))
[pt[0], pt[1] , pt[2] + 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) ![sweep](images/lib3x-sweep-7.JPG)
use <rotate_p.scad>; use <ptf/ptf_rotate.scad>;
use <sweep.scad>; use <sweep.scad>;
section1 = [ section1 = [
@@ -85,8 +85,8 @@ The indexes of the above triangles is:
for(i = [0:55]) for(i = [0:55])
[ [
for(p = section1) for(p = section1)
let(pt = rotate_p(p, [90, 0, 10 * i])) let(pt = ptf_rotate(p, [90, 0, 10 * i]))
[pt[0], pt[1] , pt[2] + 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) ![sweep](images/lib3x-sweep-8.JPG)
use <rotate_p.scad>; use <ptf/ptf_rotate.scad>;
use <sweep.scad>; use <sweep.scad>;
section1 = [ section1 = [
@@ -113,8 +113,8 @@ The indexes of the above triangles is:
for(i = [0:55]) for(i = [0:55])
[ [
for(p = section1) for(p = section1)
let(pt = rotate_p(p, [90, 0, 10 * i])) let(pt = ptf_rotate(p, [90, 0, 10 * i]))
[pt[0], pt[1] , pt[2] + 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) ![t2d](images/lib3x-t2d-1.JPG)
use <hull_polyline2d.scad>; use <polyline_join.scad>;
use <turtle/t2d.scad>; use <turtle/t2d.scad>;
side_leng = 100; side_leng = 100;
@@ -100,10 +100,8 @@ The code below creates the same drawing.
["forward", side_leng] ["forward", side_leng]
]); ]);
hull_polyline2d( polyline_join([for(turtle = [t, t2, t3, t]) t2d(turtle, "point")])
[for(turtle = [t, t2, t3, t]) t2d(turtle, "point")], circle(thickness / 2);
thickness
);
} }
module sierpinski_triangle(t, side_leng, min_leng, thickness) { 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 ## Examples
use <turtle/t3d.scad>; use <turtle/t3d.scad>;
use <hull_polyline3d.scad>; use <polyline_join.scad>;
leng = 10; leng = 10;
angle = 120; angle = 120;
@@ -37,10 +37,9 @@ For more details, please see [3D turtle graphics](https://openhome.cc/eGossip/Op
["xforward", leng] ["xforward", leng]
]); ]);
hull_polyline3d( polyline_join(
[for(turtle = [t, t2, t3, t4]) t3d(turtle, "point")], [for(turtle = [t, t2, t3, t4]) t3d(turtle, "point")]
thickness ) sphere(thickness / 2);
);
![t3d](images/lib3x-t3d-1.JPG) ![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 ## Examples
use <triangle/tri_delaunay.scad>; use <triangle/tri_delaunay.scad>;
use <hull_polyline2d.scad>; use <polyline_join.scad>;
points = [for(i = [0:20]) rands(-100, 100, 2)]; 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") color("red")
linear_extrude(3) linear_extrude(3)
for(t = tri_delaunay(points, ret = "VORONOI_CELLS")) { 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) ![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_indices.scad>;
use <triangle/tri_delaunay_shapes.scad>; use <triangle/tri_delaunay_shapes.scad>;
use <triangle/tri_delaunay_voronoi.scad>; use <triangle/tri_delaunay_voronoi.scad>;
use <hull_polyline2d.scad>; use <polyline_join.scad>;
points = [for(i = [0:20]) rands(-100, 100, 2)]; 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") color("red")
linear_extrude(3) linear_extrude(3)
for(t = tri_delaunay_voronoi(delaunay)) { 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) ![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_indices.scad>;
use <triangle/tri_delaunay_shapes.scad>; use <triangle/tri_delaunay_shapes.scad>;
use <triangle/tri_delaunay_voronoi.scad>; use <triangle/tri_delaunay_voronoi.scad>;
use <hull_polyline2d.scad>; use <polyline_join.scad>;
points = [for(i = [0:20]) rands(-100, 100, 2)]; 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") color("red")
linear_extrude(3) linear_extrude(3)
for(t = tri_delaunay_voronoi(delaunay)) { 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) ![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_indices.scad>;
use <triangle/tri_delaunay_shapes.scad>; use <triangle/tri_delaunay_shapes.scad>;
use <triangle/tri_delaunay_voronoi.scad>; use <triangle/tri_delaunay_voronoi.scad>;
use <hull_polyline2d.scad>; use <polyline_join.scad>;
points = [for(i = [0:20]) rands(-100, 100, 2)]; 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") color("red")
linear_extrude(3) linear_extrude(3)
for(t = tri_delaunay_voronoi(delaunay)) { 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) ![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 ## Examples
use <hull_polyline2d.scad>; use <polyline_join.scad>;
use <trim_shape.scad>; use <trim_shape.scad>;
use <shape_taiwan.scad>; use <shape_taiwan.scad>;
use <bijection_offset.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); trimmed = trim_shape(offseted, 3, len(offseted) - 6);
smoothed = midpt_smooth(trimmed, 3); smoothed = midpt_smooth(trimmed, 3);
#hull_polyline2d(taiwan, .1); #polyline_join(taiwan)
circle(.05);
%translate([25, 0, 0]) %translate([25, 0, 0])
hull_polyline2d(offseted, .2); polyline_join(offseted)
hull_polyline2d(smoothed, .1); circle(.1);
polyline_join(smoothed)
circle(.05);
![trim_shape](images/lib3x-trim_shape-1.JPG) ![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 ## Examples
use <hull_polyline2d.scad>; use <polyline_join.scad>;
use <voronoi/vrn2_cells_from.scad>; use <voronoi/vrn2_cells_from.scad>;
points = [for(i = [0:50]) rands(-100, 100, 2)]; 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]; cell = cells[i];
linear_extrude(1) linear_extrude(1)
hull_polyline2d(concat(cell, [cell[0]]), width = 1); polyline_join(concat(cell, [cell[0]]))
circle(.5);
color(rands(0, 1, 3)) color(rands(0, 1, 3))
translate(pt) 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 ## Examples
use <hull_polyline2d.scad>; use <polyline_join.scad>;
use <voronoi/vrn2_cells_space.scad>; use <voronoi/vrn2_cells_space.scad>;
size = [20, 20]; 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]; cell_poly = cell[1];
linear_extrude(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)) color(rands(0, 1, 3))
translate(cell_pt) 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) ![vrn2_cells_space](images/lib3x-vrn2_cells_space-1.JPG)
use <hull_polyline3d.scad>; use <polyline_join.scad>;
use <ptf/ptf_torus.scad>; use <ptf/ptf_torus.scad>;
use <voronoi/vrn2_cells_space.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) { for(cell = cells) {
cell_poly = [for(p = cell[1]) ptf_torus(size, p, [10, 5], [360, 360])]; 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) ![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 ## Examples
use <voxel/vx_curve.scad>; use <voxel/vx_curve.scad>;
use <hull_polyline3d.scad>; use <polyline_join.scad>;
pts = [ pts = [
[28, 2, 1], [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) translate(pt)
sphere(1); sphere(1);
} }
#hull_polyline3d(pts, .1); #polyline_join(pts)
sphere(.05);
![vx_curve](images/lib3x-vx_curve-1.JPG) ![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 = [ pentagram = [
for(pt = shape_pentagram(15)) for(pt = shape_pentagram(15))
[round(pt[0]), round(pt[1])] [round(pt.x), round(pt.y)]
]; ];
for(pt = vx_polygon(pentagram)) { 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 = [ pentagram = [
for(pt = shape_pentagram(15)) 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]]))) { 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 = [ points = [
for(pa = points_angles) for(pa = points_angles)
let(pt = pa[0]) 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]) { 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; thickness = 2;
fn = 180; fn = 180;
amplitude = 10; amplitude = 10;
curve_step = 0.02; curve_step = 0.01;
smoothness = 15; smoothness = 15;
// Perlin noise 2D or 3D // Perlin noise 2D or 3D
perlin = 2; // [2, 3] perlin = 2; // [2, 3]
bottom = "NO"; // ["YES", "NO"] bottom = "YES"; // ["YES", "NO"]
epsilon = 0.000001; epsilon = 0.000001;
distorted_vase(beginning_radius, thickness, fn, amplitude, curve_step, smoothness, perlin, epsilon); 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"); sweep(all, triangles = "HOLLOW");
if(bottom == "YES") { if(bottom == "YES") {
linear_extrude(thickness) sweep([
polygon([for(p = offset_noisy[len(offset_noisy) - 1]) [p[0], p[1]]]); 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 <bezier_curve.scad>;
use <ellipse_extrude.scad>;
use <path_extrude.scad>; use <path_extrude.scad>;
use <shape_circle.scad>; use <shape_circle.scad>;
use <torus_knot.scad>;
use <util/reverse.scad>;
torus_knot_dragon(); module dragon_head_low_poly() {
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 palate() { module palate() {
t_step = 0.15; t_step = 0.15;

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