3

2D移動オブジェクトがそれ自体のパスを横切ったことをどのように検出できますか? ここに画像の説明を入力してください

平面の以前の位置に基づいて、パスをポイントの配列として保存します。
擬似コードまたは任意のプログラミング言語を使用して、ソリューションを記述することができます。

これが私がすでに試した私のコードです-それは完全な360ループを検出します。別のアプローチが必要だと思います。

    CGFloat angleDiff = angleCurr - lastAngleRecorded;
    lastAngleRecorded = angleCurr;

    // Ensure -180 < angleDiff < 180
    angleDiff = angleDiff > M_PI ? angleDiff - (M_PI*2) : angleDiff;
    angleDiff = angleDiff < -M_PI ? angleDiff + (M_PI*2) : angleDiff;

    // Reset tracking of the loop of the plane's angle exceeds (turns too sharply) or falls below the limits

    if(fabsf(angleDiff) < angleDiffMinAllowed || fabsf(angleDiff) > angleDiffMaxAllowed) {
        if(++ringFaultCount >= ringFaultCountMax) {
            [self resetTracking];
            return;
        }
    }

    ringFaultCount = 0;

    // Add plane position to ring polygon
    [ringPoints addObject:[NSValue valueWithCGPoint: ccp(targetPlane.position.x, targetPlane.position.y)]];


    // Add angleDiff to angleTotal
    angleTotal += angleDiff;

    // Completed loop?
    if(fabsf(angleTotal) >= M_PI * 2.f) {

        [self resetTracking];

        if(isRingJoined){
            CCLOG(@"%@ RING COMPLETE", NSStringFromSelector(_cmd));
        }

        return;
    }
4

1 に答える 1

1

私も問題を抱えていました、私は座標系で直線を作ることによってそれを解決しました:

y = mx+q±­tolerance

説明させてください。線は、衝突があるかどうかを確認するポイントでの曲線の接線です。これは、そのポイントで「航空機」がたどった線です。許容誤差により、ラインは少し上に移動し、さらに少し下に移動します。したがって、2つの平行線を取得します。魔女は境界として見ることができます。また、x軸に公差を付ける必要があります

mは線の方向であり、その:tan(angle)、angleはx軸との角度です。

すべてがセットアップされている場合は、これを行う必要があります。

if(y_point < mx+q+tolerance && y_point> mx+q-tolerance && x_points > x-tolerance && x_point< x+tolerance
{
// some code
}
于 2013-01-20T18:20:58.510 に答える