長方形と線分が交差するかどうかの判定プログラムを組もうとしているのですが,わかりません.
以下はのソースコードは,2線分が交差するかどうかを判定するプログラムです.
線分同士の交差は,或る程度理解することができたのですが,ここからどこをどう変えれば,長方形と線分の交差にできるのかがわからず,行き詰っています.
よければ,助言いただけないでしょうか?
###該当のソースコード
#include <stdio.h> /**************************/ /* ベクトルの大きさの2乗 */ /*************************/ double norm(double *x) { return x[0] * x[0] + x[1] * x[1]; }**** /****************************/ /* 2つのベクトルの内積 */ /* a,b : 2つのベクトル */ /****************************/ double dot(double *a, double *b) { return a[0] * b[0] + a[1] * b[1]; } /******************************/ /* 2つのベクトルの外積(z成分) */ /* a,b : 2つのベクトル */ /******************************/ double cross(double *a, double *b) { return a[0] * b[1] - a[1] * b[0]; } /***************************/ /* 点と線分の関係 */ /* p0,p1,p2 : 3つの点 */ /***************************/ int ccw(double *p0, double *p1, double *p2) { int sw = 0; double a[2], b[2], EPS = 1.0e-8; a[0] = p1[0] - p0[0]; a[1] = p1[1] - p0[1]; b[0] = p2[0] - p0[0]; b[1] = p2[1] - p0[1]; if (cross(a, b) > EPS) // 点p2は線分p0-p1の反時計方向 sw = 1; else if (cross(a, b) < -EPS) // 点p2は線分p0-p1の時計方向 sw = -1; else if (dot(a, b) < -EPS) // 点p2は線分p0-p1の手前 sw = 2; else if (norm(a) < norm(b)) // 点p2は線分p0-p1の先 sw = -2; return sw; // 点p2は線分p0-p1の上 } /************************************/ /* 線分p1-p2と線分p3-p4の交点の有無 */ /************************************/ int isIntersect(double *p1, double *p2, double *p3, double *p4) { int sw = 0; // 交点なし if (ccw(p1, p2, p3) * ccw(p1, p2, p4) <= 0 && ccw(p3, p4, p1) * ccw(p3, p4, p2) <= 0) sw = 1; // 交点あり return sw; } int main() { double a[2], b[2], c[2], d[2]; int sw; printf("線分ABにおける点Aの座標(x, y)"); scanf_s("%lf %lf", &a[0], &a[1]); printf("線分ABにおける点Bの座標(x, y)"); scanf_s("%lf %lf", &b[0], &b[1]); printf("線分CDにおける点Cの座標(x, y)"); scanf_s("%lf %lf", &c[0], &c[1]); printf("線分CDにおける点Dの座標(x, y)"); scanf_s("%lf %lf", &d[0], &d[1]); sw = isIntersect(a, b, c, d); if (sw > 0) printf("交点あり\n"); else printf("交点なし\n"); return 0; }
###試したこと
四角形の任意の辺と線分のベクトルの外積が0以下になればいいということは調べていると分かったのですが,実際どう組みかえればいいのかがわかりませんでした.
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/14 16:45
2016/07/14 23:16
2016/07/15 04:09
2016/07/18 23:34