Tìm điểm gần nhất dọc theo một hình chữ nhật, cho một điểm và hướng khác


8

Cho một hình chữ nhật, và một điểm có hướng vectơ về phía hình chữ nhật. Làm thế nào tôi có thể tìm thấy điểm gần nhất ở bên ngoài hình chữ nhật đó đến điểm đang xét?

Hình chữ nhật đối diện


Bạn có thể giải thích thêm những gì bạn đang hỏi? Tôi thực sự không nhận được nó.

Giả sử tôi có một nhân vật đối diện với một đối tượng (một hình chữ nhật) và tôi vẽ một đường tưởng tượng từ ký tự đó đến hình chữ nhật. Tôi muốn biết làm thế nào tôi có thể biết điểm nào dọc theo bên ngoài của đối tượng hình chữ nhật mà đường chạm vào.
onedayitwillmake

1
Từ khóa họ tìm kiếm trong Google là "AABB" (hộp giới hạn theo trục). Nếu "hộp" (hình chữ nhật) của bạn chưa được căn chỉnh theo trục, thì một ma trận biến đổi đơn giản - được sử dụng trên tất cả các mục bạn quan tâm, rõ ràng - có thể được sử dụng trước tiên để thay đổi nó thành một.
Martin Sojka

Câu trả lời:


6

Một kỹ thuật mà bạn có thể sử dụng được gọi là "đúc tia". Nó thường được sử dụng để kết xuất đồ họa, nhưng có các ứng dụng khác như tầm nhìn (như bạn muốn làm) và tìm đường. Nói chung, nó hoạt động bằng cách tìm giao điểm của tia và vật. Trong ví dụ của bạn, tia là vectơ cho hướng của nhân vật.

Một tài liệu tham khảo hữu ích cho các giao điểm tia / đối tượng (và các giao điểm đối tượng / đối tượng khác) là www.realtimerendering.com/intersections.html (xem các tài liệu tham khảo về ray / aabb và ray / obb).


9

Hình chữ nhật có bốn cạnh. Mỗi bên là một đoạn đường.

Kiểm tra mỗi bốn cạnh cho giao điểm với tia. Theo dõi cú đánh gần nhất.

Đây là một số mã để tìm ra vị trí trên phân khúc mà tia tới:

bool intersect(const ray& ray, const segment& segment,point& hit) {
    // where do we intersect this line?
    float t = ((ray.direction.x * ray.origin.y + ray.direction.y *
        (segment[0].x - ray.origin.x)) -
        (ray.direction.x * segment[1].y)) /
        (ray.direction.y * (segment[0].x + segment[1].x) -
        ray.direction.x * (segment[0].y + segment[1].y));
    if(t >= 0.0 && t<=1.0) { // in the segment
        hit = segment[0] + (segment[1]-segment[0]*t);  // lerp
        return true;
    }
    return false; // no hit
}

1

Nếu hộp của bạn được căn chỉnh trục, bạn chỉ cần kẹp từng trục tọa độ vào hộp nếu điểm nằm ngoài hộp.

Từ RTCD pg 130:

// Do this for all 3 axes
if( point.x < min.x )  point.x = min.x ;
else if( point.x > max.x )  point.x = max.x ;

Nếu bạn làm điều này cho các trục x, y, z, thì nó pointsẽ được đập vào bức tường gần nhất của hộp, nếu nó nằm ngoài hộp để bắt đầu. nếu nó đã ở trong hộp, nó sẽ được để yên (nơi nó ở).


0

Vâng, bạn có thể sử dụng chỉ đại số tuyến tính (hình học giải tích, để cụ thể hơn) để giải quyết điều này. Nó phụ thuộc vào cách bạn mô hình hóa hình chữ nhật.

Đây là một trường hợp chung: http://paulbourke.net/geometry/lineline2d/

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.