Skip to content

Instantly share code, notes, and snippets.

@Hermann-SW
Created August 3, 2022 11:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Hermann-SW/1c05c4e7fb14ab1062d8863537e21dcf to your computer and use it in GitHub Desktop.
Save Hermann-SW/1c05c4e7fb14ab1062d8863537e21dcf to your computer and use it in GitHub Desktop.
test OpenSCAD file for reddit/r/openscad question
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