दस्तावेज़
मेष और सीएसजी कर्नेल
पैरामीट्रिक ठोस पदार्थों से बंद त्रिकोण जाल, उत्तल तेज पथ के साथ बीएसपी बूलियन, सफाई और टोपोलॉजी जांच।
अंग्रेज़ी से स्वचालित रूप से अनुवादित। अंग्रेज़ी मूल देखें
मेश कर्नेल क्या है
मेश कर्नेल बंद त्रिकोण मेश पर काम करता है: यह उन्हें पैरामीट्रिक प्रिमिटिव से बनाता है (meshOf), उन्हें मापता है (meshVolume, meshBounds, meshTopology), और उन्हें बूलियन्स के साथ जोड़ता है (booleanMesh, booleanAll). यह वही है जो व्यूपोर्ट दिखाता है, सीएएम जनरेटर मशीन क्या करती है, और एसटीएल निर्यात क्या लिखता है।
यह सटीक सीमा प्रतिनिधित्व नहीं है. एक सिलेंडर जिसे काटा गया था वह एक पहलू वाला सिलेंडर रहता है, और इसमें फ़िललेट या मापने के लिए कोई फेस टोपोलॉजी नहीं होती है। सटीक चेहरों, फ़िललेट्स, द्रव्यमान गुणों और STEP के लिए, बी-प्रतिनिधि कर्नेल कोड का एक अलग टुकड़ा है.
| फ़ाइल | पंक्तियां | भूमिका |
|---|---|---|
cad/solid.ts | 659 | ठोस स्कीमा (बॉक्स, सिलेंडर, गोला, शंकु, टोरस, एक्सट्रूड, रिवॉल्व), मेशऑफ़, मेशवॉल्यूम, मेशबाउंड्स |
cad/csg.ts | 459 | बीएसपी बूलियन्स, उत्तल वर्गीकरणकर्ता, अनुवाद/घुमाएँ/विलय करें |
cad/mesh-clean.ts | 626 | वेल्ड, टी-जंक्शन मरम्मत, समतलीय विलय, पुनः त्रिकोणीकरण |
cad/mesh-topology.ts | 110 | कई गुना, गोले, जीनस, मात्रा, क्षेत्र |
cad/triangulate.ts | 383 | बहुभुज-छिद्रों वाला त्रिभुज |
मेष प्रकार और आदिम
export interface Mesh {
readonly positions: Float32Array // x, y, z per vertex
readonly indices: Uint32Array // three per triangle, counter-clockwise seen from outside
}
export const meshOf: (solid: Solid, tolerance?: number /* 0.1 mm */) => Mesh
export const meshVolume: (mesh: Mesh) => number // signed; positive when outward-facing
export const meshBounds: (mesh: Mesh) => SolidBounds | ठोस | खेत | सीमाएं |
|---|---|---|
| डिब्बा | मूल, आकार {x, y, z} | आकार > 0 |
| सिलेंडर | मूल, त्रिज्या, ऊंचाई, खंड, अक्ष? | खंड 3–512; अक्ष z | एक्स | य |
| गोला | केंद्र, त्रिज्या, वलय | अंगूठियां 2–256 |
| कोन | मूल, आधार त्रिज्या, शीर्ष त्रिज्या, ऊंचाई, खंड, अक्ष? | टॉपरेडियस ≥ 0; खंड 3–512 |
| टोरस्र्स | केंद्र, प्रमुख त्रिज्या, लघु त्रिज्या, घूर्णन?, प्रमुख खंड, लघु खंड, अक्ष? | 3–512 और 3–256 |
| बाहर निकालना | प्रोफ़ाइल (≥ 3 अंक, बंद नहीं), ऊंचाई, मूल? | xY में प्रोफ़ाइल |
| घूमना | प्रोफ़ाइल (≥ 2 अंक XZ में), कोण, खंड? | z के बारे में; खंड 3–512, डिफ़ॉल्ट 16 |
segments और rings न्यूनतम हैं: meshOf उन्हें तब तक उठाता है जब तक कि कॉर्ड त्रुटि भीतर न हो जाए tolerance, using step = 4·asin(√(min(1, tol/r)/2)). Two budgets stop runaway tolerances.
| रक्षक | कीमत | त्रुटि संदेश |
|---|---|---|
| सहनशीलता सकारात्मक और सीमित होनी चाहिए | — | मेष सहनशीलता सकारात्मक और सीमित होनी चाहिए |
| प्रति वक्र खंड | 65 536 | मेष सहनशीलता उपखंड बजट से अधिक है |
| ग्रिड पंक्तियाँ × स्तंभ (गोलाकार, टोरस, घूमना) | 1 000 000 | मेष सहनशीलता शीर्ष बजट से अधिक है |
एक Ø6 सिलेंडर के साथ segments: 24 सहनशीलता पर 0.05 96 त्रिभुजों (24 भुजाओं, दो 24-गॉन कैप) के साथ निकला; एक Ø20 एक 128 के साथ, क्योंकि बड़े त्रिज्या को 32 के भीतर रहने के लिए 0 खंडों की आवश्यकता होती है।05 मिमी।
बाइनरी स्पेस विभाजन द्वारा बूलियन्स
प्रत्येक ऑपरेंड एक क्लासिफायरियर बन जाता है। एक सामान्य जाल को एक बीएसपी पेड़ मिलता है; एक उत्तल जाल (बंद, जुड़ा हुआ, प्रत्येक किनारा उत्तल) केवल इसका अलग चेहरा विमान है, इसलिए एक बॉक्स छह विमान है और दस हजार त्रिकोणों का एक क्षेत्र द्विघात श्रृंखला के निर्माण के बिना वर्गीकृत किया जाता है, जिसमें एक उत्तल ठोस का बीएसपी पतित होता है। बहुभुजों को सूचियों के रूप में वर्गीकृत किया जाता है, और अन्य ऑपरेंड के बाउंडिंग बॉक्स से दूर एक बहुभुज को बिना कुछ भी चलाए रखा या गिराया जाता है।
- If either mesh is empty, or the bounding boxes do not meet (within tolerance), answer directly: union = merge, subtract = a, intersect = empty.
- ए और बी (उत्तल तल या बीएसपी) के क्लासिफायर का निर्माण करें।
- संघ: A को B के बाहर, B को A के बाहर रखें, और B के चेहरों को A की ओर इंगित करते हुए संयोग से हटा दें, इसलिए एक साझा चेहरा एक बार रखा जाता है।
- Subtract and intersect follow the classic a.clipTo(b), b.clipTo(a), b.invert() sequence on polygon lists, without copying trees.
- बहुभुज सूप साफ़ करें: max(10·eps, 1e-9·size) के भीतर बिंदु वेल्ड करें, T-जंक्शन बंद करें, स्लिवरों के बीच 1e-4·size तक के अंतराल बंद करें, समतलीय टुकड़े मिलाएँ और पुनः त्रिभुजन करें।
export type BooleanOp = "union" | "subtract" | "intersect"
export interface CsgOptions {
/** Distance below which a point counts as on a plane, mm. Default 1e-7 × the larger extent. */
readonly tolerance?: number
/** Merge coplanar fragments and re-triangulate (default true). */
readonly mergeCoplanar?: boolean
}
export const booleanMesh: (a: Mesh, b: Mesh, op: BooleanOp, options?: CsgOptions) => Mesh
/** Union reduced as a balanced tree; subtract and intersect fold left to right. */
export const booleanAll: (meshes: ReadonlyArray<Mesh>, op: BooleanOp, options?: CsgOptions) => Mesh
export const translateMesh: (mesh: Mesh, dx: number, dy: number, dz: number) => Mesh
export const rotateMesh: (mesh: Mesh, axis: V3, radians: number, origin?: V3) => Mesh
export const mergeMeshes: (meshes: ReadonlyArray<Mesh>) => Mesh त्रिकोण की गिनती सुविधाओं के साथ बढ़ती है, बूलियन की संख्या के साथ नहीं: मर्ज चरण समतलीय स्लिवर्स को पूरे चेहरों में वापस रखता है। ऊपर की प्लेट में, बॉक्स में 12 त्रिकोण थे, चार छेदों के बाद 412, बॉस के बाद 540, बोर के बाद 640; पूरी शृंखला 96 एमएस में चली।
घुमावदार इनपुट पर संघ, घटाव, प्रतिच्छेद
A 20 mm cube at the origin against a sphere of radius 12 centred on its far corner (20, 20, 20), meshed at tolerance 0.2 (624 triangles). Real volumes:
| परिणाम | आयतन, मिमी³ | त्रिकोण |
|---|---|---|
| अकेले क्षेत्र | 7 063.84 (सटीक 7 238.23) | 624 |
| घन ∩ गोला | 882.98 | 112 |
| घन ∪ गोला | 14 180.86 | — |
| घन - गोला | 7 117.02 | — |
जांचें: 8 000 + 7 063.84 − 882.98 = 14 180.86 और 8 000 − 882.98 = 7 117.02, इसलिए तीन परिणाम सौवें तक एक-दूसरे के अनुरूप हैं। गोलाकार जाल स्वयं सटीक गोले के नीचे 2.4 % है, जो मोटे सहनशीलता का पहलू है, न कि बूलियन त्रुटि।
टोपोलॉजी जांच
meshTopology शीर्षों, किनारों और त्रिकोणों को गिनता है, सीमा, गैर-मैनिफोल्ड और गलत-उन्मुख किनारों को ढूंढता है, त्रिकोणों और कोशों को विकृत करता है, और यूलर विशेषता और जीनस प्राप्त करता है। describeTopology सहायक और व्यूपोर्ट उपयोग के लिए एक-पंक्ति सारांश प्रिंट करता है।
{"vertices":312,"triangles":640,"edges":960,"boundaryEdges":0,"nonManifoldEdges":0,
"misorientedEdges":0,"degenerateTriangles":0,"shells":1,"eulerCharacteristic":-8,"genus":5,
"closed":true,"solid":true,"volume":23981.43509870267,"area":8238.640705862534}
// describeTopology → "closed solid, 1 shell, genus 5, 640 triangles, V 23981.4 mm³, A 8238.6 mm²" V − E + F = 312 − 960 + 640 = −8 = 2 − 2g, so g = 5: the four drilled holes plus the bore, which runs through the boss and the plate.
बहुभुज त्रिभुज
triangulatePolygon(outer, holes) बाहरी रिंग और छिद्रों के संयोजन में सूचकांक त्रिगुण लौटाता है। एक 4 × 4 छेद वाला एक वर्ग जिसमें 2 × 2 छेद होता है, आठ त्रिकोण देता है:
triangulatePolygon(
[{x:0,y:0},{x:4,y:0},{x:4,y:4},{x:0,y:4}],
[[{x:1,y:1},{x:1,y:3},{x:3,y:3},{x:3,y:1}]])
// [[0,4,5],[7,4,0],[3,0,5],[7,0,1],[2,3,5],[6,7,1],[2,5,6],[6,1,2]] triangulatePolygonChecked रिटर्न undefined आंशिक परिणाम के बजाय जब इनपुट को त्रिकोणित नहीं किया जा सकता (स्वयं-प्रतिच्छेदी रिंग, बाहरी रिंग के बाहर छेद)।
समस्या निवारण
| लक्षण | कारण | हल करना |
|---|---|---|
| बूलियन परिणाम में छेद या उलटे फलक होते हैं | कोई इनपुट दक्षिणावर्त दिशा में खुला है या लपेटा हुआ है | मेशटोपोलॉजी के साथ दोनों इनपुट की जाँच करें: borderEdges औरmisorientedEdges 0 होने चाहिए |
| दोनों ऑपरेंड द्वारा साझा किया गया एक चेहरा गायब है या दोगुना हो गया है | चेहरे लगभग हैं लेकिन बिल्कुल मेल नहीं खाते (सहिष्णुता से अधिक दूर) | ऑपरेंड को एक ही तल पर स्नैप करें, या CsgOptions.tolerance बढ़ाएँ |
| रेंजत्रुटि: मेष सहनशीलता उपविभाजन बजट से अधिक है | त्रिज्या के लिए सहनशीलता बहुत अच्छी है | सहनशीलता प्रीसेट का उपयोग करें (0.1 से 0.0005 मिमी) |
| आयतन सूत्र से भिन्न है | मोटे सहनशीलता पर पहलू | बेहतर जाल, या सटीक द्रव्यमान गुणों के लिए बी-रेप कर्नेल का उपयोग करें |
| कई उपकरणों पर बूलियन धीमा | सबसे पहले उपकरणों का संघ बनाया गया | उपकरणों को एक-एक करके घटाएं (बूलियनऑल ऐसा करता है): प्रत्येक उत्तल उपकरण मुट्ठी भर विमानों का होता है |