2017-03-16 7 views
1

私はこの衝突検出機能を使用して、A)線分が円と交差しているかどうか、およびB)衝突が発生している線分の距離を判断しています。どのようにして衝突が発生しているかの割合を得ることができますか?

これは私自身が書いた関数ではないので、衝突を検出するためにはうまくいくようですが、それがインターセプトポイントに達すると、期待していませんでした。私は、衝突が発生した行の下の距離をパーセンテージとして取得しようとしています。たとえば、線分が100pxの長さで、円がそれに衝突している場合50px行を降りて、関数が50px、そこから私は簡単にパーセンテージを計算することができます。 50pxロングのラインとの間の衝突のために

function interceptOnCircle(p1, p2, c, r) { 
    console.log(arguments); 
    //p1 is the first line point 
    //p2 is the second line point 
    //c is the circle's center 
    //r is the circle's radius 
    var p3 = { 
    x: p1.x - c.x, 
    y: p1.y - c.y 
    }; //shifted line points 
    var p4 = { 
    x: p2.x - c.x, 
    y: p2.y - c.y 
    }; 
    var m = (p4.y - p3.y)/(p4.x - p3.x); //slope of the line 
    var b = p3.y - m * p3.x; //y-intercept of line 
    var underRadical = Math.pow(r, 2) * Math.pow(m, 2) + Math.pow(r, 2) - Math.pow(b, 2); //the value under the square root sign 
    if (underRadical < 0) { 
    //line completely missed 
    return false; 
    } else { 
    var t1 = (-m * b + Math.sqrt(underRadical))/(Math.pow(m, 2) + 1); //one of the intercept x's 
    var t2 = (-m * b - Math.sqrt(underRadical))/(Math.pow(m, 2) + 1); //other intercept's x 
    var i1 = { 
     x: t1 + c.x, 
     y: m * t1 + b + c.y 
    }; //intercept point 1 
    var i2 = { 
     x: t2 + c.x, 
     y: m * t2 + b + c.y 
    }; //intercept point 2 
    console.log('Collision points: [' + i1.x + ', ' + i1.y + '], [' + i2.x + ', ' + i2.y + ']') 
    var distance = Math.hypot(p1.x - i2.x, p1.y - i2.y); 
    return distance; 
    } 
} 

、私はこのログを取得しています:ライン自体より長い値が得られvar distance = Math.hypot(p1.x - i2.x, p1.y - i2.y);

Collision points: [111.91311159515845, 90.88529912057992], [92.30169719247377, 112.87385466298396] 

。私はdistanceの値が0から50の間であることを期待しています。衝突が発生しているライン(p1から)に沿ったパーセンテージはどのようにして得られますか?

編集:ちょうど私がテストだ行が正しい長さであることを確認するために、私は、問題はあなたが元の2つのポイント間のものにあなたのソリューションを制限していないということかもしれないと思うconsole.log(Math.hypot(p1.x - p2.x, p1.y - p2.y)); //returns 49

答えて

0

でそれをテストしました。

あなたはmは、二つの点とcから算出した勾配である点ですy = mx + cによって与えられたラインとの交差を計算しているが、これは無限の長さのラインであるので、あなたは、元の2つの外側の交点を得ることができますポイント。

最も簡単なのは、必要に応じてパーセンテージを計算し、0未満または100%を超えるものは、実際には2点間の線分と有効な交差点ではないと結論づけます。

var length = Math.hypot(p1.x - p2.x, p1.y - p2.y); 
    var distance1 = Math.hypot(p1.x - i2.x, p1.y - i2.y); 
    var distance2 = Math.hypot(p1.x - i1.x, p1.y - i1.y); 
    var lowerBounds = Math.min(distance1, distance2); 
    if (lowerBounds < length) { 
    return lowerBounds; 
    } else { 
    return false; 
    } 
+0

ありがとうございました。 Worked:あなたの答えをコードで編集するように提案しました。 –

関連する問題