@vib3code/sdk 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +118 -0
- package/DOCS/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +34 -0
- package/DOCS/CI_TESTING.md +38 -0
- package/DOCS/CLI_ONBOARDING.md +75 -0
- package/DOCS/CONTROL_REFERENCE.md +64 -0
- package/DOCS/DEV_TRACK_ANALYSIS.md +77 -0
- package/DOCS/DEV_TRACK_PLAN_2026-01-07.md +42 -0
- package/DOCS/DEV_TRACK_SESSION_2026-01-31.md +220 -0
- package/DOCS/ENV_SETUP.md +189 -0
- package/DOCS/EXPORT_FORMATS.md +417 -0
- package/DOCS/GPU_DISPOSAL_GUIDE.md +21 -0
- package/DOCS/LICENSING_TIERS.md +275 -0
- package/DOCS/MASTER_PLAN_2026-01-31.md +570 -0
- package/DOCS/OBS_SETUP_GUIDE.md +98 -0
- package/DOCS/PROJECT_SETUP.md +66 -0
- package/DOCS/RENDERER_LIFECYCLE.md +40 -0
- package/DOCS/REPO_MANIFEST.md +121 -0
- package/DOCS/SESSION_014_PLAN.md +195 -0
- package/DOCS/SESSION_LOG_2026-01-07.md +56 -0
- package/DOCS/STRATEGIC_BLUEPRINT_2026-01-07.md +72 -0
- package/DOCS/SYSTEM_AUDIT_2026-01-30.md +738 -0
- package/DOCS/SYSTEM_INVENTORY.md +520 -0
- package/DOCS/TELEMETRY_EXPORTS.md +34 -0
- package/DOCS/WEBGPU_STATUS.md +38 -0
- package/DOCS/XR_BENCHMARKS.md +608 -0
- package/LICENSE +21 -0
- package/README.md +426 -0
- package/docs/.nojekyll +0 -0
- package/docs/01-dissolution_of_euclidean_hegemony.html +346 -0
- package/docs/02-hyperspatial_ego_death.html +346 -0
- package/docs/03-post_cartesian_sublime.html +346 -0
- package/docs/04-crystalline_void_meditation.html +346 -0
- package/docs/05-quantum_decoherence_ballet.html +346 -0
- package/docs/06-dissolution_of_euclidean_hegemony.html +346 -0
- package/docs/07-hyperspatial_ego_death.html +346 -0
- package/docs/08-post_cartesian_sublime.html +346 -0
- package/docs/09-crystalline_void_meditation.html +346 -0
- package/docs/10-quantum_decoherence_ballet.html +346 -0
- package/docs/11-dissolution_of_euclidean_hegemony.html +346 -0
- package/docs/12-hyperspatial_ego_death.html +346 -0
- package/docs/13-post_cartesian_sublime.html +346 -0
- package/docs/index.html +794 -0
- package/docs/test-hub.html +441 -0
- package/docs/url-state.js +102 -0
- package/docs/vib3-exports/01-quantum-quantum-tetrahedron-lattice.html +489 -0
- package/docs/vib3-exports/02-quantum-quantum-hypersphere-matrix.html +489 -0
- package/docs/vib3-exports/03-quantum-quantum-hypertetra-fractal.html +489 -0
- package/docs/vib3-exports/04-faceted-faceted-crystal-structure.html +407 -0
- package/docs/vib3-exports/05-faceted-faceted-klein-bottle.html +407 -0
- package/docs/vib3-exports/06-faceted-faceted-hypertetra-torus.html +407 -0
- package/docs/vib3-exports/07-holographic-holographic-wave-field.html +457 -0
- package/docs/vib3-exports/08-holographic-holographic-hypersphere-sphere.html +457 -0
- package/docs/vib3-exports/09-holographic-holographic-hypertetra-crystal.html +457 -0
- package/docs/vib3-exports/index.html +238 -0
- package/docs/webgpu-live.html +702 -0
- package/package.json +367 -0
- package/src/advanced/AIPresetGenerator.js +777 -0
- package/src/advanced/MIDIController.js +703 -0
- package/src/advanced/OffscreenWorker.js +1051 -0
- package/src/advanced/WebGPUCompute.js +1051 -0
- package/src/advanced/WebXRRenderer.js +680 -0
- package/src/agent/cli/AgentCLI.js +615 -0
- package/src/agent/cli/index.js +14 -0
- package/src/agent/index.js +73 -0
- package/src/agent/mcp/MCPServer.js +950 -0
- package/src/agent/mcp/index.js +9 -0
- package/src/agent/mcp/tools.js +548 -0
- package/src/agent/telemetry/EventStream.js +669 -0
- package/src/agent/telemetry/Instrumentation.js +618 -0
- package/src/agent/telemetry/TelemetryExporters.js +427 -0
- package/src/agent/telemetry/TelemetryService.js +464 -0
- package/src/agent/telemetry/index.js +52 -0
- package/src/benchmarks/BenchmarkRunner.js +381 -0
- package/src/benchmarks/MetricsCollector.js +299 -0
- package/src/benchmarks/index.js +9 -0
- package/src/benchmarks/scenes.js +259 -0
- package/src/cli/index.js +675 -0
- package/src/config/ApiConfig.js +88 -0
- package/src/core/CanvasManager.js +217 -0
- package/src/core/ErrorReporter.js +117 -0
- package/src/core/ParameterMapper.js +333 -0
- package/src/core/Parameters.js +396 -0
- package/src/core/RendererContracts.js +200 -0
- package/src/core/UnifiedResourceManager.js +370 -0
- package/src/core/VIB3Engine.js +636 -0
- package/src/core/renderers/FacetedRendererAdapter.js +32 -0
- package/src/core/renderers/HolographicRendererAdapter.js +29 -0
- package/src/core/renderers/QuantumRendererAdapter.js +29 -0
- package/src/core/renderers/RendererLifecycleManager.js +63 -0
- package/src/creative/ColorPresetsSystem.js +980 -0
- package/src/creative/ParameterTimeline.js +1061 -0
- package/src/creative/PostProcessingPipeline.js +1113 -0
- package/src/creative/TransitionAnimator.js +683 -0
- package/src/export/CSSExporter.js +226 -0
- package/src/export/CardGeneratorBase.js +279 -0
- package/src/export/ExportManager.js +580 -0
- package/src/export/FacetedCardGenerator.js +279 -0
- package/src/export/HolographicCardGenerator.js +543 -0
- package/src/export/LottieExporter.js +552 -0
- package/src/export/QuantumCardGenerator.js +315 -0
- package/src/export/SVGExporter.js +519 -0
- package/src/export/ShaderExporter.js +903 -0
- package/src/export/TradingCardGenerator.js +3055 -0
- package/src/export/TradingCardManager.js +181 -0
- package/src/export/VIB3PackageExporter.js +559 -0
- package/src/export/index.js +14 -0
- package/src/export/systems/TradingCardSystemFaceted.js +494 -0
- package/src/export/systems/TradingCardSystemHolographic.js +452 -0
- package/src/export/systems/TradingCardSystemQuantum.js +411 -0
- package/src/faceted/FacetedSystem.js +963 -0
- package/src/features/CollectionManager.js +433 -0
- package/src/gallery/CollectionManager.js +240 -0
- package/src/gallery/GallerySystem.js +485 -0
- package/src/geometry/GeometryFactory.js +314 -0
- package/src/geometry/GeometryLibrary.js +72 -0
- package/src/geometry/buffers/BufferBuilder.js +338 -0
- package/src/geometry/buffers/index.js +18 -0
- package/src/geometry/generators/Crystal.js +420 -0
- package/src/geometry/generators/Fractal.js +298 -0
- package/src/geometry/generators/KleinBottle.js +197 -0
- package/src/geometry/generators/Sphere.js +192 -0
- package/src/geometry/generators/Tesseract.js +160 -0
- package/src/geometry/generators/Tetrahedron.js +225 -0
- package/src/geometry/generators/Torus.js +304 -0
- package/src/geometry/generators/Wave.js +341 -0
- package/src/geometry/index.js +142 -0
- package/src/geometry/warp/HypersphereCore.js +211 -0
- package/src/geometry/warp/HypertetraCore.js +386 -0
- package/src/geometry/warp/index.js +57 -0
- package/src/holograms/HolographicVisualizer.js +1073 -0
- package/src/holograms/RealHolographicSystem.js +966 -0
- package/src/holograms/variantRegistry.js +69 -0
- package/src/integrations/FigmaPlugin.js +854 -0
- package/src/integrations/OBSMode.js +754 -0
- package/src/integrations/ThreeJsPackage.js +660 -0
- package/src/integrations/TouchDesignerExport.js +552 -0
- package/src/integrations/frameworks/Vib3React.js +591 -0
- package/src/integrations/frameworks/Vib3Svelte.js +654 -0
- package/src/integrations/frameworks/Vib3Vue.js +628 -0
- package/src/llm/LLMParameterInterface.js +240 -0
- package/src/llm/LLMParameterUI.js +577 -0
- package/src/math/Mat4x4.js +708 -0
- package/src/math/Projection.js +341 -0
- package/src/math/Rotor4D.js +637 -0
- package/src/math/Vec4.js +476 -0
- package/src/math/constants.js +164 -0
- package/src/math/index.js +68 -0
- package/src/math/projections.js +54 -0
- package/src/math/rotations.js +196 -0
- package/src/quantum/QuantumEngine.js +906 -0
- package/src/quantum/QuantumVisualizer.js +1103 -0
- package/src/reactivity/ReactivityConfig.js +499 -0
- package/src/reactivity/ReactivityManager.js +586 -0
- package/src/reactivity/SpatialInputSystem.js +1783 -0
- package/src/reactivity/index.js +93 -0
- package/src/render/CommandBuffer.js +465 -0
- package/src/render/MultiCanvasBridge.js +340 -0
- package/src/render/RenderCommand.js +514 -0
- package/src/render/RenderResourceRegistry.js +523 -0
- package/src/render/RenderState.js +552 -0
- package/src/render/RenderTarget.js +512 -0
- package/src/render/ShaderLoader.js +253 -0
- package/src/render/ShaderProgram.js +599 -0
- package/src/render/UnifiedRenderBridge.js +496 -0
- package/src/render/backends/WebGLBackend.js +1108 -0
- package/src/render/backends/WebGPUBackend.js +1409 -0
- package/src/render/commands/CommandBufferExecutor.js +607 -0
- package/src/render/commands/RenderCommandBuffer.js +661 -0
- package/src/render/commands/index.js +17 -0
- package/src/render/index.js +367 -0
- package/src/scene/Disposable.js +498 -0
- package/src/scene/MemoryPool.js +618 -0
- package/src/scene/Node4D.js +697 -0
- package/src/scene/ResourceManager.js +599 -0
- package/src/scene/Scene4D.js +540 -0
- package/src/scene/index.js +98 -0
- package/src/schemas/error.schema.json +84 -0
- package/src/schemas/extension.schema.json +88 -0
- package/src/schemas/index.js +214 -0
- package/src/schemas/parameters.schema.json +142 -0
- package/src/schemas/tool-pack.schema.json +44 -0
- package/src/schemas/tool-response.schema.json +127 -0
- package/src/shaders/common/fullscreen.vert.glsl +5 -0
- package/src/shaders/common/fullscreen.vert.wgsl +17 -0
- package/src/shaders/common/geometry24.glsl +65 -0
- package/src/shaders/common/geometry24.wgsl +54 -0
- package/src/shaders/common/rotation4d.glsl +85 -0
- package/src/shaders/common/rotation4d.wgsl +86 -0
- package/src/shaders/common/uniforms.glsl +44 -0
- package/src/shaders/common/uniforms.wgsl +48 -0
- package/src/shaders/faceted/faceted.frag.glsl +129 -0
- package/src/shaders/faceted/faceted.frag.wgsl +164 -0
- package/src/shaders/holographic/holographic.frag.glsl +406 -0
- package/src/shaders/holographic/holographic.frag.wgsl +185 -0
- package/src/shaders/quantum/quantum.frag.glsl +513 -0
- package/src/shaders/quantum/quantum.frag.wgsl +361 -0
- package/src/testing/ParallelTestFramework.js +519 -0
- package/src/testing/__snapshots__/exportFormats.test.js.snap +24 -0
- package/src/testing/exportFormats.test.js +8 -0
- package/src/testing/projections.test.js +14 -0
- package/src/testing/rotations.test.js +37 -0
- package/src/ui/InteractivityMenu.js +516 -0
- package/src/ui/StatusManager.js +96 -0
- package/src/ui/adaptive/renderers/webgpu/BufferLayout.ts +252 -0
- package/src/ui/adaptive/renderers/webgpu/PolytopeInstanceBuffer.ts +144 -0
- package/src/ui/adaptive/renderers/webgpu/TripleBufferedUniform.ts +170 -0
- package/src/ui/adaptive/renderers/webgpu/WebGPURenderer.ts +735 -0
- package/src/ui/adaptive/renderers/webgpu/index.ts +112 -0
- package/src/variations/VariationManager.js +431 -0
- package/src/viewer/AudioReactivity.js +505 -0
- package/src/viewer/CardBending.js +481 -0
- package/src/viewer/GalleryUI.js +832 -0
- package/src/viewer/ReactivityManager.js +590 -0
- package/src/viewer/TradingCardExporter.js +600 -0
- package/src/viewer/ViewerPortal.js +374 -0
- package/src/viewer/index.js +12 -0
- package/src/wasm/WasmLoader.js +296 -0
- package/src/wasm/index.js +132 -0
- package/tools/agentic/mcpTools.js +88 -0
- package/tools/cli/agent-cli.js +92 -0
- package/tools/export/formats.js +24 -0
- package/tools/math/rotation-baseline.mjs +64 -0
- package/tools/shader-sync-verify.js +937 -0
- package/tools/telemetry/manifestPipeline.js +141 -0
- package/tools/telemetry/telemetryEvents.js +35 -0
- package/types/adaptive-sdk.d.ts +185 -0
- package/types/advanced/AIPresetGenerator.d.ts +81 -0
- package/types/advanced/MIDIController.d.ts +100 -0
- package/types/advanced/OffscreenWorker.d.ts +82 -0
- package/types/advanced/WebGPUCompute.d.ts +52 -0
- package/types/advanced/WebXRRenderer.d.ts +77 -0
- package/types/advanced/index.d.ts +46 -0
- package/types/core/ErrorReporter.d.ts +50 -0
- package/types/core/VIB3Engine.d.ts +204 -0
- package/types/creative/ColorPresetsSystem.d.ts +91 -0
- package/types/creative/ParameterTimeline.d.ts +74 -0
- package/types/creative/PostProcessingPipeline.d.ts +109 -0
- package/types/creative/TransitionAnimator.d.ts +71 -0
- package/types/creative/index.d.ts +35 -0
- package/types/integrations/FigmaPlugin.d.ts +46 -0
- package/types/integrations/OBSMode.d.ts +74 -0
- package/types/integrations/ThreeJsPackage.d.ts +62 -0
- package/types/integrations/TouchDesignerExport.d.ts +36 -0
- package/types/integrations/Vib3React.d.ts +74 -0
- package/types/integrations/Vib3Svelte.d.ts +63 -0
- package/types/integrations/Vib3Vue.d.ts +55 -0
- package/types/integrations/index.d.ts +52 -0
- package/types/reactivity/SpatialInputSystem.d.ts +173 -0
- package/types/reactivity/index.d.ts +394 -0
- package/types/render/CommandBuffer.d.ts +169 -0
- package/types/render/RenderCommand.d.ts +312 -0
- package/types/render/RenderState.d.ts +279 -0
- package/types/render/RenderTarget.d.ts +254 -0
- package/types/render/ShaderProgram.d.ts +277 -0
- package/types/render/UnifiedRenderBridge.d.ts +143 -0
- package/types/render/WebGLBackend.d.ts +168 -0
- package/types/render/WebGPUBackend.d.ts +186 -0
- package/types/render/index.d.ts +141 -0
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Crystal Geometry Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates crystalline structures in 4D space.
|
|
5
|
+
* Includes octahedral, cubic, and higher-dimensional lattice structures.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Vec4 } from '../../math/Vec4.js';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Generate 4D octahedral cross-polytope (16-cell)
|
|
12
|
+
* The 4D analog of an octahedron
|
|
13
|
+
* @param {number} size - Scale factor
|
|
14
|
+
* @returns {Vec4[]} 8 vertices
|
|
15
|
+
*/
|
|
16
|
+
export function generate16CellVertices(size = 1) {
|
|
17
|
+
return [
|
|
18
|
+
new Vec4(size, 0, 0, 0),
|
|
19
|
+
new Vec4(-size, 0, 0, 0),
|
|
20
|
+
new Vec4(0, size, 0, 0),
|
|
21
|
+
new Vec4(0, -size, 0, 0),
|
|
22
|
+
new Vec4(0, 0, size, 0),
|
|
23
|
+
new Vec4(0, 0, -size, 0),
|
|
24
|
+
new Vec4(0, 0, 0, size),
|
|
25
|
+
new Vec4(0, 0, 0, -size)
|
|
26
|
+
];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Generate 16-cell edges
|
|
31
|
+
* Each vertex connects to all others except its opposite
|
|
32
|
+
* @returns {number[][]} 24 edges
|
|
33
|
+
*/
|
|
34
|
+
export function generate16CellEdges() {
|
|
35
|
+
const edges = [];
|
|
36
|
+
// Pairs: (0,1), (2,3), (4,5), (6,7) are opposite vertices
|
|
37
|
+
for (let i = 0; i < 8; i++) {
|
|
38
|
+
for (let j = i + 1; j < 8; j++) {
|
|
39
|
+
// Skip opposite vertices (differ by 1 and i is even)
|
|
40
|
+
if (j === i + 1 && i % 2 === 0) continue;
|
|
41
|
+
edges.push([i, j]);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return edges;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Generate 24-cell vertices (self-dual 4D polytope)
|
|
49
|
+
* @param {number} size - Scale factor
|
|
50
|
+
* @returns {Vec4[]} 24 vertices
|
|
51
|
+
*/
|
|
52
|
+
export function generate24CellVertices(size = 1) {
|
|
53
|
+
const vertices = [];
|
|
54
|
+
const s = size / Math.sqrt(2);
|
|
55
|
+
|
|
56
|
+
// 16 vertices from tesseract edges
|
|
57
|
+
for (let i = 0; i < 4; i++) {
|
|
58
|
+
for (let j = i + 1; j < 4; j++) {
|
|
59
|
+
const signs = [
|
|
60
|
+
[1, 1], [1, -1], [-1, 1], [-1, -1]
|
|
61
|
+
];
|
|
62
|
+
for (const [s1, s2] of signs) {
|
|
63
|
+
const v = new Vec4(0, 0, 0, 0);
|
|
64
|
+
v.data[i] = s1 * s;
|
|
65
|
+
v.data[j] = s2 * s;
|
|
66
|
+
vertices.push(v);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return vertices;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Generate 24-cell edges
|
|
76
|
+
* @returns {number[][]} 96 edges
|
|
77
|
+
*/
|
|
78
|
+
export function generate24CellEdges() {
|
|
79
|
+
const vertices = generate24CellVertices(1);
|
|
80
|
+
const edges = [];
|
|
81
|
+
const edgeLength = 1; // Normalized edge length
|
|
82
|
+
|
|
83
|
+
for (let i = 0; i < vertices.length; i++) {
|
|
84
|
+
for (let j = i + 1; j < vertices.length; j++) {
|
|
85
|
+
const dist = vertices[i].distanceTo(vertices[j]);
|
|
86
|
+
if (Math.abs(dist - edgeLength) < 0.01) {
|
|
87
|
+
edges.push([i, j]);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return edges;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Generate cubic lattice in 4D
|
|
97
|
+
* @param {number} size - Lattice extent
|
|
98
|
+
* @param {number} spacing - Point spacing
|
|
99
|
+
* @returns {Vec4[]} Lattice points
|
|
100
|
+
*/
|
|
101
|
+
export function generateCubicLattice4D(size = 2, spacing = 0.5) {
|
|
102
|
+
const vertices = [];
|
|
103
|
+
const n = Math.floor(size / spacing);
|
|
104
|
+
|
|
105
|
+
for (let x = -n; x <= n; x++) {
|
|
106
|
+
for (let y = -n; y <= n; y++) {
|
|
107
|
+
for (let z = -n; z <= n; z++) {
|
|
108
|
+
for (let w = -n; w <= n; w++) {
|
|
109
|
+
vertices.push(new Vec4(
|
|
110
|
+
x * spacing,
|
|
111
|
+
y * spacing,
|
|
112
|
+
z * spacing,
|
|
113
|
+
w * spacing
|
|
114
|
+
));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return vertices;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Generate FCC (face-centered cubic) lattice extended to 4D
|
|
125
|
+
* @param {number} size - Lattice extent
|
|
126
|
+
* @param {number} spacing - Base spacing
|
|
127
|
+
* @returns {Vec4[]} Lattice points
|
|
128
|
+
*/
|
|
129
|
+
export function generateFCCLattice4D(size = 1.5, spacing = 1) {
|
|
130
|
+
const vertices = [];
|
|
131
|
+
const n = Math.floor(size / spacing);
|
|
132
|
+
const half = spacing / 2;
|
|
133
|
+
|
|
134
|
+
for (let x = -n; x <= n; x++) {
|
|
135
|
+
for (let y = -n; y <= n; y++) {
|
|
136
|
+
for (let z = -n; z <= n; z++) {
|
|
137
|
+
for (let w = -n; w <= n; w++) {
|
|
138
|
+
// Corner positions
|
|
139
|
+
vertices.push(new Vec4(
|
|
140
|
+
x * spacing,
|
|
141
|
+
y * spacing,
|
|
142
|
+
z * spacing,
|
|
143
|
+
w * spacing
|
|
144
|
+
));
|
|
145
|
+
|
|
146
|
+
// Face centers (4D has 6 2-faces meeting at each vertex)
|
|
147
|
+
if (x < n && y < n) {
|
|
148
|
+
vertices.push(new Vec4(
|
|
149
|
+
x * spacing + half,
|
|
150
|
+
y * spacing + half,
|
|
151
|
+
z * spacing,
|
|
152
|
+
w * spacing
|
|
153
|
+
));
|
|
154
|
+
}
|
|
155
|
+
if (x < n && z < n) {
|
|
156
|
+
vertices.push(new Vec4(
|
|
157
|
+
x * spacing + half,
|
|
158
|
+
y * spacing,
|
|
159
|
+
z * spacing + half,
|
|
160
|
+
w * spacing
|
|
161
|
+
));
|
|
162
|
+
}
|
|
163
|
+
if (x < n && w < n) {
|
|
164
|
+
vertices.push(new Vec4(
|
|
165
|
+
x * spacing + half,
|
|
166
|
+
y * spacing,
|
|
167
|
+
z * spacing,
|
|
168
|
+
w * spacing + half
|
|
169
|
+
));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return vertices;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Generate diamond crystal structure in 4D
|
|
181
|
+
* @param {number} size - Crystal size
|
|
182
|
+
* @param {number} spacing - Lattice spacing
|
|
183
|
+
* @returns {object} Vertices and edges
|
|
184
|
+
*/
|
|
185
|
+
export function generateDiamondCrystal4D(size = 1.5, spacing = 1) {
|
|
186
|
+
const vertices = [];
|
|
187
|
+
const edges = [];
|
|
188
|
+
const n = Math.floor(size / spacing);
|
|
189
|
+
const offset = spacing / 4;
|
|
190
|
+
|
|
191
|
+
// Base FCC lattice
|
|
192
|
+
const fcc = generateFCCLattice4D(size, spacing);
|
|
193
|
+
|
|
194
|
+
// Add offset positions (diamond has two interpenetrating FCC lattices)
|
|
195
|
+
for (const v of fcc) {
|
|
196
|
+
vertices.push(v);
|
|
197
|
+
vertices.push(new Vec4(
|
|
198
|
+
v.x + offset,
|
|
199
|
+
v.y + offset,
|
|
200
|
+
v.z + offset,
|
|
201
|
+
v.w + offset
|
|
202
|
+
));
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Connect nearest neighbors
|
|
206
|
+
const bondLength = spacing * Math.sqrt(3) / 4 * 1.1; // With tolerance
|
|
207
|
+
|
|
208
|
+
for (let i = 0; i < vertices.length; i++) {
|
|
209
|
+
for (let j = i + 1; j < vertices.length; j++) {
|
|
210
|
+
const dist = vertices[i].distanceTo(vertices[j]);
|
|
211
|
+
if (dist < bondLength && dist > 0.01) {
|
|
212
|
+
edges.push([i, j]);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return { vertices, edges };
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Generate quasicrystal pattern in 4D (Penrose-like)
|
|
222
|
+
* Uses projection from higher-dimensional lattice
|
|
223
|
+
* @param {number} size - Pattern size
|
|
224
|
+
* @param {number} density - Point density
|
|
225
|
+
* @returns {Vec4[]} Vertices
|
|
226
|
+
*/
|
|
227
|
+
export function generateQuasicrystal4D(size = 2, density = 10) {
|
|
228
|
+
const vertices = [];
|
|
229
|
+
const n = density;
|
|
230
|
+
|
|
231
|
+
// Golden ratio for quasicrystal symmetry
|
|
232
|
+
const phi = (1 + Math.sqrt(5)) / 2;
|
|
233
|
+
|
|
234
|
+
// Generate points using icosahedral projection
|
|
235
|
+
for (let i = -n; i <= n; i++) {
|
|
236
|
+
for (let j = -n; j <= n; j++) {
|
|
237
|
+
for (let k = -n; k <= n; k++) {
|
|
238
|
+
// Project from 6D to 4D using golden ratio
|
|
239
|
+
const x = (i + phi * j) / n * size;
|
|
240
|
+
const y = (j + phi * k) / n * size;
|
|
241
|
+
const z = (k + phi * i) / n * size;
|
|
242
|
+
const w = (i - j + k) / (n * 2) * size;
|
|
243
|
+
|
|
244
|
+
// Keep points within bounds
|
|
245
|
+
const len = Math.sqrt(x * x + y * y + z * z + w * w);
|
|
246
|
+
if (len <= size * 1.5) {
|
|
247
|
+
vertices.push(new Vec4(x, y, z, w));
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return vertices;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Generate crystal unit cell with specified symmetry
|
|
258
|
+
* @param {string} type - 'cubic', 'tetragonal', 'orthorhombic', 'hexagonal'
|
|
259
|
+
* @param {number} size - Cell size
|
|
260
|
+
* @returns {object} Vertices and edges
|
|
261
|
+
*/
|
|
262
|
+
export function generateUnitCell4D(type = 'cubic', size = 1) {
|
|
263
|
+
const vertices = [];
|
|
264
|
+
const edges = [];
|
|
265
|
+
|
|
266
|
+
switch (type) {
|
|
267
|
+
case 'cubic':
|
|
268
|
+
// Regular 4D hypercube unit cell
|
|
269
|
+
for (let x = 0; x <= 1; x++) {
|
|
270
|
+
for (let y = 0; y <= 1; y++) {
|
|
271
|
+
for (let z = 0; z <= 1; z++) {
|
|
272
|
+
for (let w = 0; w <= 1; w++) {
|
|
273
|
+
vertices.push(new Vec4(
|
|
274
|
+
x * size, y * size, z * size, w * size
|
|
275
|
+
));
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
break;
|
|
281
|
+
|
|
282
|
+
case 'tetragonal':
|
|
283
|
+
// Stretched in W direction
|
|
284
|
+
for (let x = 0; x <= 1; x++) {
|
|
285
|
+
for (let y = 0; y <= 1; y++) {
|
|
286
|
+
for (let z = 0; z <= 1; z++) {
|
|
287
|
+
for (let w = 0; w <= 1; w++) {
|
|
288
|
+
vertices.push(new Vec4(
|
|
289
|
+
x * size, y * size, z * size, w * size * 1.5
|
|
290
|
+
));
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
break;
|
|
296
|
+
|
|
297
|
+
case 'hexagonal':
|
|
298
|
+
// Hexagonal base with W extension
|
|
299
|
+
const angles = [0, Math.PI / 3, 2 * Math.PI / 3,
|
|
300
|
+
Math.PI, 4 * Math.PI / 3, 5 * Math.PI / 3];
|
|
301
|
+
for (const angle of angles) {
|
|
302
|
+
for (let z = 0; z <= 1; z++) {
|
|
303
|
+
for (let w = 0; w <= 1; w++) {
|
|
304
|
+
vertices.push(new Vec4(
|
|
305
|
+
Math.cos(angle) * size,
|
|
306
|
+
Math.sin(angle) * size,
|
|
307
|
+
z * size,
|
|
308
|
+
w * size
|
|
309
|
+
));
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// Center vertices
|
|
314
|
+
for (let z = 0; z <= 1; z++) {
|
|
315
|
+
for (let w = 0; w <= 1; w++) {
|
|
316
|
+
vertices.push(new Vec4(0, 0, z * size, w * size));
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
break;
|
|
320
|
+
|
|
321
|
+
default:
|
|
322
|
+
// Default to cubic
|
|
323
|
+
return generateUnitCell4D('cubic', size);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// Generate edges for unit cell (connect nearest neighbors)
|
|
327
|
+
const maxEdge = size * 1.1;
|
|
328
|
+
for (let i = 0; i < vertices.length; i++) {
|
|
329
|
+
for (let j = i + 1; j < vertices.length; j++) {
|
|
330
|
+
const dist = vertices[i].distanceTo(vertices[j]);
|
|
331
|
+
if (dist <= maxEdge && dist > 0.01) {
|
|
332
|
+
edges.push([i, j]);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
return { vertices, edges };
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Generate crystal edges based on nearest neighbors
|
|
342
|
+
* @param {Vec4[]} vertices
|
|
343
|
+
* @param {number} bondLength - Maximum bond length
|
|
344
|
+
* @returns {number[][]} Edge pairs
|
|
345
|
+
*/
|
|
346
|
+
export function generateCrystalEdges(vertices, bondLength = 0.6) {
|
|
347
|
+
const edges = [];
|
|
348
|
+
|
|
349
|
+
for (let i = 0; i < vertices.length; i++) {
|
|
350
|
+
for (let j = i + 1; j < vertices.length; j++) {
|
|
351
|
+
const dist = vertices[i].distanceTo(vertices[j]);
|
|
352
|
+
if (dist <= bondLength && dist > 0.001) {
|
|
353
|
+
edges.push([i, j]);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
return edges;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Generate complete crystal geometry
|
|
363
|
+
* @param {string} type - '16cell', '24cell', 'cubic', 'fcc', 'diamond', 'quasicrystal'
|
|
364
|
+
* @param {number} scale - Overall scale
|
|
365
|
+
* @param {object} params - Additional parameters
|
|
366
|
+
* @returns {object} Geometry
|
|
367
|
+
*/
|
|
368
|
+
export function generateCrystal(type = '16cell', scale = 1, params = {}) {
|
|
369
|
+
let vertices, edges;
|
|
370
|
+
|
|
371
|
+
switch (type) {
|
|
372
|
+
case '16cell':
|
|
373
|
+
vertices = generate16CellVertices(scale);
|
|
374
|
+
edges = generate16CellEdges();
|
|
375
|
+
break;
|
|
376
|
+
|
|
377
|
+
case '24cell':
|
|
378
|
+
vertices = generate24CellVertices(scale);
|
|
379
|
+
edges = generate24CellEdges();
|
|
380
|
+
break;
|
|
381
|
+
|
|
382
|
+
case 'cubic':
|
|
383
|
+
vertices = generateCubicLattice4D(scale, params.spacing || 0.5);
|
|
384
|
+
edges = generateCrystalEdges(vertices, (params.spacing || 0.5) * 1.1);
|
|
385
|
+
break;
|
|
386
|
+
|
|
387
|
+
case 'fcc':
|
|
388
|
+
vertices = generateFCCLattice4D(scale, params.spacing || 1);
|
|
389
|
+
edges = generateCrystalEdges(vertices, (params.spacing || 1) * 0.8);
|
|
390
|
+
break;
|
|
391
|
+
|
|
392
|
+
case 'diamond':
|
|
393
|
+
const diamond = generateDiamondCrystal4D(scale, params.spacing || 1);
|
|
394
|
+
vertices = diamond.vertices;
|
|
395
|
+
edges = diamond.edges;
|
|
396
|
+
break;
|
|
397
|
+
|
|
398
|
+
case 'quasicrystal':
|
|
399
|
+
vertices = generateQuasicrystal4D(scale, params.density || 10);
|
|
400
|
+
edges = generateCrystalEdges(vertices, scale * 0.3);
|
|
401
|
+
break;
|
|
402
|
+
|
|
403
|
+
default:
|
|
404
|
+
vertices = generate16CellVertices(scale);
|
|
405
|
+
edges = generate16CellEdges();
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
return {
|
|
409
|
+
name: `crystal_${type}`,
|
|
410
|
+
vertices,
|
|
411
|
+
edges,
|
|
412
|
+
faces: [],
|
|
413
|
+
vertexCount: vertices.length,
|
|
414
|
+
edgeCount: edges.length,
|
|
415
|
+
faceCount: 0,
|
|
416
|
+
crystalType: type
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
export default generateCrystal;
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fractal Geometry Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates recursive fractal structures in 4D space.
|
|
5
|
+
* Uses Menger sponge and Sierpinski-like constructions extended to 4D.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Vec4 } from '../../math/Vec4.js';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Generate 4D Sierpinski simplex (pentatope fractal)
|
|
12
|
+
* @param {number} depth - Recursion depth (0-4 recommended)
|
|
13
|
+
* @param {number} scale - Overall scale
|
|
14
|
+
* @returns {Vec4[]} Vertices
|
|
15
|
+
*/
|
|
16
|
+
export function generateSierpinskiPentatope(depth = 2, scale = 1) {
|
|
17
|
+
// Base pentatope vertices (5-cell)
|
|
18
|
+
const baseVertices = [
|
|
19
|
+
new Vec4(1, 1, 1, -1 / Math.sqrt(5)).scale(scale),
|
|
20
|
+
new Vec4(1, -1, -1, -1 / Math.sqrt(5)).scale(scale),
|
|
21
|
+
new Vec4(-1, 1, -1, -1 / Math.sqrt(5)).scale(scale),
|
|
22
|
+
new Vec4(-1, -1, 1, -1 / Math.sqrt(5)).scale(scale),
|
|
23
|
+
new Vec4(0, 0, 0, Math.sqrt(5) - 1 / Math.sqrt(5)).scale(scale)
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
if (depth === 0) {
|
|
27
|
+
return baseVertices;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const vertices = [];
|
|
31
|
+
|
|
32
|
+
// Recursive subdivision
|
|
33
|
+
function subdivide(verts, d) {
|
|
34
|
+
if (d === 0) {
|
|
35
|
+
vertices.push(...verts);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Find midpoints and create 5 smaller pentatopes
|
|
40
|
+
const midpoints = [];
|
|
41
|
+
for (let i = 0; i < 5; i++) {
|
|
42
|
+
for (let j = i + 1; j < 5; j++) {
|
|
43
|
+
midpoints.push(verts[i].lerp(verts[j], 0.5));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Create 5 sub-pentatopes at each vertex
|
|
48
|
+
for (let i = 0; i < 5; i++) {
|
|
49
|
+
const subVerts = [verts[i]];
|
|
50
|
+
// Find midpoints connected to vertex i
|
|
51
|
+
let idx = 0;
|
|
52
|
+
for (let j = 0; j < 5; j++) {
|
|
53
|
+
for (let k = j + 1; k < 5; k++) {
|
|
54
|
+
if (j === i || k === i) {
|
|
55
|
+
subVerts.push(midpoints[idx]);
|
|
56
|
+
}
|
|
57
|
+
idx++;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (subVerts.length >= 5) {
|
|
61
|
+
subdivide(subVerts.slice(0, 5), d - 1);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
subdivide(baseVertices, depth);
|
|
67
|
+
return vertices;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Generate 4D Menger sponge analog
|
|
72
|
+
* @param {number} depth - Recursion depth (0-3 recommended)
|
|
73
|
+
* @param {number} scale - Overall scale
|
|
74
|
+
* @returns {Vec4[]} Vertices
|
|
75
|
+
*/
|
|
76
|
+
export function generateMengerHypersponge(depth = 1, scale = 1) {
|
|
77
|
+
const vertices = [];
|
|
78
|
+
|
|
79
|
+
function addCube(center, size, d) {
|
|
80
|
+
if (d === 0) {
|
|
81
|
+
// Add 16 vertices of this hypercube
|
|
82
|
+
for (let x = -1; x <= 1; x += 2) {
|
|
83
|
+
for (let y = -1; y <= 1; y += 2) {
|
|
84
|
+
for (let z = -1; z <= 1; z += 2) {
|
|
85
|
+
for (let w = -1; w <= 1; w += 2) {
|
|
86
|
+
vertices.push(new Vec4(
|
|
87
|
+
center.x + x * size,
|
|
88
|
+
center.y + y * size,
|
|
89
|
+
center.z + z * size,
|
|
90
|
+
center.w + w * size
|
|
91
|
+
));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Subdivide into 3x3x3x3 = 81 sub-cubes
|
|
100
|
+
// Remove center and face-adjacent cubes (Menger rule extended to 4D)
|
|
101
|
+
const subSize = size / 3;
|
|
102
|
+
|
|
103
|
+
for (let x = -1; x <= 1; x++) {
|
|
104
|
+
for (let y = -1; y <= 1; y++) {
|
|
105
|
+
for (let z = -1; z <= 1; z++) {
|
|
106
|
+
for (let w = -1; w <= 1; w++) {
|
|
107
|
+
// Count how many coordinates are 0 (center)
|
|
108
|
+
const zeros = (x === 0 ? 1 : 0) +
|
|
109
|
+
(y === 0 ? 1 : 0) +
|
|
110
|
+
(z === 0 ? 1 : 0) +
|
|
111
|
+
(w === 0 ? 1 : 0);
|
|
112
|
+
|
|
113
|
+
// Skip if 2 or more coordinates are 0 (hollow center)
|
|
114
|
+
if (zeros >= 2) continue;
|
|
115
|
+
|
|
116
|
+
const subCenter = new Vec4(
|
|
117
|
+
center.x + x * subSize * 2,
|
|
118
|
+
center.y + y * subSize * 2,
|
|
119
|
+
center.z + z * subSize * 2,
|
|
120
|
+
center.w + w * subSize * 2
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
addCube(subCenter, subSize, d - 1);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
addCube(Vec4.zero(), scale, depth);
|
|
131
|
+
return vertices;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Generate fractal tree in 4D
|
|
136
|
+
* @param {number} depth - Recursion depth
|
|
137
|
+
* @param {number} length - Initial branch length
|
|
138
|
+
* @param {number} angle - Branch angle
|
|
139
|
+
* @returns {object} Vertices and edges
|
|
140
|
+
*/
|
|
141
|
+
export function generateFractalTree4D(depth = 4, length = 1, angle = Math.PI / 6) {
|
|
142
|
+
const vertices = [Vec4.zero()];
|
|
143
|
+
const edges = [];
|
|
144
|
+
|
|
145
|
+
function branch(startIdx, dir, len, d) {
|
|
146
|
+
if (d === 0 || len < 0.01) return;
|
|
147
|
+
|
|
148
|
+
const startVert = vertices[startIdx];
|
|
149
|
+
const endVert = startVert.add(dir.scale(len));
|
|
150
|
+
const endIdx = vertices.length;
|
|
151
|
+
vertices.push(endVert);
|
|
152
|
+
edges.push([startIdx, endIdx]);
|
|
153
|
+
|
|
154
|
+
// Branch in all 4D rotation planes
|
|
155
|
+
const planes = [
|
|
156
|
+
{ cos: Math.cos(angle), sin: Math.sin(angle), axes: ['x', 'y'] },
|
|
157
|
+
{ cos: Math.cos(angle), sin: Math.sin(angle), axes: ['x', 'z'] },
|
|
158
|
+
{ cos: Math.cos(angle), sin: Math.sin(angle), axes: ['x', 'w'] },
|
|
159
|
+
{ cos: Math.cos(-angle), sin: Math.sin(-angle), axes: ['y', 'z'] }
|
|
160
|
+
];
|
|
161
|
+
|
|
162
|
+
const decay = 0.7;
|
|
163
|
+
|
|
164
|
+
for (const plane of planes) {
|
|
165
|
+
const newDir = rotateVector(dir, plane);
|
|
166
|
+
branch(endIdx, newDir, len * decay, d - 1);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function rotateVector(v, plane) {
|
|
171
|
+
const result = v.clone();
|
|
172
|
+
const a1 = plane.axes[0];
|
|
173
|
+
const a2 = plane.axes[1];
|
|
174
|
+
const v1 = v[a1];
|
|
175
|
+
const v2 = v[a2];
|
|
176
|
+
result[a1] = v1 * plane.cos - v2 * plane.sin;
|
|
177
|
+
result[a2] = v1 * plane.sin + v2 * plane.cos;
|
|
178
|
+
return result;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Start branches in positive W direction
|
|
182
|
+
branch(0, new Vec4(0, 1, 0, 0.5).normalize(), length, depth);
|
|
183
|
+
|
|
184
|
+
return { vertices, edges };
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Generate Cantor dust in 4D (hypercube subdivision)
|
|
189
|
+
* @param {number} depth - Recursion depth
|
|
190
|
+
* @param {number} scale - Overall scale
|
|
191
|
+
* @returns {Vec4[]} Point cloud
|
|
192
|
+
*/
|
|
193
|
+
export function generateCantorDust4D(depth = 3, scale = 1) {
|
|
194
|
+
const points = [];
|
|
195
|
+
|
|
196
|
+
function subdivide(center, size, d) {
|
|
197
|
+
if (d === 0) {
|
|
198
|
+
points.push(center);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const subSize = size / 3;
|
|
203
|
+
|
|
204
|
+
// Only keep corners (Cantor rule: remove middle third)
|
|
205
|
+
for (let x = -1; x <= 1; x += 2) {
|
|
206
|
+
for (let y = -1; y <= 1; y += 2) {
|
|
207
|
+
for (let z = -1; z <= 1; z += 2) {
|
|
208
|
+
for (let w = -1; w <= 1; w += 2) {
|
|
209
|
+
const subCenter = new Vec4(
|
|
210
|
+
center.x + x * subSize * 2,
|
|
211
|
+
center.y + y * subSize * 2,
|
|
212
|
+
center.z + z * subSize * 2,
|
|
213
|
+
center.w + w * subSize * 2
|
|
214
|
+
);
|
|
215
|
+
subdivide(subCenter, subSize, d - 1);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
subdivide(Vec4.zero(), scale, depth);
|
|
223
|
+
return points;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Generate fractal edges for a vertex set
|
|
228
|
+
* @param {Vec4[]} vertices
|
|
229
|
+
* @param {number} maxDistance - Maximum edge distance
|
|
230
|
+
* @returns {number[][]} Edge pairs
|
|
231
|
+
*/
|
|
232
|
+
export function generateFractalEdges(vertices, maxDistance = 0.5) {
|
|
233
|
+
const edges = [];
|
|
234
|
+
const n = vertices.length;
|
|
235
|
+
|
|
236
|
+
for (let i = 0; i < n; i++) {
|
|
237
|
+
for (let j = i + 1; j < n; j++) {
|
|
238
|
+
const dist = vertices[i].distanceTo(vertices[j]);
|
|
239
|
+
if (dist < maxDistance && dist > 0.001) {
|
|
240
|
+
edges.push([i, j]);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
return edges;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Generate complete fractal geometry
|
|
250
|
+
* @param {string} type - 'sierpinski', 'menger', 'tree', 'cantor'
|
|
251
|
+
* @param {number} depth - Recursion depth
|
|
252
|
+
* @param {number} scale - Overall scale
|
|
253
|
+
* @returns {object} Geometry
|
|
254
|
+
*/
|
|
255
|
+
export function generateFractal(type = 'sierpinski', depth = 2, scale = 1) {
|
|
256
|
+
let vertices, edges;
|
|
257
|
+
|
|
258
|
+
switch (type) {
|
|
259
|
+
case 'sierpinski':
|
|
260
|
+
vertices = generateSierpinskiPentatope(depth, scale);
|
|
261
|
+
edges = generateFractalEdges(vertices, scale * 0.8);
|
|
262
|
+
break;
|
|
263
|
+
|
|
264
|
+
case 'menger':
|
|
265
|
+
vertices = generateMengerHypersponge(depth, scale);
|
|
266
|
+
edges = generateFractalEdges(vertices, scale * 0.4 / Math.pow(3, depth));
|
|
267
|
+
break;
|
|
268
|
+
|
|
269
|
+
case 'tree':
|
|
270
|
+
const tree = generateFractalTree4D(depth, scale);
|
|
271
|
+
vertices = tree.vertices;
|
|
272
|
+
edges = tree.edges;
|
|
273
|
+
break;
|
|
274
|
+
|
|
275
|
+
case 'cantor':
|
|
276
|
+
vertices = generateCantorDust4D(depth, scale);
|
|
277
|
+
edges = generateFractalEdges(vertices, scale * 0.3);
|
|
278
|
+
break;
|
|
279
|
+
|
|
280
|
+
default:
|
|
281
|
+
vertices = generateSierpinskiPentatope(depth, scale);
|
|
282
|
+
edges = generateFractalEdges(vertices, scale * 0.8);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
return {
|
|
286
|
+
name: `fractal_${type}`,
|
|
287
|
+
vertices,
|
|
288
|
+
edges,
|
|
289
|
+
faces: [],
|
|
290
|
+
vertexCount: vertices.length,
|
|
291
|
+
edgeCount: edges.length,
|
|
292
|
+
faceCount: 0,
|
|
293
|
+
fractalDepth: depth,
|
|
294
|
+
fractalType: type
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
export default generateFractal;
|