การคำนวณผลิตภัณฑ์ข้ามเวกเตอร์ 2 มิติ


87

จากวิกิพีเดีย:

ผลคูณไขว้เป็นการดำเนินการไบนารีบนเวกเตอร์สองตัวในปริภูมิแบบยุคลิดสามมิติที่ส่งผลให้เวกเตอร์อื่นตั้งฉากกับระนาบที่มีเวกเตอร์อินพุตสองตัว

เนื่องจากคำจำกัดความถูกกำหนดเฉพาะในมิติสาม ( หรือเจ็ดหนึ่งและศูนย์ ) หนึ่งจะคำนวณผลคูณไขว้ของเวกเตอร์ 2d สองตัวได้อย่างไร

ฉันได้เห็นการใช้งานสองอย่าง หนึ่งส่งคืนเวกเตอร์ใหม่ (แต่ยอมรับเพียงเวกเตอร์เดียว) อีกตัวส่งคืนสเกลาร์ (แต่เป็นการคำนวณระหว่างเวกเตอร์สองตัว)

การนำไปใช้ 1 (ส่งกลับสเกลาร์):

float CrossProduct(const Vector2D & v1, const Vector2D & v2) const
{
    return (v1.X*v2.Y) - (v1.Y*v2.X);
}

การนำไปใช้ 2 (ส่งคืนเวกเตอร์):

Vector2D CrossProduct(const Vector2D & v) const
{
    return Vector2D(v.Y, -v.X);
}

ทำไมการใช้งานที่แตกต่างกัน? ฉันจะใช้การปรับใช้สเกลาร์เพื่ออะไร ฉันจะใช้การใช้งานเวกเตอร์เพื่ออะไร

เหตุผลที่ฉันถามเพราะฉันกำลังเขียนคลาส Vector2D ด้วยตัวเองและไม่รู้ว่าจะใช้วิธีไหนดี


10
การนำไปใช้ 2 ไม่ถูกต้อง คุณต้องมีเวกเตอร์สองตัวเพื่อสร้างผลคูณไขว้กัน
bobobobo

7
การใช้งาน 2 จะหมุนเวกเตอร์ที่กำหนดvโดย -90 องศา แทนที่ -90 ในx' = x cos θ - y sin θและy' = x sin θ + y cos θ. รูปแบบอื่นของการใช้งานนี้return Vector2D(-v.Y, v.X);คือหมุนvโดย +90 องศา
legends2k

3
@ legends2k: ควรทราบว่าการนำไปใช้งาน 2 เป็นส่วนขยายของการใช้ดีเทอร์มิแนนต์เพื่อประเมินผลคูณไขว้ : เพียงแค่ลบแถวและคอลัมน์สุดท้าย ส่วนขยายดังกล่าวมีN-1ตัวถูกดำเนินการสำหรับNมิติข้อมูลเสมอ
ทิม

4
การใช้งาน 1 จะคำนวณขนาดของผลิตภัณฑ์ไขว้
Mateen Ulhaq

@MateenUlhaq ประเภทของมันคือ " ขนาดที่ลงนาม "
Moritz Mahringer

คำตอบ:


101

การนำไปใช้ 1 จะส่งคืนขนาดของเวกเตอร์ที่เป็นผลมาจากผลคูณสามมิติปกติของเวกเตอร์อินพุตโดยใช้ค่า Z โดยนัยเป็น 0 (เช่นการปฏิบัติต่อพื้นที่ 2 มิติเป็นระนาบในพื้นที่ 3 มิติ) ผลิตภัณฑ์กากบาท 3 มิติจะตั้งฉากกับระนาบนั้นและมีส่วนประกอบ 0 X & Y (ดังนั้นสเกลาร์ที่ส่งคืนคือค่า Z ของเวกเตอร์ผลิตภัณฑ์ข้าม 3 มิติ)

โปรดทราบว่าขนาดของเวกเตอร์ที่เกิดจากผลิตภัณฑ์กากบาท 3 มิติยังเท่ากับพื้นที่ของสี่เหลี่ยมด้านขนานระหว่างเวกเตอร์ทั้งสองซึ่งทำให้การนำไปใช้งาน 1 มีวัตถุประสงค์อื่น นอกจากนี้ยังมีการลงนามพื้นที่นี้และสามารถใช้เพื่อกำหนดว่าการหมุนจาก V1 ถึง V2 เคลื่อนที่ในทิศทางทวนเข็มนาฬิกาหรือตามเข็มนาฬิกา นอกจากนี้ควรสังเกตด้วยว่าการนำไปใช้งาน 1 เป็นตัวกำหนดของเมทริกซ์ 2x2 ที่สร้างจากเวกเตอร์สองตัวนี้

การนำไปใช้ 2 จะส่งคืนเวกเตอร์ที่ตั้งฉากกับเวกเตอร์อินพุตที่ยังอยู่ในระนาบ 2D เดียวกัน ไม่ใช่ผลคูณไขว้ในความหมายคลาสสิก แต่สอดคล้องกันในความหมาย "ให้เวกเตอร์ตั้งฉากกับฉัน"

โปรดทราบว่าช่องว่างแบบยูคลิด 3 มิติถูกปิดภายใต้การดำเนินการข้ามผลิตภัณฑ์นั่นคือผลคูณไขว้ของเวกเตอร์ 3 มิติสองตัวจะส่งคืนเวกเตอร์ 3 มิติอื่น การใช้งาน 2D ทั้งสองแบบข้างต้นไม่สอดคล้องกันไม่ทางใดก็ทางหนึ่ง

หวังว่านี่จะช่วยได้ ...


7
ที่จริงการนำไปใช้งาน 2 เป็นผลคูณระหว่าง v และเวกเตอร์หน่วยชี้ขึ้นที่ทิศทาง z
mattiast

@mattiast: จริง. นั่นเป็นวิธีที่อธิบายการทำงานของ 2D 'perp' ในแบบ 3 มิติ
Drew Hall

@mattiast: การใช้งาน 2 สามารถคิดได้ว่าเป็นส่วนเสริมของการใช้ดีเทอร์มีแนนต์เพื่อคำนวณผลคูณไขว้ --- เพียงแค่ลบแถวและคอลัมน์สุดท้าย ควรสังเกตว่าการนำไปใช้งาน 1 เทียบเท่ากับ: DotProduct(a, CrossProduct(b))ซึ่ง (สวยมาก!) สอดคล้องกับแนวคิดของ "ผลิตภัณฑ์จุดตั้งฉาก" (ซึ่งเป็นสิ่งที่การใช้งาน 1 นั้นเรียกว่า [และอาจถูกต้องกว่า] ด้วย!)
ทิม

ในย่อหน้าแรกขนาดคือค่าสัมบูรณ์ของสิ่งที่ส่งคืน มันไม่ค่อยเหมือนกับส่วนประกอบ Z ดังที่คุณระบุไว้ในย่อหน้าที่ 2 คุณสามารถใช้เครื่องหมายกากบาทเพื่อขับไล่แวมไพร์ได้ ... เอ่อฉันหมายถึงการตรวจจับเมื่อเวกเตอร์ออกไปเทียบกับการเข้าสู่โครงร่างของรูปหลายเหลี่ยมเป็นต้น
Peter Cordes

68

กล่าวโดยย่อ:เป็นสัญกรณ์ชวเลขสำหรับแฮ็คทางคณิตศาสตร์

คำอธิบายยาว:

คุณไม่สามารถทำผลิตภัณฑ์ข้ามกับเวกเตอร์ในพื้นที่ 2 มิติได้ การดำเนินการไม่ได้กำหนดไว้ที่นั่น

อย่างไรก็ตามบ่อยครั้งที่น่าสนใจที่จะประเมินผลคูณข้ามของเวกเตอร์สองตัวโดยสมมติว่าเวกเตอร์ 2 มิติถูกขยายเป็น 3 มิติโดยการตั้งค่าพิกัด z เป็นศูนย์ เช่นเดียวกับการทำงานกับเวกเตอร์ 3 มิติบนระนาบ xy

หากคุณขยายเวกเตอร์ด้วยวิธีนั้นและคำนวณผลคูณไขว้ของคู่เวกเตอร์ที่ขยายดังกล่าวคุณจะสังเกตเห็นว่าเฉพาะองค์ประกอบ z เท่านั้นที่มีค่าที่มีความหมาย: x และ y จะเป็นศูนย์เสมอ

นั่นเป็นเหตุผลว่าทำไม z-component ของผลลัพธ์มักถูกส่งกลับเป็นสเกลาร์ ตัวอย่างเช่นสเกลาร์นี้สามารถใช้เพื่อค้นหาการคดเคี้ยวของจุดสามจุดในพื้นที่ 2 มิติ

จากมุมมองทางคณิตศาสตร์ที่บริสุทธิ์ไม่มีผลิตภัณฑ์ครอสในพื้นที่ 2 มิติเวอร์ชันสเกลาร์คือแฮ็คและผลิตภัณฑ์ข้าม 2D ที่ส่งคืนเวกเตอร์ 2 มิติไม่สมเหตุสมผลเลย


"เช่นใช้เพื่อค้นหาการคดเคี้ยวของจุดสามจุดในพื้นที่ 2 มิติ" @Nils Pipenbrinck การคดเคี้ยวในบริบทนี้หมายความว่าอย่างไร
Nader Belal

1
@NaderBelal ฉันคิดว่าการคดเคี้ยวที่นี่จะบอกเป็นนัยว่า - ถ้าเราเปลี่ยนจากจุด a ไป b ถึง c เราจะหมุนตามเข็มนาฬิกาหรือทวนเข็มนาฬิกาในแง่ของมุมที่เราเพิ่งทอด
Amit Tomar

12

คุณสมบัติที่มีประโยชน์อีกประการหนึ่งของผลิตภัณฑ์กากบาทคือขนาดของมันเกี่ยวข้องกับไซน์ของมุมระหว่างเวกเตอร์สองตัว:

| axb | = | a | . | b | . ไซน์ (theta)

หรือ

ไซน์ (theta) = | axb | / (| ก |. | ข |)

ดังนั้นในการนำไปใช้ 1 ข้างต้นถ้าaและbทราบล่วงหน้าว่าเป็นเวกเตอร์หน่วยผลลัพธ์ของฟังก์ชันนั้นจะเท่ากับค่าไซน์ ()


1
... ซึ่งเป็นสองเท่าของพื้นที่สามเหลี่ยมระหว่างเวกเตอร์ a และเวกเตอร์ b
Tim Lovell-Smith

5

การนำไปใช้งาน 1 เป็นผลคูณต่อจุดของเวกเตอร์สองตัว ข้อมูลอ้างอิงที่ดีที่สุดที่ฉันรู้จักสำหรับกราฟิก 2 มิติคือซีรี่ส์Graphics Gems ที่ยอดเยี่ยม หากคุณกำลังทำรอยขีดข่วนงาน 2D ก็มันสำคัญที่จะมีหนังสือเหล่านี้ Volume IV มีบทความชื่อ "The Pleasures of Perp Dot Products" ซึ่งมีประโยชน์มากมายสำหรับมัน

การใช้ผลิตภัณฑ์จุดต่อจุดที่สำคัญอย่างหนึ่งคือการกำหนดขนาดsinของมุมระหว่างเวกเตอร์สองเวกเตอร์เช่นเดียวกับที่ผลิตภัณฑ์ดอทส่งกลับค่ามาตราส่วนcosของมุม แน่นอนว่าคุณสามารถใช้dot productและperp dot productร่วมกันเพื่อกำหนดมุมระหว่างเวกเตอร์สองตัว

นี่คือโพสต์และนี่คือบทความ Wolfram Math World


3

ฉันใช้ผลคูณ 2d ในการคำนวณของฉันเพื่อค้นหาการหมุนที่ถูกต้องใหม่สำหรับวัตถุที่กำลังกระทำโดยเวกเตอร์แรงที่จุดใดจุดหนึ่งที่สัมพันธ์กับจุดศูนย์กลางมวล (สเกลาร์ Z หนึ่ง)


3

การดำเนินการเวกเตอร์ 2 มิติที่มีประโยชน์คือผลคูณไขว้ที่ส่งคืนสเกลาร์ ฉันใช้มันเพื่อดูว่าสองขอบที่ต่อเนื่องกันในรูปหลายเหลี่ยมโค้งไปทางซ้ายหรือขวา

จากแหล่งChipmunk2D :

/// 2D vector cross product analog.
/// The cross product of 2D vectors results in a 3D vector with only a z component.
/// This function returns the magnitude of the z value.
static inline cpFloat cpvcross(const cpVect v1, const cpVect v2)
{
        return v1.x*v2.y - v1.y*v2.x;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.