การดำเนินการบูลีนบนตาข่าย


15

กำหนดชุดของจุดยอดและสามเหลี่ยมสำหรับแต่ละตาข่าย ไม่มีใครรู้เกี่ยวกับอัลกอริทึมหรือสถานที่ที่จะเริ่มมอง (ฉันลอง google ก่อน แต่ยังไม่พบสถานที่ที่ดีในการเริ่มต้น) เพื่อดำเนินการบูลีนบนตาข่ายกล่าวว่าและได้รับชุดของจุดยอดและสามเหลี่ยมสำหรับตาข่ายที่เกิดขึ้น? สิ่งที่น่าสนใจโดยเฉพาะคือการลบและสหภาพ

ภาพตัวอย่าง: http://www.rhino3d.com/4/help/Commands/Booleans.htm

คำตอบ:


10

ฉันคิดว่านี่เป็น Constructive-Solid-Geometry (CSG) หวังว่าคุณจะได้รับความช่วยเหลือที่นี่

http://www.alsprogrammingresource.com/csg.html

http://createuniverses.blogspot.com/2009/09/qtcsg-constructive-solid-geometry.html

http://www.nigels.com/research/

นอกจากนี้ยังค้นหา google สำหรับเรขาคณิตแข็งเชิงสร้างสรรค์เป็นจุดเริ่มต้น

HTH


+1 - ฉันจะโพสต์ลิงก์เดียวกัน JustBoo - จนกว่าฉันจะสังเกตเห็นว่าคุณชนะฉันมัน! :)
jacmoe

ขอบคุณ! คำศัพท์ Constructive-Solid-Geometry เป็นสิ่งที่ฉันต้องการ!
lathomas64

@jacmoe - ประชดเป็นที่น่าอัศจรรย์และสมบูรณ์ในขณะนี้ :-) คุณสมควรได้รับเครดิตสำหรับบางส่วนของเหล่านั้น ขอบคุณ.
JustBoo

บางส่วนของพวกเขา? : PI เชื่อว่าฉันจับพวกเขาทั้งหมดกลับลงไปที่นั่น : D ยังพวกเขาเป็นเพียง CSG พื้นฐานเท่านั้น มันค่อนข้างขนจากที่นั่น - แม้แต่แพ็คเกจการสร้างโมเดลเชิงพาณิชย์ที่สำคัญก็ไม่ผิด
jacmoe

3

ฉันคิดว่าเราสามารถไขปริศนาออกได้ถ้าเราแค่คิดถึงมัน

เห็นได้ชัดว่าคุณต้องการสร้างใบหน้า (สามเหลี่ยม) ที่รูปทรงเรขาคณิตทั้งสองตัดกัน จากนั้นคุณจะเหลือสามตาข่าย: จุดตัดที่คุณแยกได้รูปทรงเรขาคณิต 1 และรูปทรงเรขาคณิต 2

จากนั้นเพียงลบสิ่งที่คุณไม่ต้องการ!

  • BooleanDifference: ลบส่วนที่แยกและรูปทรงเรขาคณิต 2
  • BooleanIntersection: ลบเรขาคณิต 1 และ 2 ออกจากส่วนที่แยก
  • BooleanUnion: ผสานรูปทรงเรขาคณิตที่ 1 และ 2 แล้วลบส่วนที่แยกออก (ตรวจสอบให้แน่ใจว่าได้ต่อประสานรูปทรงเรขาคณิตที่ 1 และ 2 เข้าด้วยกันในรูปทรงเรขาคณิตที่เป็นของแข็ง)
  • BooleanSplit: แยกเรขาคณิต 1, เรขาคณิต 2 และทำซ้ำส่วนแยก (แนบหนึ่งกับเรขาคณิต 1 และอีกหนึ่งกับเรขาคณิต 2)

ฉันคิดว่าครอบคลุมมันใช่มั้ย ส่วนที่ยากจะสร้างใบหน้าสี่แยก สำหรับการทำซ้ำนั้นให้ผ่านแต่ละหน้าของใบหน้าและตรวจสอบว่าใบหน้านั้นเป็นส่วนหนึ่งของใบหน้าอื่นหรือไม่ หากอยู่ข้างในทั้งหมดให้คัดลอกใบหน้าเป็นส่วนหนึ่งของรอยแยก ถ้ามันอยู่ข้างในบางส่วนคุณต้องแยกสามเหลี่ยมตามแนวสี่แยก ฉันคิดว่า DirectX และ OpenGL ทั้งคู่จะมีฟังก์ชั่นตัวช่วยสำหรับเรื่องนี้ ผมได้เรียนรู้ชนิดของสิ่งที่อยู่ในแคลคูลัส 3 (หรือถูกมัน 2?) แต่ถ้าคุณไม่ได้มีเงื่อนงำอาจจะขอให้ที่math.stackexchange.com และแน่นอนถ้าใบหน้าอยู่ข้างนอกอย่าทำอะไรเลย เมื่อคุณวนซ้ำใบหน้าทั้งหมดของทั้งสองตาข่ายคุณจะเหลือด้วยตาข่ายแยก


2

หากคุณกำลังเผชิญกับโมเดลหลายเหลี่ยมคุณอาจต้องจัดการกับเรขาคณิตที่ไม่หลากหลายซึ่งหมายความว่าคำถามของ "ภายใน" และสิ่งที่เป็น "ภายนอก" ไม่ได้ถูกกำหนดไว้ เป็นการยากที่จะทำการบูลีนถ้าคุณไม่รู้ว่าคุณมี 0 หรือ 1

คุณต้องจัดการกับกรณีที่เป็นขอบเช่นรูปหลายเหลี่ยมแบบร่วมรูปหลายเหลี่ยมรูปหลายเหลี่ยมซึ่งตัดขอบ, จุดยอดที่อยู่บนขอบและ / หรือใบหน้าและสิ่งของในธรรมชาตินั้น ไม่มีสิ่งใดที่เป็นไปไม่ได้คุณเพียงต้องการวิธีที่มีประสิทธิภาพในการแสดงข้อมูลเมชของคุณและคำจำกัดความที่เข้มงวดของสิ่งที่คุณคาดว่าจะเกิดขึ้นในกรณีเหล่านั้น


1

เป็นที่น่าสังเกตว่าการดำเนินการส่วนใหญ่ของคุณสามารถแสดงด้วยการปฏิเสธและการรวมซึ่งการปฏิเสธของรูปทรงเรขาคณิตบางอย่างเป็นเพียงรูปทรงเรขาคณิตที่มีบรรทัดฐานของมันพลิก ดังนั้นหากคุณได้รับสิทธิในการรวมกิจการการดำเนินการอื่น ๆ ก็ควรทำตาม:

  • ทางแยก (A, B): =! union (! A,! B)
  • ลบ (A และ B): =! union (! A, B)

แซนเดอร์มีโพสต์บล็อกที่ดีพอสมควรซึ่งกล่าวถึงการใช้งาน CSG: http://sandervanrossen.blogspot.com/search/label/CSG


1
ฉันจะพูดถึงสิ่งที่ CSG ของฉันเอง แต่เห็นได้ชัดว่ามีคนอื่นทำแล้ว: O)
Sander van Rossen

1

นี่เป็นเรื่องที่ค่อนข้างยุ่งยากอย่างน้อยถ้าคุณต้องการที่จะทำอย่างเต็มที่ (จุดลอยทำให้เกิดปัญหาร้ายแรงบางอย่าง)

ฉันจะชี้ให้คุณไปที่วรรณกรรมการคำนวณทางเรขาคณิต / คอมพิวเตอร์กราฟิกในเรื่องโดยเฉพาะเอกสารล่าสุดเหล่านี้:

http://homes.cs.washington.edu/~gilbo/repofiles/booleans2009.pdf

http://openflipper.org/uploads/media/campen_2010_eg_02.pdf

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.