Skip to content

Instantly share code, notes, and snippets.

@Hermann-SW
Created May 28, 2025 23:25
Show Gist options
  • Save Hermann-SW/981fc580814f8bda5689b7eb1b4bd751 to your computer and use it in GitHub Desktop.
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
"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 }
@Hermann-SW
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment