Skip to content

Instantly share code, notes, and snippets.

@Spiritdude
Last active December 16, 2015 16:59
Show Gist options
  • Select an option

  • Save Spiritdude/5467486 to your computer and use it in GitHub Desktop.

Select an option

Save Spiritdude/5467486 to your computer and use it in GitHub Desktop.
// title: New Sphere
// author: Rene K. Mueller
// description: geodesic approach to the sphere, in contrast with openscad-like
function getParameterDefinitions() {
return [
{ name: "fn", type: "float", initial: 32, caption: "Resolution" }
];
}
function main(param) {
return [
newSphere({r: 5, fn: param.fn}),
sphere({r:5, fn: param.fn}).translate([10,0,0])
];
}
function newSphere(p) {
var r = 1, fn = 4;
var ci = [ // hard-coded data of icosahedron (20 faces, all triangles)
[0.850651,0.000000,-0.525731],
[0.850651,-0.000000,0.525731],
[-0.850651,-0.000000,0.525731],
[-0.850651,0.000000,-0.525731],
[0.000000,-0.525731,0.850651],
[0.000000,0.525731,0.850651],
[0.000000,0.525731,-0.850651],
[0.000000,-0.525731,-0.850651],
[-0.525731,-0.850651,-0.000000],
[0.525731,-0.850651,-0.000000],
[0.525731,0.850651,0.000000],
[-0.525731,0.850651,0.000000]];
var ti = [
[0,9,1],
[1,10,0],
[6,7,0],
[10,6,0],
[7,9,0],
[5,1,4],
[4,1,9],
[5,10,1],
[2,8,3],
[3,11,2],
[2,5,4],
[4,8,2],
[2,11,5],
[3,7,6],
[6,11,3],
[8,7,3],
[9,8,4],
[11,10,5],
[10,11,6],
[8,9,7]];
if(p) {
if(p.fn) fn = Math.floor(p.fn/6);
if(p.r) r = p.r;
}
if(fn<0) fn = 1;
var q = [];
var c = [], f = [];
var off = 0;
for(var i=0; i<ti.length; i++) {
var g = geodesicSubDivide([ ci[ti[i][0]], ci[ti[i][1]], ci[ti[i][2]] ],fn,off);
c = c.concat(g.points);
f = f.concat(g.triangles);
off = g.off;
}
return polyhedron({points: c, triangles: f}).scale(r);
}
// p3
// /\
// /__\ fn = 3
// i /\ /\
// /__\/__\
// /\ /\ /\
// 0/__\/__\/__\
// p1 0 j p2
function geodesicSubDivide(p,fn,off) {
var p1 = p[0], p2 = p[1], p3 = p[2];
var n = off;
var c = [];
var f = [];
for(var i=0; i<fn; i++) {
for(var j=0; j<fn-i; j++) {
var t0 = i/fn;
var t1 = (i+1)/fn;
var s0 = j/(fn-i);
var s1 = (j+1)/(fn-i);
var s2 = fn-i-1?j/(fn-i-1):1
var s3 = fn-i-1?(j+1)/(fn-i-1):1
var q = [];
q[0] = mix3(mix3(p1,p2,s0),p3,t0);
q[1] = mix3(mix3(p1,p2,s1),p3,t0);
q[2] = mix3(mix3(p1,p2,s2),p3,t1);
// normalize
for(var k=0; k<3; k++) {
var r = Math.sqrt(q[k][0]*q[k][0]+q[k][1]*q[k][1]+q[k][2]*q[k][2]);
for(var l=0; l<3; l++) {
q[k][l] /= r;
}
}
c.push(clone(q[0]),clone(q[1]),clone(q[2]));
f.push([n,n+1,n+2]); n += 3;
if(j<fn-i-1) {
q[0] = mix3(mix3(p1,p2,s1),p3,t0);
q[1] = mix3(mix3(p1,p2,s3),p3,t1);
q[2] = mix3(mix3(p1,p2,s2),p3,t1);
// normalize
for(var k=0; k<3; k++) {
var r = Math.sqrt(q[k][0]*q[k][0]+q[k][1]*q[k][1]+q[k][2]*q[k][2]);
for(var l=0; l<3; l++) {
q[k][l] = q[k][l]/r;
}
}
c.push(q[0],q[1],q[2]);
f.push([n,n+1,n+2]); n += 3;
}
}
}
return { points: c, triangles: f, off: n };
}
function mix3(a,b,f) {
var _f = 1-f;
var c = [];
for(var i=0; i<3; i++) {
c[i] = a[i]*_f+b[i]*f;
}
return c;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment