วิธีการตรวจสอบการชนระหว่างสไปรท์และผู้ใช้สร้างรูปร่างของการจัดเรียงบางอย่าง?


9

วิธีการตรวจจับการชนกันระหว่างสไปรต์และรูปร่างที่ผู้ใช้สร้างขึ้นของการจัดเรียงบางอย่าง

ตัวอย่างเช่น. มีวัตถุบางอย่างบนหน้าจอ ผู้ใช้ใช้นิ้วของพวกเขาและวาดรูปวงกลมรอบ ๆ วัตถุ (กฎการเลือกคือการวาดวงกลมรอบ ๆ เทพดา แต่รูปร่างการวาดอาจแตกต่างกัน) ฉันต้องการตรวจจับวัตถุที่เลือกซึ่งก็เหมือนกับ:

(ภาพตัวอย่าง): โพสต์ครั้งแรกเป็น http://i52.tinypic.com/28h0t1g.png


คุณช่วยอธิบายได้ไหมว่าทำไมจึงเลือกสีน้ำเงินและไม่ใช่สีแดงในตัวอย่างสุดท้ายของคุณ คุณสามารถอธิบายด้วยหรือไม่ว่าบรรทัดนั้นต้องสัมผัสกับสไปรท์หรือไม่ ตัวอย่างที่สามไม่ได้สัมผัสกล่องสีแดง แต่จะระบุตามที่เลือก ตัวอย่างที่ 5 คล้ายกันมากแต่ไม่ได้เลือก อะไรคือความแตกต่างระหว่าง # 3 กับ # 5
Romen

คำตอบ:


2

ถ้ารูปร่างจะถูกดึงมาเกี่ยวเนื่องกับส่วนของเส้นตรงจากผู้ใช้ (หรือ Bezier เส้นโค้งที่มีจุดควบคุม), คุณสามารถใช้ขั้นตอนวิธีการที่ค่อนข้างใช้กันอย่างแพร่หลายเป็นที่รู้จักกันเป็นแยกแกน-ทฤษฎีบท ใส่เพียง: ถ้ามีแกน (หน่วย - เวกเตอร์แทนทิศทาง) ที่รูปร่างไม่ทับซ้อนกัน (ค่าที่คาดการณ์ไว้จะไม่ส่งผลให้เกิดความแตกต่างในเชิงบวก) วัตถุจะไม่ทับซ้อนกัน ฉันเคยใช้สิ่งนี้ในอดีตและมันได้ผลเหมือนมีเสน่ห์


1

หากรูปร่างถูกวาดด้วยมือในCrayon Physicsคุณสามารถจัดเรียงเส้นตรงและตรวจสอบการชนกันของแต่ละรูปร่าง แม้จะมีเส้นตรงคุณสามารถใช้Bezier curvesหรืออะไรทำนองนั้น


0
  • สร้างบัฟเฟอร์ที่มีขนาดเดียวกับหน้าจอ (หรือพื้นผิวที่มีรูปร่างของคุณ) ในแต่ละตำแหน่งจะมีบูลีนว่ามีสไปรต์หรือไม่ จากนั้นตรวจสอบ "พิกเซล" ทั้งหมดของรูปร่างผู้ใช้ไม่ว่าที่ตำแหน่งของพวกเขาคือสไปรต์ (โดยการตรวจสอบค่าบูลีนนั้น) หรือคุณสามารถสร้างสไปรต์เพิ่มเติมได้ที่นั่นโดยจัดเก็บ ID แทนที่จะเป็นบูลีน แต่นี่เป็นกรณีของ 1 สไปรต์
  • หากรูปร่างที่สร้างโดยผู้ใช้สามารถแสดงตามลำดับของเส้นคุณสามารถตรวจสอบว่าแต่ละบรรทัดดังกล่าวข้ามสไปรต์หรือไม่ เนื่องจากสไปรท์มีรูปร่างเป็นรูปสี่เหลี่ยมผืนผ้าและรูปร่างของผู้ใช้เป็นเส้นที่มองหา "การแยกสี่เส้นสี่เหลี่ยมผืนผ้า" ... (แยกแกนอัลกอริทึม si วิธีหนึ่งที่จะทำ)

วิธีการขึ้นอยู่กับโครงสร้างข้อมูลที่คุณเลือกไม่ว่าจะเป็นบิตแมปหรือเวกเตอร์

วิธีแรกสามารถจัดการกับรูปร่างที่ซับซ้อนตามอำเภอใจง่ายต่อการใช้งาน แต่ใช้หน่วยความจำมากขึ้น ที่จริงคุณสามารถลดค่าใช้จ่ายของหน่วยความจำโดยใช้การบีบอัดและเพิ่มความเร็วโดยใช้ strutures ข้อมูลแบบลำดับขั้น (octrees) ...

วิธีที่สองไม่ใช่เรื่องง่ายที่จะใช้ แต่ใช้พลังการประมวลผลมากขึ้น

ในแต่ละกรณีวัดว่ามันเป็นเรื่องสำคัญ ฉันจะพยายามทำสิ่งแรกเพราะมันง่ายกว่าที่จะใช้ โชคดี. :)

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