ฉันจะสอดแทรกเชิงเส้นตรงระหว่างเวกเตอร์สองตัวได้อย่างไร


16

ฉันมีเวกเตอร์ความเร็วสูงที่ลูกค้าของฉันอยู่และกำลังจะไปและฉันมีเวกเตอร์เดียวกันที่มาจากเซิร์ฟเวอร์บอกว่าลูกค้าควรจะอยู่ที่ไหน บางครั้งมันก็แตกต่างกันเล็กน้อยดังนั้นฉันต้องการแก้ไขระหว่างตำแหน่งปัจจุบันของฉันกับตำแหน่งที่ถูกต้องของเซิร์ฟเวอร์

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

ลูกศรสีดำเป็นเวกเตอร์ความเร็วของลูกค้าลูกศรสีแดงเป็นเวกเตอร์ความเร็วของลูกค้าบนเซิร์ฟเวอร์และลูกศรสีน้ำเงินเป็นอันที่ฉันต้องการคำนวณและสอดแทรก

ฉันจะคำนวณเวกเตอร์สีน้ำเงินได้อย่างไร จากนั้นฉันจะแก้ไขเชิงเส้นตรงระหว่างพวกเขาได้อย่างไร

คำตอบ:


18

สามารถคำนวณเวกเตอร์สีน้ำเงินได้ง่าย: แดง - ดำ (เครื่องหมายระหว่างเวกเตอร์คือลบ) แต่ถ้าคุณต้องการที่จะสอดแทรกระหว่างเวกเตอร์ดำและแดงคุณไม่ต้องคำนวณมัน การแก้ไขเชิงเส้นเป็นเพียงการรวมกันเชิงเส้น ดังนั้นคุณสามารถทำได้: alpha * black + (1 - alpha) * red ซึ่ง alpha ต้องมาจากช่วงเวลา <0,1> ถ้าอัลฟาเป็น 1 คุณจะได้เวกเตอร์สีดำเมื่ออัลฟาเป็น 0 คุณจะได้เวกเตอร์สีแดง

และถ้าฉันเข้าใจถูกต้องคุณจะแก้ไขระหว่างเวกเตอร์เหล่านี้ในเวลา ดังนั้นเพียงแค่เลือกการเพิ่มขึ้นของอัลฟาในเวลาที่เหมาะสม

ฉันเข้าใจคุณถูกไหม หรือคุณหมายถึงบางสิ่งบางอย่างที่แตกต่างอย่างสมบูรณ์?


ใช่คุณทำให้ฉันถูก อีกแค่คำถามเดียวฉันจะคูณจำนวนเวกเตอร์ได้อย่างไร? การดำเนินการนั้นจะส่งคืนเวกเตอร์ใหม่ให้ฉันหรือไม่ ตัวอย่างเช่นสีแดงเป็นเวกเตอร์ (0, 10) ที่มีความยาว 8 และสีดำคือ (-2, 5) ที่มีความยาว 4 ฉันจะทำอัลฟ่า * ดำหรือ (1 - อัลฟา) * แดงได้อย่างไร ขอขอบคุณ.
gmemario

คุณแค่คูณเวกเตอร์แต่ละพิกัดด้วยกัน หากอัลฟ่านั้นเป็นตัวอย่างเช่น 0.5 ดังนั้น alpha * black + (1 - alpha) * red = (0,5) + (-1, 2.5) = (-1, 7.5) - ถ้าคุณจะวาดมันลงบนกระดาษคุณ จะเห็นว่ามันเป็นจริงระหว่างเวกเตอร์สองตัวนั้น
zacharmarz

10

ถ่ายภาพนี้:

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

AB เป็นเวกเตอร์สีแดงจาก A ถึง B

Say P คือ 25% ของทางจาก A ถึง B วิธีพื้นฐานในการไปที่ P จากจุดเริ่มต้นคือ

A + ( B - A ) / 4
= 3/4 A   +   B / 4

ดังนั้น 3/4 A และ 1/4 B

อีกวิธีในการค้นหาที่บอกว่าคุณต้องการเวกเตอร์ 75% "ปิด" เป็น A และ 25% "ปิด" เป็น B (เวกเตอร์ที่มี 100% "ใกล้" ถึง A เป็นเพียงเวกเตอร์ A)

ดังนั้นคุณจะสามารถหา P เป็น:

A*t + (1-t)*B

ด้วย t = 0.75 (พูด 75% "ปิด" ถึง A)

0.75A + 0.25B

ดังนั้นฟังก์ชั่น LERP อย่างง่ายใน C สำหรับคลาส Vector3f จะเป็น:

static Vector3f lerp( const Vector3f& A, const Vector3f& B, float t ){
  return A*t + B*(1.f-t) ;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.