Temukan titik terdekat di sepanjang persegi panjang, berikan titik dan arah lain

8

Diberikan kotak, dan titik dengan arah vektor menuju kotak. Bagaimana saya bisa menemukan titik terdekat di luar persegi panjang itu ke titik yang dimaksud?

Point Facing Rectangle

suatu hari nanti akan membuat
sumber
Bisakah Anda menjelaskan lebih lanjut apa yang Anda tanyakan? Aku benar-benar tidak mengerti.
Katakanlah saya memiliki karakter yang menghadap objek (persegi panjang), dan saya menggambar garis imajiner dari karakter tersebut ke persegi panjang. Saya ingin tahu bagaimana saya bisa tahu titik mana di sepanjang bagian luar objek persegi yang disentuh garis.
onedayitwillmake
1
Kata kunci yang mereka cari di Google adalah "AABB" (kotak pembatas sumbu-sejajar). Jika "kotak" Anda (persegi panjang) belum sejajar sumbu, matriks transformasi sederhana - digunakan pada semua item yang Anda pedulikan, jelas - dapat digunakan terlebih dahulu untuk mengubahnya menjadi satu.
Martin Sojka

Jawaban:

6

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).

Luke Van In
sumber
9

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
}
Akan
sumber
1

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 pointakan 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).

bobobobo
sumber
0

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/


sumber