الوثائق
شبكة ونواة CSG
يتشابك المثلث المغلق من المواد الصلبة البارامترية، والقيم المنطقية BSP مع مسار سريع محدب، وفحص التنظيف والطوبولوجيا.
مترجم تلقائيًا من الإنجليزية. عرض الأصل بالإنجليزية
ما هي نواة الشبكة
تعمل نواة الشبكة على شبكات مثلثة مغلقة: فهي تبنيها من البدائيات البارامترية (meshOf)، يقيسها (meshVolume, meshBounds, meshTopology)، ويجمعها مع القيم المنطقية (booleanMesh, booleanAll). هذا ما يظهره إطار العرض، وما تكتبه آلة مولدات CAM، وما يكتبه تصدير STL.
إنه ليس تمثيلًا دقيقًا للحدود. تظل الأسطوانة التي تم قطعها أسطوانة متعددة الأوجه، ولا توجد طوبولوجيا وجه يمكن تقطيعها أو قياسها. بالنسبة للوجوه الدقيقة والشرائح وخصائص الكتلة وSTEP، فإن نواة B-rep هو جزء منفصل من التعليمات البرمجية.
| ملف | خطوط | دور |
|---|---|---|
cad/solid.ts | 659 | المخططات الصلبة (Box، Cylinder، Sphere، Cone، Torus، Extrude، Revolve)، MeshOf، MeshVolume، MeshBounds |
cad/csg.ts | 459 | BSP المنطقية، المصنف المحدب، ترجمة/تدوير/دمج |
cad/mesh-clean.ts | 626 | اللحام، إصلاح الوصلة T، الدمج المستوي، إعادة التثليث |
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; المحور ض | س | ذ |
| جسم كروي | المركز، نصف القطر، الحلقات | حلقات 2–256 |
| مخروط | الأصل، baseRadius، topRadius، الارتفاع، القطاعات، المحور؟ | نصف القطر العلوي ≥ 0; المقاطع 3–512 |
| تورس | مركز، نصف قطر رئيسي، نصف قطر صغير، دوران؟، شرائح رئيسية، شرائح ثانوية، محور؟ | 3–512 و 3–256 |
| بثق | الملف الشخصي (≥ 3 نقطة، غير مغلقة)، الارتفاع، الأصل؟ | الملف الشخصي في XY |
| تدور | الملف الشخصي (≥ 2 نقطة في XZ)، الزاوية، المقاطع؟ | عن ز؛ المقاطع 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 ملم.
القيم المنطقية عن طريق تقسيم الفضاء الثنائي
يصبح كل معامل مصنفًا. تحصل الشبكة العامة على شجرة BSP؛ إن الشبكة المحدبة (مغلقة، متصلة، كل حافة محدبة) هي مجرد مستويات وجهها المتميزة، لذلك فإن الصندوق عبارة عن ستة مستويات وكرة من عشرة آلاف مثلثات تصنف دون بناء السلسلة التربيعية BSP لمادة محدبة صلبة تنحط إليها. يتم تصنيف المضلعات كقوائم، ويتم الاحتفاظ بالمضلع الخالي من المربع المحيط بالمعامل الآخر أو إسقاطه دون التحرك بأي شيء.
- If either mesh is empty, or the bounding boxes do not meet (within tolerance), answer directly: union = merge, subtract = a, intersect = empty.
- قم ببناء مصنفات A وB (المستويات المحدبة أو BSP).
- الاتحاد: احتفظ بـ 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.
- قم بتنظيف حساء المضلع: نقاط اللحام داخل الحد الأقصى (10·eps, 1e-9·size)، وأغلق الوصلات على شكل حرف T، وأغلق الفجوات التي تصل إلى 1e-4·الحجم بين الشظايا، وادمج الأجزاء المستوية وأعد التثليث.
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 بدلاً من النتيجة الجزئية عندما لا يمكن تثليث المدخلات (حلقات متقاطعة ذاتيًا، ثقوب خارج الحلقة الخارجية).
استكشاف الأخطاء وإصلاحها
| أعراض | سبب | يصلح |
|---|---|---|
| تحتوي النتيجة المنطقية على ثقوب أو وجوه مقلوبة | المدخلات مفتوحة أو ملفوفة في اتجاه عقارب الساعة | تحقق من كلا المدخلات باستخدام MeshTopology: يجب أن تكون الحدود الحدودية والحواف الخاطئة 0 |
| الوجه المشترك بين كلا المعاملين مفقود أو مضاعف | الوجوه تقريبًا ولكن ليست متطابقة تمامًا (أبعد عن التسامح) | انطباق المعاملات على نفس المستوى، أو قم برفع CsgOptions.tolerance |
| RangeError: تجاوز تسامح الشبكة ميزانية التقسيم الفرعي | التسامح جيد جدًا بالنسبة لنصف القطر | استخدم إعدادات التفاوت المسبقة (0.1 إلى 0.0005 مم) |
| الحجم يختلف عن الصيغة | مواجهة في التسامح الخشنة | شبكة أكثر دقة، أو استخدم نواة B-rep للحصول على خصائص الكتلة الدقيقة |
| بطء منطقي في العديد من الأدوات | تم بناء اتحاد الأدوات أولاً | أدوات الطرح واحدة تلو الأخرى (booleanAll تقوم بهذا): كل أداة محدبة عبارة عن مجموعة من المستويات |