Tôi có thể đơn giản hóa khoảng cách bất bình đẳng Khoảng cách (p1, p2) <khoảng cách (p1, p3) không?


14

Tôi đang làm việc trên một số logic vector, vì vậy tôi hỏi: tôi có thể tiết kiệm thời gian của bộ xử lý bằng cách đơn giản hóa bất đẳng thức này:

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

Tôi thấy điều đó vector1được lặp lại trong cả hai trường hợp.


10
Chỉ cần một lưu ý nhanh: phương pháp hiện tại của bạn rất dễ đọc và chức năng của nó có thể được hiểu ngay lập tức. Một số câu trả lời có thể hoàn thành nhiệm vụ bạn yêu cầu, nhưng ít rõ ràng hơn nhiều. Điều này là tốt nếu hiệu suất là điều cốt yếu, nhưng hãy chắc chắn để nhận xét nó đúng để giải thích cho sự mất đi sự rõ ràng.
MikeS

3
Để tiếp tục nhận xét của @ MikeS, hiệu suất chỉ là điều cốt yếu trong các trường hợp như thế này nếu bạn đã thực hiện phân tích hoặc định hình và đã xác định cuộc gọi này là một nút cổ chai. Khả năng bảo trì vượt qua hiệu năng thô nếu chúng ta đang nói về sự khác biệt giữa 305fps và 303fps.
Phoshi

Câu trả lời:


24

Vâng , bạn có thể đơn giản hóa điều này. Đầu tiên, ngừng gọi chúng là vectơ. Họ là những điểm. Hãy gọi cho họ A, BC.

Vì vậy, bạn muốn điều này:

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

Thay thế khoảng cách bằng khoảng cách bình phương, sau đó bằng các sản phẩm chấm (từ định nghĩa về độ dài Euclide . Thay thế ACbằng AB + BC(bây giờ đây là các vectơ thực). Mở rộng, đơn giản hóa, hệ số:

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)

Bạn đây rồi:

dot(AB + AC, BC) > 0

Với ký hiệu vector của bạn:

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

Đó là một vài bổ sung và một sản phẩm chấm thay vì hai sản phẩm chấm trước đó.


Bạn có thể giải thích làm thế nào bạn có thể thay thế a + b b = a a + c c bằng phiên bản sản phẩm chấm không?
TravisG

2
@TravisG Tôi không chắc chắn về những gì bạn đang hỏi. Nếu câu hỏi của bạn là tại sao dist(A, B)²giống như vậy dot(AB, AB), thì nó xuất phát từ chính định nghĩa về độ dài Euclide .
sam hocevar

2
Rõ ràng điều này (phần nào) đơn giản hóa phương trình toán học, nhưng sẽ không nhất thiết "tiết kiệm thời gian xử lý" cho OP. Nó dẫn đến sự phức tạp và nhiều tính toán hơn là chỉ loại bỏ căn bậc hai khỏi các phương trình khoảng cách ban đầu.
MichaelHouse

1
Sửa lỗi cho tôi nếu tôi sai nhưng hai sản phẩm chấm là 5 thao tác trên mỗi sản phẩm chấm cộng với hai chất nền vec3 có tổng cộng 16 thao tác, theo cách của bạn có 3 chất nền vec3 cộng với Bổ sung tạo ra 12 thao tác cộng với sản phẩm chấm làm cho 17.
Luis W

2
Thật thú vị, kết quả là sản phẩm chấm của hai đường chéo đối diện của hình bình hành. Nhưng điều đó không liên quan. Điều tôi muốn nói là không có một số tiền khổng lồ nào đạt được từ sự đơn giản hóa hoàn toàn này ; như những người khác đã đề cập, đó là một số tiền kha khá để làm xáo trộn hoặc làm phức tạp những gì bạn thực sự đang cố gắng tính toán. Tuy nhiên, bạn chắc chắn muốn sử dụng bước đầu tiên. Tránh một căn bậc hai không cần thiết luôn luôn có giá trị nó. Chỉ cần so sánh bình phương của khoảng cách là như nhau, vì khoảng cách là xác định dương, ngay cả trong mặt phẳng phức.
TASagent

16

Đúng. Giả sử distancehàm của bạn sử dụng căn bậc hai, bạn có thể đơn giản hóa điều này bằng cách loại bỏ căn bậc hai.

Khi cố gắng tìm khoảng cách lớn hơn (hoặc nhỏ hơn) của khoảng cách, x^2 > y^2vẫn đúng với x > y.

Tuy nhiên, những nỗ lực tiếp theo để đơn giản hóa phương trình toán học có khả năng là vô nghĩa. Khoảng cách giữa vector1vector2không giống với khoảng cách giữa vector1vector3. Mặc dù phương trình có thể được đơn giản hóa về mặt toán học như câu trả lời của Sam cho thấy, hình thức hiện tại có thể đơn giản như bạn sẽ nhận được từ quan điểm sử dụng bộ xử lý.


Tôi không có đủ đại diện, nhưng về cơ bản là không chính xác, tôi tin rằng: "tôi có thể tiết kiệm thời gian của bộ xử lý bằng cách đơn giản hóa sự bất bình đẳng này không?" Câu trả lời là có.
rất bối rối vào

Câu trả lời là chỉ có nếu phương trình khoảng cách sử dụng căn bậc hai. Mà tôi đề cập.
MichaelHouse

Điểm hợp lệ, tôi rút lại tuyên bố của mình. Tuy nhiên, đảm bảo 99% rằng người dùng có nghĩa là sqrt khoảng cách euclide (tổng (bình phương chênh lệch bình phương))
rất bối rối vào

@imsoconfuse Đủ công bằng, tôi đã thay đổi thứ tự câu trả lời của mình để nêu ra kịch bản có khả năng nhất (99%) trước tiên.
MichaelHouse

2
Vâng, kinh nghiệm của tôi là khi bạn xử lý loại công cụ này, chức năng Khoảng cách rất hữu ích. Nó chỉ rõ ràng và tránh hoạt động sqrt đắt tiền.
Loren Pechtel

0

Một số toán học có thể giúp đỡ.

Những gì bạn đang cố gắng làm là:

<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

Từ những gì bạn có thể loại bỏ các biến lặp đi lặp lại và nhóm một số người khác. Các hoạt động mà bạn phải kiểm tra là:

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

Hy vọng nó giúp.


-1

Câu hỏi thực sự có vẻ là làm thế nào để giảm tính toán cho việc xác định đối tượng gần nhất?

Tối ưu hóa điều này thường được thực hiện trong các trò chơi, mặc dù với tất cả các tối ưu hóa, nó nên được hướng dẫn hồ sơ và, thường, không đơn giản hóa mọi thứ.

Cách để tránh các tính toán khoảng cách không cần thiết để xác định thứ gần nhất - hoặc tất cả mọi thứ trong một phạm vi nhất định - là sử dụng một chỉ số không gian ví dụ như một quãng tám .

Điều này chỉ được đền đáp nếu có một số lượng lớn các đối tượng. Đối với chỉ ba đối tượng, không có khả năng thanh toán và chắc chắn không đơn giản hóa mã.


4
Tôi nghĩ rằng câu hỏi thực tế khá đơn giản và câu trả lời này không giải quyết được điều đó. Nếu bạn muốn suy đoán về những câu hỏi sâu hơn, không có căn cứ của OP nên thực sự được thực hiện như một nhận xét nếu bạn không thực sự trả lời câu hỏi được hỏi.

Tôi đang hạ thấp điều này bởi vì việc tối ưu hóa sớm có thể không phải là câu trả lời cho một vấn đề trong đó tối ưu hóa rõ ràng không làm tổn hại đến khả năng đọc, khả năng duy trì mã và cũng không khuyến khích các thực tiễn tối nghĩa. Khi bạn thực sự có thể viết mã đơn giản và tối ưu hóa, tại sao không làm điều đó? Chắc chắn sẽ không hại gì khi thực hiện nó, ngay cả khi bạn có kế hoạch cấp cao hơn (không nhà phát triển trò chơi nào sẽ từ chối thêm một vài micro giây trên mỗi khung hình, đặc biệt là trên bảng điều khiển).
teodron

@teodron: "Khi bạn thực sự có thể viết mã đơn giản và tối ưu hóa, tại sao không làm điều đó?" - Bởi vì OP (và bây giờ, chúng tôi) hiện đã dành một lượng thời gian không thể bỏ qua để tối ưu hóa một cái gì đó có thể mang lại cho anh ta không có lợi ích gì.
BlueRaja - Daniel Pflughoeft

@ BlueRaja-DannyPflughoeft Tôi đồng ý với điều này là nhỏ (do đó tối ưu hóa không đáng kể nếu được sử dụng cho vài trăm cuộc gọi trên mỗi khung hình, nhưng nếu hệ số cường độ tăng lên hàng nghìn, mọi thứ chắc chắn sẽ thay đổi). Tuy nhiên, tất cả chúng ta đều không lãng phí thời gian để cố gắng trả lời / tối ưu hóa một cái gì đó mà chúng ta cho là không khả thi. OP yêu cầu một điều, mọi người cho rằng OP không nhận thức được các chiến lược cấp cao hơn và thực hành hồ sơ. Cá nhân tôi thích đưa ra nhận xét như vậy trong các ý kiến, không phải trong câu trả lời. Xin lỗi vì quá dài dòng :(.
teodron

-3

nó phụ thuộc vào đầu ra của khoảng cách (v1, v2) là gì

nếu nó là số thập phân (float hoặc double) trên một vectơ thì có khả năng khoảng cách sẽ nhanh hơn rất nhiều


5
Tôi không thấy những gì nó floatphải làm với bất cứ điều gì.
MichaelHouse

tôi có nghĩa là nổi trên một vectơ khác chỉ không được giải thích đặc biệt (và tôi nghĩ rằng bạn biết điều đó)
RoughPlace

5
Tôi đã không cố ý hiểu lầm. Tôi vẫn không chắc ý của bạn là gì. Tôi không biết tại sao một hàm khoảng cách sẽ trả về một vectơ.
MichaelHouse
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.