Làm thế nào để bạn tính toán nếu 2 dòng hướng về phía trước hoặc đi?


10

Cho 4 điểm mô tả 2 phân đoạn dòng, làm thế nào để bạn tính toán nếu dòng A hướng tới hoặc cách xa dòng B?

2 dòng có độ dài cố định và có thể được đo là khoảng cách từ x1 / y1 đến x2 / y2.

nhập mô tả hình ảnh ở đây


Trường hợp với đường cong bezier khác với trường hợp có đường thẳng như thế nào? Bạn có đường cong hoàn toàn có thể bao quanh đường kia không (để mọi hướng sẽ chỉ "hướng")?
bummzack

1
Bạn có thể cần phải làm rõ các điều khoản của bạn. Trong Hình học, một "đường" kéo dài vô tận theo cả hai hướng, trái ngược với nửa đường hoặc đoạn, vì vậy 2 đường luôn luôn giao nhau trừ khi chúng song song. Bạn đang hỏi về cái nào? Bạn đã vẽ một mũi tên, ngụ ý hướng, mà theo tôi ngụ ý một phân đoạn hoặc nhiều nhất là nửa dòng. Và định nghĩa của bạn về "hướng tới" và "đi" là gì?
Hackworth

Đường cong Bezier có thể khó biểu diễn hơn trong đẳng thức cần thiết để giải một bài kiểm tra giao cắt đường tia. Nhân tiện, tôi sẽ thay đổi từ đại diện cho mũi tên của bạn thành "tia". Bạn có thể nhận được một phản ứng nhanh hơn. Tôi sẽ trả lời điều này nếu tôi có thời gian trong bữa trưa nếu không có ai làm. Nếu không, đây là một nhiệm vụ cực kỳ phổ biến trong các trò chơi. Google "Thử nghiệm phân khúc đường Ray". Tôi nghi ngờ bài kiểm tra đường cong bezier là tương tự, nhưng tôi chưa bao giờ thử nó.
brandon

3
Bạn nên chia câu hỏi của bạn thành hai. Phần với các phân đoạn dòng là rất dễ dàng. Phần có đường cong bezier cực kỳ phức tạp và chỉ có một giải pháp số gần đúng.
sam hocevar

Tôi đã chia câu hỏi của tôi thành 2, theo yêu cầu. Phần thứ 2 có tại đây: gamedev.stackexchange.com/questions/21463/ trên
Robinicks

Câu trả lời:


11

Cho ABlà hai điểm trên đường màu đen. Hãy để CDlà phân khúc màu xanh của bạn. Dấu hiệu ztọa độ của sản phẩm chéo AB^ACcho bạn biết liệu C"trái" hay "phải" của đường màu đen. Tương tự, sản phẩm chéo AB^CDcho bạn biết liệu CDlái "trái" hay "phải" của đường màu đen.

Chúng tôi không thực sự muốn biết liệu nó trái hay phải; tất cả những gì chúng tôi muốn là đảm bảo chúng cùng hướng hoặc ngược chiều, đó là lý do tại sao chúng tôi nhân hai giá trị.

Do đó, mã giả sau đây sẽ hoạt động:

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 */

Tôi sợ rằng tôi cần một chút thời gian để viết một giải pháp thích hợp cho đường cong Bezier. Là tình huống sau đây đối với hoặc đi?

Vấn đề?


Đối với đường cong, tôi tin rằng bạn có thể tìm thấy tiếp tuyến của đường cong tại điểm gần nhất với đoạn đường của bạn và sử dụng đường này giống như cách bạn kiểm tra các đoạn đường khác của mình. Có lẽ khó hơn một chút so với âm thanh của nó :)
thịt

@stephelton: Nhìn lại bức tranh thứ hai để biết các đường cong bezier, chỉ về phía một đường cong cong đi. Hoặc xem xét một đường cong có tiếp tuyến song song với đoạn có thể giao nhau, nhưng đường cong về phía đoạn đó và giao nhau.
Cascabel

+1 cho trollface và toán tốt :). Tuy nhiên, biểu đồ 'hướng về' của bạn thực sự vẫn có 'đi' - chỉ cần di chuyển điểm bắt đầu phía trên đường kẻ.
Jonathan Dickinson

@JonathanDickinson cảm ơn, tôi đã cập nhật hình ảnh để làm cho nó rõ ràng hơn một chút về cuộc thẩm vấn của tôi!
sam hocevar

2

Giả sử điểm bắt đầu là vòng tròn màu xanh lá cây và điểm kết thúc là mũi tên màu đỏ

Tính khoảng cách giữa điểm bắt đầu là DS và đoạn màu đen và thực hiện tương tự cho điểm cuối (mũi tên màu đỏ) là DE. Nếu DS> DE, thì đoạn đang chỉ về phía. nếu DE> DS, nó đang chỉ đi. Nếu cả hai đều bằng nhau, hai là song song.

Bạn có thể tìm cách tính khoảng cách từ một điểm đến một đoạn ở đây và đến một đường cong bậc hai ở đây . Tuy nhiên, tùy thuộc vào hình dạng của đường cong bezier, nó có thể trả về kết quả kỳ lạ (đường cong có thể tự vượt qua)


DS> DE được đảm bảo chỉ hoạt động cho các đường thẳng. Nó có thể thất bại cho Beziers. Ngoài ra, bạn không biết định nghĩa của anh ấy về "hướng tới". Nếu phần mở rộng của mũi tên sẽ vượt qua một dòng được xác định bởi 2 điểm, nhưng không phải là đoạn được xác định bởi cùng một điểm, liệu nó có còn "hướng" không?
Hackworth

Tôi đang nói về hai phân đoạn, không phải dòng, vì vậy không có "phần mở rộng của mũi tên". Ngoài ra, việc mũi tên chỉ vào đâu không quan trọng, như chúng ta đang nói về khoảng cách ở đây. Điểm gần nhất trên đường màu đen có thể là điểm bắt đầu / điểm kết thúc của đường màu đen, không thành vấn đề. Hai phân đoạn có thể là cộng tuyến, phương pháp này vẫn hoạt động như dự định. Đối với các đường cong bezier tôi đã đề cập, nó sẽ cho kết quả kỳ lạ tùy thuộc vào hình dạng của đường cong.
Ravachol
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.