Last active
August 1, 2022 22:11
-
-
Save Hermann-SW/dcd9a6ab0d6286953120ff49ce5a43a9 to your computer and use it in GitHub Desktop.
More than half of C60 fullerene vertices rotating, OpenSCAD with three mirrors
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
$vpr = [ 340 , 45, 0 ]; | |
$fn = 25; | |
$vpt = [0,-6.5,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] | |
, [90,-10.947122063449068] | |
, [90,10.947122063449068] | |
, [90,32.84136619034721] | |
, [90,54.735610317245346] | |
, [75,66.49040687816354] | |
, [96.29710080680911,88.00012709434661] | |
, [97.8850075361291,105.25045921955851] | |
, [125.25179537193014,120.74092831383054] | |
, [146.1485947335757,146.4391106994081] | |
, [180,161.7547965609182] | |
, [180,180] | |
, [720,90] | |
, [720,90] | |
, [225.00000000000003,89.99999999999999] | |
, [240.00000000000003,78.24520343908176] | |
, [255,66.49040687816354] | |
, [288,68.84136619034722] | |
, [306,82.94712206344907] | |
, [324,97.05287793655093] | |
, [720,90] | |
, [0,143.50959312183645] | |
, [180,198.24520343908176] | |
, [133.19398882879685,156.82160722347552] | |
, [73.43337175281494,125.78050753193679] | |
, [72.10612642964801,107.01032225049843] | |
, [45,89.99999999999999] | |
, [60,78.24520343908176] | |
, [720,90] | |
, [720,90] | |
, [720,90] | |
, [720,90] | |
, [720,90] | |
, [342,111.1586338096528] | |
, [360,125.26438968275465] | |
, [15,113.50959312183645] | |
, [30,101.75479656091821] | |
, [720,90] | |
, [203.93488476169168,46.27779606600964] | |
, [141.80689192213023,39.35586595734995] | |
, [131.48579100469902,60.84267974259112] | |
, [104.99999999999999,66.49040687816357] | |
, [120,78.24520343908179] | |
, [116.00629488429827,92.2595151853178] | |
, [131.72178384608566,110.53321502252494] | |
, [153.90726128202854,118.59920156842652] | |
, [180,143.50959312183645] | |
, [180,125.26438968275465] | |
, [195.00000000000003,113.50959312183645] | |
, [210,101.75479656091821] | |
, [203.78048780487805,90.1575950238964] | |
, [219.5927500559409,74.42805265079724] | |
, [199.9977623629447,66.63615605033179] | |
, [176.4656522712016,79.20261943418846] | |
, [147.6504810919669,76.68176639225987] | |
, [135,90.00000000000001] | |
, [150,101.75479656091824] | |
, [165,113.50959312183646] | |
, [181.7487133586932,94.2899358599738] | |
]; | |
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); | |
} | |
} | |
} | |
} | |
// *mirror modules from: https://www.reddit.com/r/openscad/comments/mlgm81/re_copy_mirror/gtlop2m/ | |
module zmirror(copy=false,condition=true) { | |
if (condition) { | |
mirror([0,0,1]) | |
translate([0,0,30]) | |
children(); | |
if (copy) { | |
children(); | |
} | |
} else { | |
children(); | |
} | |
} | |
module ymirror(copy=false,condition=true) { | |
if (condition) { | |
mirror([0,1,0]) | |
translate([0,20,0]) | |
children(); | |
if (copy) { | |
children(); | |
} | |
} else { | |
children(); | |
} | |
} | |
module xmirror(copy=false,condition=true) { | |
if (condition) { | |
mirror([1,0,0]) | |
translate([30,0,0]) | |
children(); | |
if (copy) { | |
children(); | |
} | |
} else { | |
children(); | |
} | |
} | |
module sphere_C60(){ | |
rotate([0,-$t*360,0]) union(){ | |
color([0,0,1]) | |
edge2( 0 , 17 , 0 ); | |
color([0,0,1]) | |
edge2( 0 , 18 , 1 ); | |
color([0,0,1]) | |
edge2( 0 , 1 , 2 ); | |
color([0,0,1]) | |
edge2( 1 , 2 , 3 ); | |
color([0,0,1]) | |
edge2( 1 , 39 , 4 ); | |
color([0,0,1]) | |
edge2( 2 , 3 , 6 ); | |
color([0,0,1]) | |
edge2( 3 , 4 , 7 ); | |
color([0,0,1]) | |
edge2( 3 , 40 , 8 ); | |
color([0,0,1]) | |
edge2( 4 , 5 , 10 ); | |
color([0,0,1]) | |
edge2( 5 , 6 , 11 ); | |
color([0,0,1]) | |
edge2( 5 , 42 , 12 ); | |
color([0,0,1]) | |
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([0,0,1]) | |
edge2( 11 , 12 , 23 ); | |
color([0,0,1]) | |
edge2( 11 , 47 , 24 ); | |
color([0,0,1]) | |
edge2( 12 , 23 , 25 ); | |
color([0,0,1]) | |
edge2( 15 , 16 , 31 ); | |
color([0,0,1]) | |
edge2( 15 , 50 , 32 ); | |
color([0,0,1]) | |
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( 19 , 20 , 38 ); | |
color([0,0,1]) | |
edge2( 20 , 34 , 40 ); | |
color([0,0,1]) | |
edge2( 22 , 23 , 42 ); | |
color([0,0,1]) | |
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([0,0,1]) | |
edge2( 27 , 28 , 49 ); | |
color([0,0,1]) | |
edge2( 27 , 37 , 50 ); | |
color([0,0,1]) | |
edge2( 34 , 35 , 59 ); | |
color([0,0,1]) | |
edge2( 35 , 36 , 60 ); | |
color([0,0,1]) | |
edge2( 36 , 37 , 61 ); | |
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([0,0,1]) | |
edge2( 47 , 48 , 75 ); | |
color([0,0,1]) | |
edge2( 48 , 49 , 76 ); | |
color([0,0,1]) | |
edge2( 48 , 58 , 77 ); | |
color([0,0,1]) | |
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] ); | |
echo( [17,0,18,19,16] ); | |
sp_tria( 17 , 0 , 18 ); | |
sp_tria( 17 , 18 , 19 ); | |
sp_tria( 17 , 19 , 16 ); | |
echo( [2,1,39,40,3] ); | |
sp_tria( 2 , 1 , 39 ); | |
sp_tria( 2 , 39 , 40 ); | |
sp_tria( 2 , 40 , 3 ); | |
echo( [8,7,44,45,9] ); | |
sp_tria( 8 , 7 , 44 ); | |
sp_tria( 8 , 44 , 45 ); | |
sp_tria( 8 , 45 , 9 ); | |
echo( [24,10,11,12,23] ); | |
sp_tria( 24 , 10 , 11 ); | |
sp_tria( 24 , 11 , 12 ); | |
sp_tria( 24 , 12 , 23 ); | |
echo( [26,25,36,37,27] ); | |
sp_tria( 26 , 25 , 36 ); | |
sp_tria( 26 , 36 , 37 ); | |
sp_tria( 26 , 37 , 27 ); | |
echo( [42,41,55,56,43] ); | |
sp_tria( 42 , 41 , 55 ); | |
sp_tria( 42 , 55 , 56 ); | |
sp_tria( 42 , 56 , 43 ); | |
echo( [47,46,57,58,48] ); | |
sp_tria( 47 , 46 , 57 ); | |
sp_tria( 47 , 57 , 58 ); | |
sp_tria( 47 , 58 , 48 ); | |
echo( [52,51,59,54,53] ); | |
sp_tria( 52 , 51 , 59 ); | |
sp_tria( 52 , 59 , 54 ); | |
sp_tria( 52 , 54 , 53 ); | |
color([1,1,1, 1]) translate([0,0,0]) sphere(sc, $fn=180); | |
} | |
} | |
mirr=[0.8,0.8,0.8,0.2]; | |
zmirror(copy=true) sphere_C60(); | |
color(mirr) translate([4,-2,-11]) cube([17,15,0.1]); | |
ymirror(copy=true) sphere_C60(); | |
color(mirr) translate([0.5,-9.5,0.5]) cube([25,0.1,25]); | |
xmirror(copy=true) sphere_C60(); | |
color(mirr) translate([-11,-2.5,4]) cube([0.1,15,17]); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Animation here:
https://www.youtube.com/watch?v=yyAD1MXLkAE
Single frame: