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?
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?
Câu trả lời:
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).
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
}
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ó point
sẽ đượ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ó ở).
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/