Created
August 3, 2022 11:21
-
-
Save Hermann-SW/1c05c4e7fb14ab1062d8863537e21dcf to your computer and use it in GitHub Desktop.
test OpenSCAD file for reddit/r/openscad question
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
difflast=false; | |
$vpr = [355, 45, 0]; | |
$fn = 25; | |
$vpt = [0,0,0]; | |
function map_3D(c) = [cos(c[0])*sin(c[1]), sin(c[0])*sin(c[1]), cos(c[1])]; | |
sc = 7.745966692414834 ; | |
coords =[ | |
[270,54.735610317245346] | |
, [270,32.84136619034721] | |
, [450,-10.947122063449068] | |
, [450,10.947122063449068] | |
, [450,32.84136619034721] | |
, [450,54.735610317245346] | |
, [435.00000000000006,66.49040687816354] | |
, [99.28981685794952,89.00092415193457] | |
, [100.14753691885,105.97535999565878] | |
, [128.13045337727095,121.62203319938587] | |
, [147.28885559711895,146.78871257891285] | |
, [180,161.7547965609182] | |
, [180,180] | |
, [207.00457317073173,136.34296156816953] | |
, [246.01371951219508,115.5192915826721] | |
, [225.00000000000003,89.99999999999999] | |
, [240.00000000000003,78.24520343908176] | |
, [255,66.49040687816354] | |
, [304.0701219512195,65.87798006947973] | |
, [285.3887195121951,81.91301278119782] | |
, [312.0960365853658,101.61585483503195] | |
, [306.0365853658537,120.21491317984686] | |
, [360,143.50959312183645] | |
, [180,198.24520343908176] | |
, [133.73611341408576,156.98930797643447] | |
, [73.91948464513837,125.93400791130891] | |
, [73.02234052132947,107.30312263565591] | |
, [405,89.99999999999999] | |
, [419.99999999999994,78.24520343908176] | |
, [424.96189024390236,56.148758340435286] | |
, [404.88567073170725,57.35970539187688] | |
, [403.9024390243901,35.79930014614128] | |
, [356.8216463414633,60.98531710999605] | |
, [362.49237804878044,81.27867111436713] | |
, [344.86280487804873,102.71963854405126] | |
, [360,125.26438968275465] | |
, [374.99999999999994,113.50959312183645] | |
, [390.00000000000006,101.75479656091821] | |
, [385.79268292682923,80.13105768905407] | |
, [207.11054790294094,45.673726649903195] | |
, [146.5577309117994,38.77379957852092] | |
, [142.56264483245727,59.7005500222105] | |
, [121.49453377455319,65.64807530329321] | |
, [131.92095649120222,82.50806557042378] | |
, [122.72191365499862,94.53700558198142] | |
, [136.95496761584403,112.10202702358592] | |
, [160.01253581526245,120.14704228939047] | |
, [180,143.50959312183645] | |
, [180,125.26438968275465] | |
, [195.00000000000003,113.50959312183645] | |
, [210,101.75479656091821] | |
, [207.46583099772593,88.73754750012348] | |
, [222.4132479315831,73.54465618637616] | |
, [204.77391279702326,65.40601418084147] | |
, [184.7979425565458,76.99965970624498] | |
, [159.6356698110193,74.67977518481739] | |
, [151.54642204405494,87.33911582599671] | |
, [163.08263982994333,104.82950672274903] | |
, [177.6889616305127,107.00236205285992] | |
, [189.9842450615948,90.91318975307613] | |
]; | |
module vertex(_v, c) { | |
v = map_3D(coords[_v]) * sc; | |
color(c) translate(v) sphere(0.5); | |
} | |
module vtxt(_p1) { | |
p1 = coords[_p1]; | |
la1 = p1[0]; | |
ph1 = 90 - p1[1]; | |
translate([0, 0, 0]) rotate([0, 0, la1]) rotate([0, -ph1, 0]) | |
translate([sc+0.5, 0]) rotate([90,0,90]) color([0,0,0]) | |
linear_extrude(0.01) | |
text(str(_p1), size=0.5, halign="center", valign="center"); | |
} | |
module edge(_v,_w) { | |
v = map_3D(coords[_v]) * sc; | |
w = map_3D(coords[_w]) * sc - v; | |
translate(v) | |
rotate([0, acos(w[2]/norm(w)), atan2(w[1], w[0])]) | |
cylinder(norm(w),0.1,0.1); | |
} | |
module edge2(_p1,_p2,_e) { | |
p1 = coords[_p1]; | |
p2 = coords[_p2]; | |
// al/la/ph: alpha/lambda/phi | lxy/sxy: delta lambda_xy/sigma_xy | |
// https://en.wikipedia.org/wiki/Great-circle_navigation#Course | |
la1 = p1[0]; | |
la2 = p2[0]; | |
l12 = la2 - la1; | |
ph1 = 90 - p1[1]; | |
ph2 = 90 - p2[1]; | |
al1 = atan2(cos(ph2)*sin(l12), cos(ph1)*sin(ph2)-sin(ph1)*cos(ph2)*cos(l12)); | |
// delta sigma_12 | |
// https://en.wikipedia.org/wiki/Great-circle_distance#Formulae | |
s12 = acos(sin(ph1)*sin(ph2)+cos(ph1)*cos(ph2)*cos(l12)); | |
translate([0, 0, 0]) rotate([0, 0, la1]) rotate([0, -ph1, 0]) | |
rotate([90 - al1, 0, 0]) | |
rotate_extrude(angle=s12, convexity=10, $fn=100) | |
translate([sc, 0]) circle(0.1, $fn=25); | |
} | |
module sp_tria2(r, tang, pang, thi, ord, ord2) { | |
ang= [ for (i = [0:ord]) i*(tang/ord) ]; | |
rang=[ for (i = [ord:-1:0]) i*(tang/ord) ]; | |
coords=concat( | |
[ for (th=ang) [(r-thi/2)*sin(th), (r-thi/2)*cos(th)]], | |
[ for (th=rang) [(r+thi/2)*sin(th), (r+thi/2)*cos(th)] ] | |
); | |
rotate_extrude(angle=pang, $fn=ord2) polygon(coords); | |
} | |
module sp_tria(_p1, _p2, _p3) { | |
p1 = coords[_p1]; | |
p2 = coords[_p2]; | |
p3 = coords[_p3]; | |
// al/la/ph: alpha/lambda/phi | lxy/sxy: delta lambda_xy/sigma_xy | |
// https://en.wikipedia.org/wiki/Great-circle_navigation#Course | |
la1 = p1[0]; | |
la2 = p2[0]; | |
la3 = p3[0]; | |
l12 = la2 - la1; | |
l13 = la3 - la1; | |
l32 = la2 - la3; | |
l23 = la3 - la2; | |
l31 = la1 - la3; | |
ph1 = 90 - p1[1]; | |
ph2 = 90 - p2[1]; | |
ph3 = 90 - p3[1]; | |
al12 = atan2(cos(ph2)*sin(l12), cos(ph1)*sin(ph2)-sin(ph1)*cos(ph2)*cos(l12)); | |
al13 = atan2(cos(ph3)*sin(l13), cos(ph1)*sin(ph3)-sin(ph1)*cos(ph3)*cos(l13)); | |
al31 = atan2(cos(ph1)*sin(l31), cos(ph3)*sin(ph1)-sin(ph3)*cos(ph1)*cos(l31)); | |
al32 = atan2(cos(ph2)*sin(l32), cos(ph3)*sin(ph2)-sin(ph3)*cos(ph2)*cos(l32)); | |
// delta sigma_xy | |
// https://en.wikipedia.org/wiki/Great-circle_distance#Formulae | |
s12 = acos(sin(ph1)*sin(ph2)+cos(ph1)*cos(ph2)*cos(l12)); | |
s23 = acos(sin(ph2)*sin(ph3)+cos(ph2)*cos(ph3)*cos(l23)); | |
s13 = acos(sin(ph1)*sin(ph3)+cos(ph1)*cos(ph3)*cos(l13)); | |
if (s13 < s12) { | |
if (s12 >= s23) { | |
sp_tria(_p1, _p3, _p2); | |
} else { | |
sp_tria(_p2, _p1, _p3); | |
} | |
} else { | |
if (s13 < s23) { | |
sp_tria(_p2, _p1, _p3); | |
} | |
} | |
function m180(ang) = (ang < -180) ? 360 + ang : ((ang > 180) ? ang - 360 :ang); | |
if ((s13 >= s12) && (s13 >= s23)) { | |
v1 = map_3D(p1); | |
v2 = map_3D(p2); | |
v3 = map_3D(p3); | |
ms = v1+v2+v3; | |
ms2 = ms / sqrt(ms*ms); | |
mi = min(v1*ms2, v2*ms2, v3*ms2)-0.1; | |
sv1 = v1 * sc; | |
sv2 = v2 * sc; | |
sv3 = v3 * sc; | |
s1 = sv1 / mi; | |
s2 = sv2 / mi; | |
s3 = sv3 / mi; | |
intersection() { | |
union() { | |
color([0.5,0.5,0.5]) translate([0,0,0]) | |
rotate([0,0,la1-180]) | |
rotate([0,ph1-90,0]) | |
rotate([0,0,-al13]) | |
sp_tria2(sc, s12, m180(al13-al12), 0.1, 40, 40); | |
color([0.5,0.5,0.5]) translate([0,0,0]) | |
rotate([0,0,la3-180]) | |
rotate([0,ph3-90,0]) | |
rotate([0,0,-al31]) | |
sp_tria2(sc, s23, m180(al31-al32), 0.1, 40, 40); | |
} | |
hull() { | |
translate(sv1) cube(0.01); | |
translate(sv2) cube(0.01); | |
translate(sv3) cube(0.01); | |
translate(s1) cube(0.01); | |
translate(s2) cube(0.01); | |
translate(s3) cube(0.01); | |
} | |
} | |
} | |
} | |
difference(){ | |
difference(){ | |
rotate([0,-$t*360,0]) union(){ | |
color([1,0.66666,0]) | |
edge2( 0 , 17 , 0 ); | |
color([0,0,1]) | |
edge2( 0 , 18 , 1 ); | |
color([1,0.66666,0]) | |
edge2( 0 , 1 , 2 ); | |
color([1,0.66666,0]) | |
edge2( 1 , 2 , 3 ); | |
color([0,0,1]) | |
edge2( 1 , 39 , 4 ); | |
color([0,0,1]) | |
edge2( 2 , 31 , 5 ); | |
color([1,0.66666,0]) | |
edge2( 2 , 3 , 6 ); | |
color([1,0.66666,0]) | |
edge2( 3 , 4 , 7 ); | |
color([0,0,1]) | |
edge2( 3 , 40 , 8 ); | |
color([0,0,1]) | |
edge2( 4 , 29 , 9 ); | |
color([1,0.66666,0]) | |
edge2( 4 , 5 , 10 ); | |
color([1,0.66666,0]) | |
edge2( 5 , 6 , 11 ); | |
color([0,0,1]) | |
edge2( 5 , 42 , 12 ); | |
color([1,0.66666,0]) | |
edge2( 6 , 28 , 13 ); | |
color([0,0,1]) | |
edge2( 6 , 7 , 14 ); | |
color([0,0,1]) | |
edge2( 7 , 8 , 15 ); | |
color([0,0,1]) | |
edge2( 7 , 44 , 16 ); | |
color([0,0,1]) | |
edge2( 8 , 26 , 17 ); | |
color([0,0,1]) | |
edge2( 8 , 9 , 18 ); | |
color([0,0,1]) | |
edge2( 9 , 10 , 19 ); | |
color([0,0,1]) | |
edge2( 9 , 45 , 20 ); | |
color([0,0,1]) | |
edge2( 10 , 24 , 21 ); | |
color([0,0,1]) | |
edge2( 10 , 11 , 22 ); | |
color([1,0.66666,0]) | |
edge2( 11 , 12 , 23 ); | |
color([1,0.66666,0]) | |
edge2( 11 , 47 , 24 ); | |
color([1,0.66666,0]) | |
edge2( 12 , 23 , 25 ); | |
color([0,0,1]) | |
edge2( 12 , 13 , 26 ); | |
color([0,0,1]) | |
edge2( 13 , 14 , 27 ); | |
color([0,0,1]) | |
edge2( 13 , 49 , 28 ); | |
color([0,0,1]) | |
edge2( 14 , 21 , 29 ); | |
color([0,0,1]) | |
edge2( 14 , 15 , 30 ); | |
color([1,0.66666,0]) | |
edge2( 15 , 16 , 31 ); | |
color([1,0.66666,0]) | |
edge2( 15 , 50 , 32 ); | |
color([0,0,1]) | |
edge2( 16 , 19 , 33 ); | |
color([1,0.66666,0]) | |
edge2( 16 , 17 , 34 ); | |
color([0,0,1]) | |
edge2( 17 , 52 , 35 ); | |
color([0,0,1]) | |
edge2( 18 , 19 , 36 ); | |
color([0,0,1]) | |
edge2( 18 , 32 , 37 ); | |
color([0,0,1]) | |
edge2( 19 , 20 , 38 ); | |
color([0,0,1]) | |
edge2( 20 , 21 , 39 ); | |
color([0,0,1]) | |
edge2( 20 , 34 , 40 ); | |
color([0,0,1]) | |
edge2( 21 , 22 , 41 ); | |
color([1,0.66666,0]) | |
edge2( 22 , 23 , 42 ); | |
color([1,0.66666,0]) | |
edge2( 22 , 35 , 43 ); | |
color([0,0,1]) | |
edge2( 23 , 24 , 44 ); | |
color([0,0,1]) | |
edge2( 24 , 25 , 45 ); | |
color([0,0,1]) | |
edge2( 25 , 26 , 46 ); | |
color([0,0,1]) | |
edge2( 25 , 36 , 47 ); | |
color([0,0,1]) | |
edge2( 26 , 27 , 48 ); | |
color([1,0.66666,0]) | |
edge2( 27 , 28 , 49 ); | |
color([1,0.66666,0]) | |
edge2( 27 , 37 , 50 ); | |
color([0,0,1]) | |
edge2( 28 , 29 , 51 ); | |
color([0,0,1]) | |
edge2( 29 , 30 , 52 ); | |
color([0,0,1]) | |
edge2( 30 , 31 , 53 ); | |
color([0,0,1]) | |
edge2( 30 , 38 , 54 ); | |
color([0,0,1]) | |
edge2( 31 , 32 , 55 ); | |
color([0,0,1]) | |
edge2( 32 , 33 , 56 ); | |
color([0,0,1]) | |
edge2( 33 , 34 , 57 ); | |
color([0,0,1]) | |
edge2( 33 , 38 , 58 ); | |
color([0,0,1]) | |
edge2( 34 , 35 , 59 ); | |
color([1,0.66666,0]) | |
edge2( 35 , 36 , 60 ); | |
color([1,0.66666,0]) | |
edge2( 36 , 37 , 61 ); | |
color([0,0,1]) | |
edge2( 37 , 38 , 62 ); | |
color([0,0,1]) | |
edge2( 39 , 40 , 63 ); | |
color([0,0,1]) | |
edge2( 39 , 53 , 64 ); | |
color([0,0,1]) | |
edge2( 40 , 41 , 65 ); | |
color([0,0,1]) | |
edge2( 41 , 42 , 66 ); | |
color([0,0,1]) | |
edge2( 41 , 55 , 67 ); | |
color([0,0,1]) | |
edge2( 42 , 43 , 68 ); | |
color([0,0,1]) | |
edge2( 43 , 44 , 69 ); | |
color([0,0,1]) | |
edge2( 43 , 56 , 70 ); | |
color([0,0,1]) | |
edge2( 44 , 45 , 71 ); | |
color([0,0,1]) | |
edge2( 45 , 46 , 72 ); | |
color([0,0,1]) | |
edge2( 46 , 47 , 73 ); | |
color([0,0,1]) | |
edge2( 46 , 57 , 74 ); | |
color([1,0.66666,0]) | |
edge2( 47 , 48 , 75 ); | |
color([1,0.66666,0]) | |
edge2( 48 , 49 , 76 ); | |
color([0,0,1]) | |
edge2( 48 , 58 , 77 ); | |
color([1,0.66666,0]) | |
edge2( 49 , 50 , 78 ); | |
color([0,0,1]) | |
edge2( 50 , 51 , 79 ); | |
color([0,0,1]) | |
edge2( 51 , 52 , 80 ); | |
color([0,0,1]) | |
edge2( 51 , 59 , 81 ); | |
color([0,0,1]) | |
edge2( 52 , 53 , 82 ); | |
color([0,0,1]) | |
edge2( 53 , 54 , 83 ); | |
color([0,0,1]) | |
edge2( 54 , 55 , 84 ); | |
color([0,0,1]) | |
edge2( 54 , 59 , 85 ); | |
color([0,0,1]) | |
edge2( 55 , 56 , 86 ); | |
color([0,0,1]) | |
edge2( 56 , 57 , 87 ); | |
color([0,0,1]) | |
edge2( 57 , 58 , 88 ); | |
color([0,0,1]) | |
edge2( 58 , 59 , 89 ); | |
vertex( 0 , [1,0,0] ); | |
vertex( 1 , [0,1,0] ); | |
vertex( 2 , [0,1,0] ); | |
vertex( 3 , [0,1,0] ); | |
vertex( 4 , [0,1,0] ); | |
vertex( 5 , [1,0,0] ); | |
vertex( 6 , [0,1,0] ); | |
vertex( 7 , [0,1,0] ); | |
vertex( 8 , [0,1,0] ); | |
vertex( 9 , [0,1,0] ); | |
vertex( 10 , [0,1,0] ); | |
vertex( 11 , [0,1,0] ); | |
vertex( 12 , [0,1,0] ); | |
vertex( 13 , [0,1,0] ); | |
vertex( 14 , [0,1,0] ); | |
vertex( 15 , [0,1,0] ); | |
vertex( 16 , [0,1,0] ); | |
vertex( 17 , [0,1,0] ); | |
vertex( 18 , [0,1,0] ); | |
vertex( 19 , [0,1,0] ); | |
vertex( 20 , [0,1,0] ); | |
vertex( 21 , [0,1,0] ); | |
vertex( 22 , [0,1,0] ); | |
vertex( 23 , [0,1,0] ); | |
vertex( 24 , [0,1,0] ); | |
vertex( 25 , [0,1,0] ); | |
vertex( 26 , [0,1,0] ); | |
vertex( 27 , [0,1,0] ); | |
vertex( 28 , [0,1,0] ); | |
vertex( 29 , [0,1,0] ); | |
vertex( 30 , [0,1,0] ); | |
vertex( 31 , [0,1,0] ); | |
vertex( 32 , [0,1,0] ); | |
vertex( 33 , [0,1,0] ); | |
vertex( 34 , [0,1,0] ); | |
vertex( 35 , [1,0,0] ); | |
vertex( 36 , [0,1,0] ); | |
vertex( 37 , [0,1,0] ); | |
vertex( 38 , [0,1,0] ); | |
vertex( 39 , [0,1,0] ); | |
vertex( 40 , [0,1,0] ); | |
vertex( 41 , [0,1,0] ); | |
vertex( 42 , [0,1,0] ); | |
vertex( 43 , [0,1,0] ); | |
vertex( 44 , [0,1,0] ); | |
vertex( 45 , [0,1,0] ); | |
vertex( 46 , [0,1,0] ); | |
vertex( 47 , [0,1,0] ); | |
vertex( 48 , [1,0,0] ); | |
vertex( 49 , [0,1,0] ); | |
vertex( 50 , [0,1,0] ); | |
vertex( 51 , [0,1,0] ); | |
vertex( 52 , [0,1,0] ); | |
vertex( 53 , [0,1,0] ); | |
vertex( 54 , [0,1,0] ); | |
vertex( 55 , [0,1,0] ); | |
vertex( 56 , [0,1,0] ); | |
vertex( 57 , [0,1,0] ); | |
vertex( 58 , [0,1,0] ); | |
vertex( 59 , [0,1,0] ); | |
difference(){color([1,1,1, 1 ]) translate([0,0,0]) sphere(sc, $fn=180); | |
if (!difflast) | |
translate([0,0,0]) sphere(sc-0.1, $fn=180); | |
} | |
} | |
if (difflast) | |
translate([0,0,0]) sphere(sc-0.1, $fn=180); | |
} | |
translate([0,0,0]) cube([10,10,10]); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment