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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

11192閲覧

四角形と線分の交差判定

ohana1515

総合スコア13

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/07/19 06:23

編集2016/07/19 07:52

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

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

}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2016/07/19 06:31

C#関係ないですよね?
guest

回答2

0

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

投稿2016/07/20 15:45

PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

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

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

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

投稿2016/07/19 10:38

yuba

総合スコア5568

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問