คุณคำนวณได้อย่างไรว่ามี 2 บรรทัดหันหน้าไปทางหรือออกไป?


10

เมื่อได้รับ 4 คะแนนที่อธิบายถึง 2 ส่วนของเส้นคุณจะคำนวณได้อย่างไรว่าเส้น A ไปทางหรือออกจากบรรทัด B

เส้น 2 เส้นมีความยาวคงที่และสามารถวัดระยะทางจาก x1 / y1 ถึง x2 / y2

ป้อนคำอธิบายรูปภาพที่นี่


เคสที่มีเส้นโค้ง bezier แตกต่างจากเคสที่มีเส้นตรงอย่างไร คุณมีเส้นโค้งที่สามารถล้อมรอบเส้นอื่น ๆ (เพื่อให้ทุกทิศทางชี้ไปที่ "ไปยัง") หรือไม่?
bummzack

1
คุณอาจต้องชี้แจงเงื่อนไขของคุณ ในเรขาคณิต "เส้น" ขยายออกไปไม่สิ้นสุดในทิศทางใดทิศทางหนึ่งเมื่อเทียบกับครึ่งเส้นหรือส่วนดังนั้นเส้น 2 เส้นจะข้ามยกเว้นว่าขนานกัน คุณกำลังถามเรื่องไหน คุณได้วาดลูกศรซึ่งบอกทิศทางซึ่งฉันหมายถึงกลุ่มหรือที่ครึ่งมากที่สุด และคำจำกัดความของคุณของ "สู่" และ "ไม่อยู่" คืออะไร?
Hackworth

เส้นโค้งเบซิเยร์นั้นยากที่จะนำเสนอในความเสมอภาคที่จำเป็นในการแก้การทดสอบจุดตัดด้วยรังสี อย่างไรก็ตามฉันจะเปลี่ยนคำที่ใช้แทนลูกศรของคุณเป็น "ray" คุณอาจได้รับคำตอบที่รวดเร็วกว่า ฉันจะตอบคำถามนี้ถ้าฉันมีเวลาพักกลางวันถ้าไม่มีใครทำ ถ้าไม่ใช่นี่เป็นภารกิจที่พบบ่อยมากในเกม Google "การทดสอบการตัดกันส่วนของเส้นเรย์" ฉันสงสัยว่าการทดสอบเส้นโค้งเบซิเยร์นั้นคล้ายคลึงกัน แต่ฉันไม่เคยลองเลย
แบรนดอน

3
คุณควรแบ่งคำถามเป็นสองข้อ ส่วนที่มีส่วนของเส้นตรงนั้นง่ายมาก ส่วนที่มีเส้นโค้ง bezier นั้นซับซ้อนมากและมีวิธีแก้ปัญหาเชิงตัวเลขโดยประมาณเท่านั้น
sam hocevar

ฉันแบ่งคำถามเป็น 2 ข้อตามที่ขอ ส่วนที่ 2 อยู่ที่นี่: gamedev.stackexchange.com/questions/21463/ …
Robinicks

คำตอบ:


11

อนุญาตAและBเป็นสองจุดบนเส้นสีดำ ให้CและDเป็นส่วนสีน้ำเงินของคุณ เครื่องหมายของzพิกัดของผลิตภัณฑ์ข้ามAB^ACจะบอกคุณว่าC"ซ้าย" หรือ "ขวา" ของเส้นสีดำ ผลิตภัณฑ์ Cross AB^CDจะบอกคุณว่าตัวพาCD"ซ้าย" หรือ "ขวา" ของเส้นสีดำ

เราไม่อยากรู้ว่ามันไปทางซ้ายหรือขวา; สิ่งที่เราต้องการคือทำให้แน่ใจว่าพวกมันอยู่ในทิศทางเดียวกันหรือในทิศทางตรงกันข้ามนั่นคือสาเหตุที่เราคูณค่าสองค่า

รหัสเทียมต่อไปนี้จึงควรใช้งานได้:

