四角形と線分の交差判定のプログラムを作成しました.
各頂点の座標と線分の座標を入力して交差判定するものです.
四角形の辺の長さと点Aの座標から点B~点Dの座標を求め,線分との交差判定を行いたいです.
どこの式を変えればいいのかわからず質問しました.
四角形の縦をL,横をMとすると.b[0]=a[0]+M などにするのでしょうか?
###該当のソースコード
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と線分p5-p6の交点の有無 */
int isIntersect(double *p1, double *p2, double *p3, double *p4, double *p5, double *p6)
{
int sw = 0; // 交点なし
if (ccw(p1, p2, p5) * ccw(p1, p2, p6) <= 0 && ccw(p5, p6, p1) * ccw(p5, p6, p2) <= 0 || ccw(p2, p3, p5) * ccw(p2, p3, p6) <= 0 && ccw(p5, p6, p2) * ccw(p5, p6, p3) <= 0 || ccw(p3, p4, p5) * ccw(p3, p4, p6) <= 0 && ccw(p5, p6, p3) * ccw(p5, p6, p4) <= 0 || ccw(p4, p1, p5) * ccw(p4, p1, p6) <= 0 && ccw(p5, p6, p4) * ccw(p5, p6, p1) <= 0) sw = 1; // 交点あり return sw;
}
int main()
{
double a[2], b[2], c[2], d[2],x[2],y[2];
int sw;
printf("四角形ABCDにおける点Aの座標(x, y)"); scanf_s("%lf %lf", &a[0], &a[1]); printf("四角形ABCDにおける点Bの座標(x, y)"); scanf_s("%lf %lf", &b[0], &b[1]); printf("四角形ABCDにおける点Cの座標(x, y)"); scanf_s("%lf %lf", &c[0], &c[1]); printf("四角形ABCDにおける点Dの座標(x, y)"); scanf_s("%lf %lf", &d[0], &d[1]); printf("線分XYにおける点Xの座標(x, y) "); scanf_s("%lf %lf", &x[0], &x[1]); printf("線分XYにおける点Yの座標 (x, y) "); scanf_s("%lf %lf", &y[0], &y[1]); sw = isIntersect(a, b, c, d ,x ,y); if (sw > 0) printf("交点あり\n"); else printf("交点なし\n"); return 0;
}
回答2件
あなたの回答
tips
プレビュー