Created
May 28, 2025 23:25
-
-
Save Hermann-SW/981fc580814f8bda5689b7eb1b4bd751 to your computer and use it in GitHub Desktop.
JSCAD script console.logs Mathematica command FindHamiltonianCycle[...], and displays its results in JSCAD
This file contains hidden or 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
"use strict" | |
const jscad = require('@jscad/modeling') | |
const { translate, rotate, scale:scale3d } = jscad.transforms | |
const { vec3 } = jscad.maths | |
const { colorize } = jscad.colors | |
const { sphere, cylinder } = jscad.primitives | |
const { add, length, subtract, scale } = jscad.maths.vec3 | |
const phi=(Math.sqrt(5)+1)/2; | |
const build=[[0,1,3*phi],[1,2+phi,2*phi],[phi,2,2*phi+1]]; | |
const coords =[]; | |
build.forEach((v) => { | |
for(var o=0;o<3;++o){ | |
var w=[]; | |
for(var i=0;i<3;++i) | |
w.push(v[(o+i)%3]); | |
for(var a=-1;a<=(w[0]!=0);a+=2) | |
for(var b=-1;b<=(w[1]!=0);b+=2) | |
for(var c=-1;c<=(w[2]!=0);c+=2) | |
coords.push([a*w[0],b*w[1],c*w[2]]); | |
} | |
}) | |
var edges=[]; | |
var e=-1; | |
var E=[]; | |
for(var v=0;v<coords.length;++v) { | |
edges.push([]); | |
} | |
for(var v=0;v<coords.length;++v) { | |
for(var w=v+1;w<coords.length;++w) { | |
// check for golden ratio vertex coordinates edge length | |
if(vec3.distance(coords[v],coords[w])==2) { | |
e+=1; | |
E.push([v,w]); | |
edges[v].push(e); | |
edges[w].push(e); | |
} | |
} | |
} | |
function vertex(_v) { | |
return(translate(_v, sphere({radius: 0.1}))); | |
} | |
function edge2(_v, _w, r = 0.05) { | |
var d = [0, 0, 0]; | |
var w = [0, 0, 0]; | |
subtract(d, _w, _v); | |
add(w, _v, _w); | |
scale(w, w, 0.5); | |
return translate(w, | |
rotate([0, Math.acos(d[2]/length(d)), Math.atan2(d[1], d[0])], | |
scale3d([r,r,length(d)],cylinder({radius: 1, height: 1})) | |
) | |
); | |
} | |
function edge(_e, r = 0.05) { | |
return edge2(coords[_e[0]],coords[_e[1]]); | |
} | |
function main() { | |
var out = []; | |
coords.forEach((v) => out.push(colorize([0,0.5,1],vertex(v)))); | |
var cmd = "FindHamiltonianCycle[Graph[{"; | |
E.forEach((e,i) => { | |
// out.push(colorize([0,0.5,1,0.1],edge(e))); | |
cmd+=(i==0?"":",")+"UndirectedEdge["+e[0]+","+e[1]+"]"; | |
}); | |
cmd+="}]]"; | |
console.log(cmd); | |
var hc=[0,36,28,52,8,9,55,31,39,3,43,35,59,27,26,50,18,14,46,5,7,51, | |
19,15,47,23,22,54,30,38,2,42,34,58,10,11,57,33,41,1,37,29, | |
53,21,20,44,12,16,48,6,4,45,13,17,49,25,24,56,32,40]; | |
var old=hc[hc.length-1]; | |
hc.forEach((v) => {out.push(colorize([1,0,0],edge([old,v])));old=v;}); | |
return out; | |
} | |
module.exports = { main } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Detailed description here:
https://forums.raspberrypi.com/viewtopic.php?p=2317762#p2317762
Motivated by

which is Hamiltonian Cycle of C60 (football) fullerene

now looks like below:

https://jscad.app/#https://gist.githubusercontent.com/Hermann-SW/981fc580814f8bda5689b7eb1b4bd751/raw/38d0c8b477e5a238065137c9c7f68fa6df0d4837/C60.Hamilton_Cycle.jscad