ฉันสามารถลดความไม่เท่าเทียมกันของ "ระยะทาง (p1, p2) <distance (p1, p3) ได้หรือไม่?"


14

ฉันกำลังทำงานกับลอจิกแบบเวกเตอร์เพื่อถามว่า: ฉันสามารถประหยัดเวลาตัวประมวลผลโดยทำให้ความไม่เท่าเทียมนี้ลดความซับซ้อนลง:

distance(vector1, vector2) < distance(vector1, vector3)

ฉันเห็นว่าvector1มีการทำซ้ำในทั้งสองกรณี


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

3
หากต้องการแสดงความคิดเห็นต่อ @ MikeS ต่อไปประสิทธิภาพจะต้องมีความสำคัญในกรณีเช่นนี้หากคุณได้ทำการวิเคราะห์หรือทำโปรไฟล์แล้วและระบุว่าการโทรนี้เป็นคอขวด การบำรุงรักษาจะทำให้ประสิทธิภาพออกมาดีถ้าเราพูดถึงความแตกต่างระหว่าง 305fps และ 303fps
Phoshi

คำตอบ:


24

ใช่คุณสามารถทำให้สิ่งนี้ง่ายขึ้น ก่อนอื่นหยุดเรียกพวกมันว่าเวกเตอร์ พวกเขาเป็นจุด ขอเรียกพวกเขาA, และBC

ดังนั้นคุณต้องการสิ่งนี้:

dist(A, B) < dist(A, C)