z1 = (xB-xA)*(yC-yA) - (yB-yA)*(xC-xA);
z2 = (xB-xA)*(yD-yC) - (yB-yA)*(xD-xC);
z3 = z1 * z2;

if (z3 < 0)
    ; /* Pointing towards (BUT maybe even crossing) */
else if (z3 > 0 || z2 != 0)
    ; /* Pointing away */
else
    ; /* Parallel */

ฉันเกรงว่าฉันต้องใช้เวลาพอสมควรในการเขียนวิธีแก้ปัญหาที่เหมาะสมสำหรับเส้นโค้ง Bezier สถานการณ์ต่อไปนี้เป็นไปหรือไปหรือไม่

ปัญหา?


สำหรับเส้นโค้งฉันเชื่อว่าคุณสามารถหาแทนเจนต์ของเส้นโค้งที่จุดที่อยู่ใกล้กับส่วนของเส้นตรงและใช้สิ่งนี้ในลักษณะเดียวกับที่คุณทดสอบส่วนของเส้นตรงอื่น ๆ อาจจะหนักกว่าที่คาดไว้สักหน่อย :)
notlesh

@stephelton: ดูภาพที่สองอีกครั้งเพื่อหาเส้นโค้ง bezier โดยชี้ไปที่เส้นโค้งที่โค้งออกไป หรือพิจารณาเส้นโค้งที่มีเส้นสัมผัสแทนเจนต์กับส่วนที่อาจตัดกัน แต่จะโค้งไปทางส่วนและจุดตัด
Cascabel

+1 สำหรับ trollface และคณิตศาสตร์ที่ดี :) อย่างไรก็ตามแผนภาพ 'สู่' ของคุณยังคงมี 'ไม่อยู่' - เพียงแค่ย้ายจุดเริ่มต้นเหนือเส้น
Jonathan Dickinson

@ JonathanDickinson ขอบคุณฉันอัปเดตภาพเพื่อให้ชัดเจนขึ้นเล็กน้อยว่าการสอบสวนของฉันคืออะไร!
sam hocevar

2

สมมติว่าจุดเริ่มต้นคือวงกลมสีเขียวและจุดสิ้นสุดคือลูกศรสีแดง

คำนวณระยะห่างระหว่างจุดเริ่มต้นเป็น DS และส่วนสีดำและทำเช่นเดียวกันสำหรับจุดสิ้นสุด (ลูกศรสีแดง) เป็น DE ถ้า DS> DE แสดงว่าเซ็กเมนต์นั้นชี้ไปที่ ถ้า DE> DS มันจะชี้ไป หากทั้งสองเท่ากันทั้งสองจะเหมือนกัน

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


DS> DE รับประกันว่าจะใช้งานได้กับเส้นตรงเท่านั้น มันอาจล้มเหลวสำหรับเบซิเยร์ นอกจากนี้คุณยังไม่ทราบคำจำกัดความของเขาที่มีต่อ หากส่วนขยายของลูกศรจะข้ามเส้นที่กำหนดโดย 2 คะแนน แต่ไม่ใช่ส่วนที่กำหนดโดยจุดเดียวกันมันจะยังคงเป็น "สู่" หรือไม่?
Hackworth

ฉันกำลังพูดถึงสองส่วนไม่ใช่เส้นดังนั้นจึงไม่มี "ส่วนขยายของลูกศร" นอกจากนี้มันไม่สำคัญว่าที่ลูกศรชี้ไปในขณะที่เรากำลังพูดถึงระยะทางที่นี่ จุดที่ใกล้ที่สุดบนเส้นสีดำอาจเป็นจุดเริ่มต้น / จุดสิ้นสุดของเส้นสีดำมันไม่สำคัญ ทั้งสองส่วนอาจเป็น collinears วิธีนี้จะยังคงทำงานตามที่ตั้งใจไว้ สำหรับเส้นโค้งเบซิเยร์ฉันพูดถึงมันจะให้ผลลัพธ์ที่แปลกขึ้นอยู่กับรูปร่างของเส้นโค้ง
Ravachol
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.