UNPKG

three-stdlib

Version:

stand-alone library of threejs examples

1 lines 10 kB
{"version":3,"file":"GeometryUtils.cjs","sources":["../../src/utils/GeometryUtils.ts"],"sourcesContent":["import { Vector3 } from 'three'\n\n/**\n * Generates 2D-Coordinates in a very fast way.\n *\n * Based on work by:\n * @link http://www.openprocessing.org/sketch/15493\n *\n * @param center Center of Hilbert curve.\n * @param size Total width of Hilbert curve.\n * @param iterations Number of subdivisions.\n * @param v0 Corner index -X, -Z.\n * @param v1 Corner index -X, +Z.\n * @param v2 Corner index +X, +Z.\n * @param v3 Corner index +X, -Z.\n */\nconst hilbert2D = (\n center = new Vector3(0, 0, 0),\n size = 10,\n iterations = 1,\n v0 = 0,\n v1 = 1,\n v2 = 2,\n v3 = 3,\n): Vector3[] => {\n // Default Vars\n const half = size / 2\n const vec_s = [\n new Vector3(center.x - half, center.y, center.z - half),\n new Vector3(center.x - half, center.y, center.z + half),\n new Vector3(center.x + half, center.y, center.z + half),\n new Vector3(center.x + half, center.y, center.z - half),\n ]\n\n const vec = [vec_s[v0], vec_s[v1], vec_s[v2], vec_s[v3]]\n\n // Recurse iterations\n if (0 <= --iterations) {\n const tmp: Vector3[] = []\n\n Array.prototype.push.apply(tmp, hilbert2D(vec[0], half, iterations, v0, v3, v2, v1))\n Array.prototype.push.apply(tmp, hilbert2D(vec[1], half, iterations, v0, v1, v2, v3))\n Array.prototype.push.apply(tmp, hilbert2D(vec[2], half, iterations, v0, v1, v2, v3))\n Array.prototype.push.apply(tmp, hilbert2D(vec[3], half, iterations, v2, v1, v0, v3))\n\n // Return recursive call\n return tmp\n }\n\n // Return complete Hilbert Curve.\n return vec\n}\n\n/**\n * Generates 3D-Coordinates in a very fast way.\n *\n * Based on work by:\n * @link http://www.openprocessing.org/visuals/?visualID=15599\n *\n * @param center Center of Hilbert curve.\n * @param size Total width of Hilbert curve.\n * @param iterations Number of subdivisions.\n * @param v0 Corner index -X, +Y, -Z.\n * @param v1 Corner index -X, +Y, +Z.\n * @param v2 Corner index -X, -Y, +Z.\n * @param v3 Corner index -X, -Y, -Z.\n * @param v4 Corner index +X, -Y, -Z.\n * @param v5 Corner index +X, -Y, +Z.\n * @param v6 Corner index +X, +Y, +Z.\n * @param v7 Corner index +X, +Y, -Z.\n */\nconst hilbert3D = (\n center = new Vector3(0, 0, 0),\n size = 10,\n iterations = 1,\n v0 = 0,\n v1 = 1,\n v2 = 2,\n v3 = 3,\n v4 = 4,\n v5 = 5,\n v6 = 6,\n v7 = 7,\n): Vector3[] => {\n // Default Vars\n const half = size / 2\n const vec_s = [\n new Vector3(center.x - half, center.y + half, center.z - half),\n new Vector3(center.x - half, center.y + half, center.z + half),\n new Vector3(center.x - half, center.y - half, center.z + half),\n new Vector3(center.x - half, center.y - half, center.z - half),\n new Vector3(center.x + half, center.y - half, center.z - half),\n new Vector3(center.x + half, center.y - half, center.z + half),\n new Vector3(center.x + half, center.y + half, center.z + half),\n new Vector3(center.x + half, center.y + half, center.z - half),\n ]\n\n const vec = [vec_s[v0], vec_s[v1], vec_s[v2], vec_s[v3], vec_s[v4], vec_s[v5], vec_s[v6], vec_s[v7]]\n\n // Recurse iterations\n if (--iterations >= 0) {\n const tmp: Vector3[] = []\n\n Array.prototype.push.apply(tmp, hilbert3D(vec[0], half, iterations, v0, v3, v4, v7, v6, v5, v2, v1))\n Array.prototype.push.apply(tmp, hilbert3D(vec[1], half, iterations, v0, v7, v6, v1, v2, v5, v4, v3))\n Array.prototype.push.apply(tmp, hilbert3D(vec[2], half, iterations, v0, v7, v6, v1, v2, v5, v4, v3))\n Array.prototype.push.apply(tmp, hilbert3D(vec[3], half, iterations, v2, v3, v0, v1, v6, v7, v4, v5))\n Array.prototype.push.apply(tmp, hilbert3D(vec[4], half, iterations, v2, v3, v0, v1, v6, v7, v4, v5))\n Array.prototype.push.apply(tmp, hilbert3D(vec[5], half, iterations, v4, v3, v2, v5, v6, v1, v0, v7))\n Array.prototype.push.apply(tmp, hilbert3D(vec[6], half, iterations, v4, v3, v2, v5, v6, v1, v0, v7))\n Array.prototype.push.apply(tmp, hilbert3D(vec[7], half, iterations, v6, v5, v2, v1, v0, v3, v4, v7))\n\n // Return recursive call\n return tmp\n }\n\n // Return complete Hilbert Curve.\n return vec\n}\n\n/**\n * Generates a Gosper curve (lying in the XY plane)\n *\n * https://gist.github.com/nitaku/6521802\n *\n * @param size The size of a single gosper island.\n */\nconst gosper = (size = 1): number[] => {\n function fractalize(config: { axiom: string; steps: number; rules: Record<string, string> }): string {\n let output = ''\n let input = config.axiom\n\n for (let i = 0, il = config.steps; 0 <= il ? i < il : i > il; 0 <= il ? i++ : i--) {\n output = ''\n\n for (let j = 0, jl = input.length; j < jl; j++) {\n const char = input[j]\n\n if (char in config.rules) {\n output += config.rules[char]\n } else {\n output += char\n }\n }\n\n input = output\n }\n\n return output\n }\n\n function toPoints(config: { fractal: string; size: number; angle: number }): number[] {\n let currX = 0\n let currY = 0\n let angle = 0\n const path = [0, 0, 0]\n const fractal = config.fractal\n\n for (let i = 0, l = fractal.length; i < l; i++) {\n const char = fractal[i]\n\n if (char === '+') {\n angle += config.angle\n } else if (char === '-') {\n angle -= config.angle\n } else if (char === 'F') {\n currX += config.size * Math.cos(angle)\n currY += -config.size * Math.sin(angle)\n path.push(currX, currY, 0)\n }\n }\n\n return path\n }\n\n //\n\n const gosper = fractalize({\n axiom: 'A',\n steps: 4,\n rules: {\n A: 'A+BF++BF-FA--FAFA-BF+',\n B: '-FA+BFBF++BF+FA--FA-B',\n },\n })\n\n const points = toPoints({\n fractal: gosper,\n size: size,\n angle: Math.PI / 3, // 60 degrees\n })\n\n return points\n}\n\nexport const GeometryUtils = {\n hilbert3D,\n gosper,\n hilbert2D,\n}\n"],"names":["Vector3","gosper"],"mappings":";;;AAgBA,MAAM,YAAY,CAChB,SAAS,IAAIA,cAAQ,GAAG,GAAG,CAAC,GAC5B,OAAO,IACP,aAAa,GACb,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,MACS;AAEd,QAAM,OAAO,OAAO;AACpB,QAAM,QAAQ;AAAA,IACZ,IAAIA,cAAQ,OAAO,IAAI,MAAM,OAAO,GAAG,OAAO,IAAI,IAAI;AAAA,IACtD,IAAIA,cAAQ,OAAO,IAAI,MAAM,OAAO,GAAG,OAAO,IAAI,IAAI;AAAA,IACtD,IAAIA,cAAQ,OAAO,IAAI,MAAM,OAAO,GAAG,OAAO,IAAI,IAAI;AAAA,IACtD,IAAIA,cAAQ,OAAO,IAAI,MAAM,OAAO,GAAG,OAAO,IAAI,IAAI;AAAA,EAAA;AAGxD,QAAM,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;AAGnD,MAAA,KAAK,EAAE,YAAY;AACrB,UAAM,MAAiB,CAAA;AAEvB,UAAM,UAAU,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC,GAAG,MAAM,YAAY,IAAI,IAAI,IAAI,EAAE,CAAC;AACnF,UAAM,UAAU,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC,GAAG,MAAM,YAAY,IAAI,IAAI,IAAI,EAAE,CAAC;AACnF,UAAM,UAAU,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC,GAAG,MAAM,YAAY,IAAI,IAAI,IAAI,EAAE,CAAC;AACnF,UAAM,UAAU,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC,GAAG,MAAM,YAAY,IAAI,IAAI,IAAI,EAAE,CAAC;AAG5E,WAAA;AAAA,EACT;AAGO,SAAA;AACT;AAoBA,MAAM,YAAY,CAChB,SAAS,IAAIA,MAAQ,QAAA,GAAG,GAAG,CAAC,GAC5B,OAAO,IACP,aAAa,GACb,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,MACS;AAEd,QAAM,OAAO,OAAO;AACpB,QAAM,QAAQ;AAAA,IACZ,IAAIA,cAAQ,OAAO,IAAI,MAAM,OAAO,IAAI,MAAM,OAAO,IAAI,IAAI;AAAA,IAC7D,IAAIA,cAAQ,OAAO,IAAI,MAAM,OAAO,IAAI,MAAM,OAAO,IAAI,IAAI;AAAA,IAC7D,IAAIA,cAAQ,OAAO,IAAI,MAAM,OAAO,IAAI,MAAM,OAAO,IAAI,IAAI;AAAA,IAC7D,IAAIA,cAAQ,OAAO,IAAI,MAAM,OAAO,IAAI,MAAM,OAAO,IAAI,IAAI;AAAA,IAC7D,IAAIA,cAAQ,OAAO,IAAI,MAAM,OAAO,IAAI,MAAM,OAAO,IAAI,IAAI;AAAA,IAC7D,IAAIA,cAAQ,OAAO,IAAI,MAAM,OAAO,IAAI,MAAM,OAAO,IAAI,IAAI;AAAA,IAC7D,IAAIA,cAAQ,OAAO,IAAI,MAAM,OAAO,IAAI,MAAM,OAAO,IAAI,IAAI;AAAA,IAC7D,IAAIA,cAAQ,OAAO,IAAI,MAAM,OAAO,IAAI,MAAM,OAAO,IAAI,IAAI;AAAA,EAAA;AAGzD,QAAA,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;AAG/F,MAAA,EAAE,cAAc,GAAG;AACrB,UAAM,MAAiB,CAAA;AAEvB,UAAM,UAAU,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC,GAAG,MAAM,YAAY,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;AACnG,UAAM,UAAU,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC,GAAG,MAAM,YAAY,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;AACnG,UAAM,UAAU,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC,GAAG,MAAM,YAAY,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;AACnG,UAAM,UAAU,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC,GAAG,MAAM,YAAY,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;AACnG,UAAM,UAAU,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC,GAAG,MAAM,YAAY,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;AACnG,UAAM,UAAU,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC,GAAG,MAAM,YAAY,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;AACnG,UAAM,UAAU,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC,GAAG,MAAM,YAAY,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;AACnG,UAAM,UAAU,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC,GAAG,MAAM,YAAY,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;AAG5F,WAAA;AAAA,EACT;AAGO,SAAA;AACT;AASA,MAAM,SAAS,CAAC,OAAO,MAAgB;AACrC,WAAS,WAAW,QAAiF;AACnG,QAAI,SAAS;AACb,QAAI,QAAQ,OAAO;AAEnB,aAAS,IAAI,GAAG,KAAK,OAAO,OAAO,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,KAAK;AACxE,eAAA;AAET,eAAS,IAAI,GAAG,KAAK,MAAM,QAAQ,IAAI,IAAI,KAAK;AACxC,cAAA,OAAO,MAAM,CAAC;AAEhB,YAAA,QAAQ,OAAO,OAAO;AACd,oBAAA,OAAO,MAAM,IAAI;AAAA,QAAA,OACtB;AACK,oBAAA;AAAA,QACZ;AAAA,MACF;AAEQ,cAAA;AAAA,IACV;AAEO,WAAA;AAAA,EACT;AAEA,WAAS,SAAS,QAAoE;AACpF,QAAI,QAAQ;AACZ,QAAI,QAAQ;AACZ,QAAI,QAAQ;AACZ,UAAM,OAAO,CAAC,GAAG,GAAG,CAAC;AACrB,UAAM,UAAU,OAAO;AAEvB,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,IAAI,GAAG,KAAK;AACxC,YAAA,OAAO,QAAQ,CAAC;AAEtB,UAAI,SAAS,KAAK;AAChB,iBAAS,OAAO;AAAA,MAAA,WACP,SAAS,KAAK;AACvB,iBAAS,OAAO;AAAA,MAAA,WACP,SAAS,KAAK;AACvB,iBAAS,OAAO,OAAO,KAAK,IAAI,KAAK;AACrC,iBAAS,CAAC,OAAO,OAAO,KAAK,IAAI,KAAK;AACjC,aAAA,KAAK,OAAO,OAAO,CAAC;AAAA,MAC3B;AAAA,IACF;AAEO,WAAA;AAAA,EACT;AAIA,QAAMC,UAAS,WAAW;AAAA,IACxB,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAAA,EAAA,CACD;AAED,QAAM,SAAS,SAAS;AAAA,IACtB,SAASA;AAAAA,IACT;AAAA,IACA,OAAO,KAAK,KAAK;AAAA;AAAA,EAAA,CAClB;AAEM,SAAA;AACT;AAEO,MAAM,gBAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF;;"}