แทนที่ระยะทางด้วยระยะทางยกกำลังสองจากนั้นเปลี่ยนเป็นผลิตภัณฑ์ดอท (จากคำจำกัดความของความยาวแบบยุคลิดแทนที่ACด้วยAB + BC(ตอนนี้นี่คือเวกเตอร์จริง) ขยาย, ลดความซับซ้อน, ปัจจัย:

dist(A, B < dist(A, C
dot(AB, AB) < dot(AC, AC)
dot(AB, AB) < dot(AB + BC, AB + BC)
dot(AB, AB) < dot(AB, AB) + dot(BC, BC) + 2 dot(AB, BC)
0 < dot(BC, BC) + 2 dot(AB, BC)
0 < dot(BC + 2 AB, BC)

นั่นแหละ:

dot(AB + AC, BC) > 0

ด้วยสัญลักษณ์เวกเตอร์ของคุณ:

dot(v2 - v1 + v3 - v1, v3 - v2) > 0

นั่นคือการเพิ่มเติมบางส่วนและหนึ่งผลิตภัณฑ์ดอทแทนผลิตภัณฑ์สองจุดก่อนหน้านี้


คุณอธิบายได้อย่างไรว่าคุณสามารถแทนที่ a + b b = a + c c ด้วยรุ่น dot dot ได้หรือไม่?
TravisG

2
@TravisG ฉันไม่แน่ใจในสิ่งที่คุณถาม หากคำถามของคุณคือเหตุผลที่dist(A, B)²เป็นเช่นเดียวกับdot(AB, AB)มันมาจากนิยามของความยาวแบบยุคลิด
sam hocevar

2
เห็นได้ชัดว่าสิ่งนี้ทำ (ค่อนข้าง) ทำให้สมการทางคณิตศาสตร์ง่ายขึ้น แต่ไม่จำเป็นต้อง "ประหยัดเวลาตัวประมวลผล" สำหรับ OP มันส่งผลให้เกิดความซับซ้อนมากขึ้นและการคำนวณมากกว่าเพียงแค่ลบสแควร์รูทออกจากสมการระยะทางดั้งเดิม
MichaelHouse

1
แก้ไขให้ฉันถ้าฉันผิด แต่ dot-product สองรายการคือ 5 การดำเนินการต่อ dot-product บวก subcarpion สอง vec3 ซึ่งรวม 16 การดำเนินการทางของคุณมี substractions ย่อย 3 vec3 บวกการเพิ่มซึ่งทำให้การดำเนินงาน 12 บวกผลิตภัณฑ์ dot ทำให้ 17.
Luis W

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

16

ใช่. สมมติว่าdistanceฟังก์ชั่นของคุณใช้สแควร์รูทคุณสามารถทำให้มันง่ายขึ้นโดยการลบสแควร์รูท

เมื่อพยายามที่จะหาสิ่งที่มีขนาดใหญ่ (หรือขนาดเล็ก) ของระยะทางที่ยังคงถือสำหรับจริงx^2 > y^2x > y

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


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

คำตอบคือใช่ถ้าสมการระยะทางใช้สแควร์รูท ซึ่งฉันพูดถึง
MichaelHouse

จุดที่ถูกต้องฉันจะถอนคำสั่งของฉัน แต่ก็เป็น 99% รับประกันว่าผู้ใช้หมายความ sqrt euclidean ระยะทาง (ผลรวม (ความแตกต่างมิติยกกำลังสอง))
im สับสนดังนั้น

@imsoconfused ยุติธรรมเพียงพอฉันได้เปลี่ยนลำดับของคำตอบเพื่อระบุสถานการณ์ที่เป็นไปได้มากที่สุด (99%) ก่อน
MichaelHouse

2
ใช่ประสบการณ์ของฉันคือเมื่อคุณจัดการกับสิ่งต่าง ๆ ฟังก์ชั่น DistanceSquared นั้นมีประโยชน์มาก เป็นที่ชัดเจนและหลีกเลี่ยงการดำเนินการ sqrt แพง
Loren Pechtel

0

คณิตศาสตร์บางอย่างสามารถช่วยได้

สิ่งที่คุณพยายามทำคือ:

<v1, v2> < <v1, v3> =>
sqrt((y2-y1)^2+(x2-x1)^2) < sqrt((y3-y1)^2+(x3-x1)^2) =>
y2^2 - 2*y2y1 + y1^2 + x2^2 - 2*x2x1 + x1^2 < y3^2 - 2*y3y1 + y1^2 + x3^2 - 2*x3x1 + x1^2

จากสิ่งที่คุณสามารถลบตัวแปรซ้ำและจัดกลุ่มอื่น ๆ ได้ การดำเนินการที่คุณต้องตรวจสอบคือ:

y3^2 - y2^2 - 2*y1(y3-y2) + x3^2 - x2^2 - 2*x1(x3-x2) > 0

หวังว่ามันจะช่วย


-1

คำถามจริงดูเหมือนจะเป็นวิธีการลดการคำนวณสำหรับการกำหนดวัตถุที่ใกล้ที่สุด?

การเพิ่มประสิทธิภาพนี้มักจะทำในเกมแม้ว่าจะมีการปรับให้เหมาะสมทั้งหมดควรมีการแนะนำโปรไฟล์และบ่อยครั้งที่ไม่ทำให้สิ่งต่าง ๆง่ายขึ้น

วิธีหลีกเลี่ยงการคำนวณระยะทางที่ไม่จำเป็นเพื่อกำหนดสิ่งที่ใกล้ที่สุด - หรือทุกสิ่งภายในช่วงที่กำหนด - คือการใช้ดัชนีเชิงพื้นที่ e กรัมoctree

สิ่งนี้จะจ่ายออกหากมีวัตถุจำนวนมากเท่านั้น สำหรับวัตถุสามชิ้นเท่านั้นมันไม่น่าเป็นไปได้ที่จะชำระหนี้และแน่นอนว่าจะไม่ทำให้รหัสง่ายขึ้น


4
ฉันคิดว่าคำถามจริงตรงไปตรงมาและคำตอบนี้ไม่ได้ตอบคำถามนั้น หากคุณต้องการที่จะคาดเดาเกี่ยวกับ OP ของคำถามที่ไม่มีการระบุที่ลึกล้ำที่ควรทำเพื่อแสดงความคิดเห็นหากคุณไม่ได้ตอบคำถามที่ถามจริง

ฉันกำลัง downvoting นี้เพราะการเรียกใช้การเพิ่มประสิทธิภาพก่อนวัยอันควรเป็นไปได้ไม่ใช่คำตอบของปัญหาที่การเพิ่มประสิทธิภาพอย่างชัดเจนไม่กระทบต่อความสามารถในการอ่านการบำรุงรักษาโค้ด เมื่อคุณสามารถเขียนโค้ดที่ง่ายและปรับให้เหมาะสมแล้วทำไมไม่ลองทำ แน่นอนว่ามันไม่เจ็บที่จะทำแม้ว่าคุณจะมีแผนระดับที่สูงขึ้น (ไม่มีนักพัฒนาเกมจะปฏิเสธ microseconds พิเศษต่อเฟรมโดยเฉพาะบนคอนโซล)
Teodron

@teodron: "เมื่อคุณสามารถเขียนโค้ดที่ง่ายและดีที่สุดแล้วทำไมไม่ทำอย่างนั้นล่ะ?" - เนื่องจาก OP (และตอนนี้เรา)ได้ใช้เวลาจำนวนหนึ่งในการเพิ่มประสิทธิภาพบางอย่างซึ่งอาจทำให้เขาไม่ได้ประโยชน์อะไรเลย
BlueRaja - Danny Pflughoeft

@ BlueRaja-DannyPflughoeft ฉันเห็นด้วยกับสิ่งนี้ว่าเป็นผู้เยาว์ (ดังนั้นการเพิ่มประสิทธิภาพที่ไม่มีนัยสำคัญหากใช้สำหรับการโทรไม่กี่ร้อยต่อเฟรม แต่ถ้าปัจจัยของขนาดเพิ่มขึ้นเป็นพัน ๆ สิ่งต่าง ๆ จะเปลี่ยนไปอย่างแน่นอน) อย่างไรก็ตามเราทุกคนมีอิสระที่จะไม่เสียเวลากับการพยายามตอบ / ปรับสิ่งที่เราเห็นว่าไม่เหมาะสม OP ถามถึงสิ่งหนึ่งผู้คนสันนิษฐานว่า OP ไม่ทราบกลยุทธ์ระดับสูงและการปฏิบัติในการทำโปรไฟล์ โดยส่วนตัวฉันชอบที่จะพูดในความคิดเห็นไม่ใช่คำตอบ ขออภัยที่เป็น verbose :(.
teodron

-3

มันขึ้นอยู่กับว่าเอาต์พุตของระยะทาง (v1, v2) คืออะไร

ถ้ามันเป็นทศนิยม (ลอยหรือสองครั้ง) เหนือเวกเตอร์ก็มีแนวโน้มว่า distancesquared จะเร็วกว่ามาก


5
ฉันไม่เห็นว่ามันfloatจะเกี่ยวข้องกับอะไร
MichaelHouse

ฉันหมายถึงการลอยเหนือเวกเตอร์อื่น ๆ ก็ไม่ได้อธิบายอย่างดีโดยเฉพาะ (และฉันคิดว่าคุณรู้เรื่องนี้)
RoughPlace

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