Diberikan kotak, dan titik dengan arah vektor menuju kotak. Bagaimana saya bisa menemukan titik terdekat di luar persegi panjang itu ke titik yang dimaksud?
Diberikan kotak, dan titik dengan arah vektor menuju kotak. Bagaimana saya bisa menemukan titik terdekat di luar persegi panjang itu ke titik yang dimaksud?
Jawaban:
Salah satu teknik yang bisa Anda gunakan disebut "ray casting". Ini biasanya digunakan untuk rendering grafik, tetapi memiliki aplikasi lain seperti line-of-sight (seperti yang Anda ingin lakukan) dan pencarian jalur. Secara umum ia bekerja dengan menemukan persimpangan sinar dan objek. Dalam contoh Anda, ray adalah vektor untuk arah karakter.
Referensi yang berguna untuk persimpangan ray / objek (dan persimpangan objek / objek lainnya) adalah www.realtimerendering.com/intersections.html (lihat di bawah referensi untuk ray / aabb dan ray / obb).
Kotak memiliki empat sisi. Setiap sisi adalah segmen garis.
Tes masing-masing dari empat sisi untuk persimpangan dengan sinar. Lacak hit terdekat.
Berikut ini beberapa kode untuk mencari tahu di mana pada segmen yang disentuh ray:
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
}
Jika kotak Anda sejajar sumbu, Anda hanya perlu menjepit masing-masing sumbu koordinat ke kotak jika titik di luar kotak.
Dari RTCD hal 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 ;
Jika Anda melakukan ini untuk sumbu x, y, z, maka point
akan dibanting ke dinding terdekat kotak, jika itu di luar kotak untuk memulai. jika sudah ada di dalam kotak, itu akan dibiarkan sendiri (di mana itu).
Nah, Anda bisa menggunakan aljabar linear saja (geometri analitik, untuk lebih spesifik) untuk menyelesaikan ini. Itu tergantung pada bagaimana Anda memodelkan persegi panjang.
Berikut ini adalah kasus umum: http://paulbourke.net/geometry/lineline2d/