別の点と方向を指定して、長方形に沿って最も近い点を見つける


8

四角形、および四角形へのベクトル方向を持つ点が与えられます。その長方形の外側で問題の点に最も近い点を見つけるにはどうすればよいですか?

長方形に面したポイント


あなたが求めていることをもっと説明できますか?本当に理解できません。

たとえば、オブジェクトに面しているキャラクター(長方形)がいて、そのキャラクターから長方形に架空の線を引いたとします。線が接触している長方形のオブジェクトの外側に沿ったどの点を知ることができるか知りたいのですが。
onedayitwillは、2011

1
Googleで検索するキーワードは「AABB」(軸に沿った境界ボックス)です。「ボックス」(長方形)がまだ軸合わせされていない場合、気になるすべてのアイテムで使用される単純な変換行列を最初に使用して、1つに変更できます。
Martin Sojka、2011

回答:


6

使用できるテクニックの1つは「レイキャスティング」と呼ばれます。これは一般にグラフィックスのレンダリングに使用されますが、見通し内(望んでいるとおり)やパス検索などの他のアプリケーションがあります。一般的には、光線とオブジェクトの交点を見つけることによって機能します。あなたの例では、光線はキャラクターの方向のベクトルです。

レイ/オブジェクトの交差(および偶然に他のオブジェクト/オブジェクトの交差)に関する有用なリファレンスは、www.realtimerendering.com / intersections.htmlです(ray / aabbおよびray / obbのリファレンスを参照してください)。


9

長方形には4つの辺があります。各辺は線分です。

光線との交差について、4つの側面のそれぞれをテストします。最も近いヒットを追跡します。

次に、セグメントのどこで光線が当たるかを調べるコードをいくつか示します。

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

ボックスが軸合わせされている場合、ポイントがボックスの外側にある場合は、各座標軸をボックスにクランプする必要があります。

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 ;

これをx、y、z軸に対して行う場合、最初にボックスの外側にある場合point、ボックスの最も近い壁に叩きつけられます。既にボックス内にある場合は、そのままになります(ある場合)。


0

さて、これを解決するために、線形代数(より具体的には、解析幾何学)を使用することができます。長方形をどのようにモデル化したかによります。

これが一般的なケースです:http : //paulbourke.net/geometry/lineline2d/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.