質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.52%

四角形と線分の交差判定

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,983

ohana1515

score 11

四角形と線分の交差判定のプログラムを作成しました.
各頂点の座標と線分の座標を入力して交差判定するものです.

四角形の辺の長さと点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;
}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ozwk

    2016/07/19 15:31

    C#関係ないですよね?

    キャンセル

回答 2

checkベストアンサー

0

接する場合と串刺しの場合

判断条件の詳細についてですが、図の①の場合、「交差している」と判定しますか? ①は接しているだけです。実際、四角形の各線分とXYはどれも交差しないので、交差していないと判断できそうです。

では、②は? これは、交差していると判断すべきケースです。しかし、各線分とXYはどれも交差しません。

②をどうするかが結構難問なのですが、その前提として、①はどう判定しますか? (①を交差すると判定してしまうことにすれば②は自動的に交差すると判定できるわけですが)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

あれ?ohana1515さん、これで解決済みになったんじゃないの?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る