線分 (AB) があり、その線分が動いていることを収集しました。線分が別の線分 (船など) と衝突するポイントを知りたいと考えています。
したがって、数学的には、2 つの線がいつ交差するかを確認し (平行でない限り、2 つの線は常に交差します)、交差する点が画面上にあるかどうかを確認する必要があります。まず、線分を次のような線の方程式に変換する必要があります。
typedef struct {
GLfloat A;
GLfloat B;
GLfloat C;
} Line;
static inline Line LineMakeFromCoords(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) {
return (Line) {y2-y1, x1-x2, (y2-y1)*x1+(x1-x2)*y1};
}
static inline Line LineMakeFromSegment(Segment segment) {
return LineMakeFromCoords(segment.P1.x,segment.P1.y,segment.P2.x,segment.P2.y);
}
次に、それらが交差するかどうかを確認します
static inline Point2D IntersectLines(Line line1, Line line2) {
GLfloat det = line1.A*line2.B - line2.A*line1.B;
if(det == 0){
//Lines are parallel
return (Point2D) {0.0, 0.0}; // FIXME should return nil
}else{
return (Point2D) {(line2.B*line1.C - line1.B*line2.C)/det, (line1.A*line2.C - line2.A*line1.C)/det};
}
}
もちろん、船のすべての線分に対して線分をテストする必要があります.
数学はすべてウィキペディアにあります。詳細情報が必要な場合はそこを確認してください。
編集:
コメントをフォローアップするためのアドオン:
前と同じように、長方形の 4 つのセグメントすべてに対するセグメントの衝突をテストすると、次の 3 つのケースのいずれかが得られます。
- 衝突/衝突ポイントが画面上にない (衝突テストは線分ではなく線に対して行われることを忘れないでください。線は平行でない限り常に交差します)、欠落しているプレーヤーを挑発します :-)
- 1回の衝突、描画/やりたいことは何でもあなたが求めているセグメントはAC(C衝突点)になります
2 つの衝突。以下のコードのようなものを使用して、結果の各セグメント (A-C1) と (A-C2) のサイズを確認し、サイズが最も小さいものを保持します。
static inline float SegmentSizeFromPoints(Vertice3D P1, Vertice3D P2) {
return sqrtf(powf((P1.x - P2.x),2.0) + pow((P1.y - P2.y),2.0));
}
衝突を処理する際の注意点は、実行する必要があるテストの数を最小限に抑える方法を見つけることです。