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

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

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

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

Q&A

解決済

2回答

2037閲覧

線分と線分の当たり判定

apa

総合スコア68

C++

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

0グッド

1クリップ

投稿2020/06/23 04:20

編集2020/07/02 08:15

http://marupeke296.com/COL_3D_No27_CapsuleCapsule.html
上記のサイトをもとに線分と線分の当たり判定を実装しました。
ソースが少しわかりにくいですがとりあえず平行とかの処理は行わず(初めのに4行で平行にならないよう調整)にt1,t2と各線分の最短衝突位置、最短長さを求めようとしています。
しかしP1X,P1Yが P2X, P2Yとまったく同じ値になります。
ノートにかきうつしながらっやっているのですが、 t1,t2は正常だとおもっています。
そもそも自分の考え方に間違いがあるのでしょうか?
サイトの内容が長いのでもし同じような経験があれば教えていただきたいです。

(P1X, P1Y) は P2線分への最短距離座標
(P2X, P2Y) は P1線分への最短距離座標

イメージ説明

実行したいこと
t1 t2(0 ~ 1の間)の数値からその点の座標を出力するようなプログラムを作りたい

float p1x = 0, p1y = 0; float v1x = 10, v1y = 0; float p2x = 0, p2y = -1; float v2x = 5, v2y = 5; // 2直線はねじれ関係 float DV1V2 = v1x * v2x + v1y * v2y; float DV1V1 = v1x * v1x + v1y * v1y; float DV2V2 = v2x * v2x + v2y * v2y; float P21P11x = p1x - p2x; float P21P11y = p1y - p2y; float t1 = (DV1V2 * (v2x * P21P11x + v2y * P21P11y) - DV2V2 * (v1x * P21P11x + v1y * P21P11y)) / (DV1V1 * DV2V2 - DV1V2 * DV1V2); float P1X = p1x + (v1x * t1); float P1Y = p1y + (v1y * t1); float p1xp2x = P1X - p2x; float p1yp2y = P1Y - p2y; float t2 = (v2x * p1xp2x + v2y * p1yp2y) / DV2V2; float P2X = p2x + (v2x * t2); float P2Y = p2y + (v2y * t2); float Lenght = sqrtf((P2X - P1X) * (P2X - P1X) + (P2Y - P1Y) * (P2Y - P1Y)); printf("%f, %f \n", P1X, P1Y); printf("%f, %f \n", P2X, P2Y); printf("%f\n", Lenght); printf("%f, %f", t1, t2);

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

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

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

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

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

izmktr

2020/06/23 04:54

そもそも、P1XやP2Xはなんの値なのでしょうか? 同じ座標を違う方法で求めているだけに見えるのですが…
apa

2020/06/23 05:51

最短距離座標です
apa

2020/06/23 05:54

P1X、P1Yは線分p1からp2までの最短距離 P2X、P2Yは線分p2からp1までの最短距離です わかりにくくてすいません
anndonut

2020/06/23 12:16

そもそも2次元平面上ではねじれの関係にはなりません。直線であれば交わるか平行のどちらかです。参照のサイトはシリーズものの一部みたいですが、その前のステップまでは読んだりコードを書いたりしたのですか?たんにつまみ食いして爆死しているように見えます。
apa

2020/06/24 04:20

もちろんそれをしたうえでの質問です
apa

2020/06/24 04:21

ねじれの関係と書いてあるのはコピーペーストしたとき書かれていたものを 自分が消していなかっただけです 分をややこしくしたのであればすいません
fana

2020/07/02 07:08

回答した通り,現状「何が問題点なのか」が不明です. 「何がどうなるべき」であるのかを,図か何かで示せませんか? P1X,P1Y,P2X,P2Y 等が2本の線に対してどこの何の量に相当するものなのか,というのを.
apa

2020/07/02 08:18

画像のほう追加しました これでわかりやすくなりましたでしょうか?
fana

2020/07/02 08:30

(図の見方がわからんという…)
apa

2020/07/05 10:58

具体的にどのあたりがわかりにくいでしょうか?
guest

回答2

0

自己解決

なぜかわかりませんが
解決しました
後ほどしゅうせいしておきます

投稿2020/07/05 11:32

apa

総合スコア68

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

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

0

しかしP1X,P1Yが P2X, P2Yとまったく同じ値になります。

P1X、P1Yは線分p1からp2までの最短距離

P2X、P2Yは線分p2からp1までの最短距離です

2つの線分があって,最も近づく箇所の距離を求めたならば,それは
「2つの線分が最も近づく箇所の距離」なのだから,「どっちからどっちまでの距離」という話にならないように思うのですが.
つまり,同じ値になるのが当たり前な話なのでは

float p1x = 0, p1y = 0;

float v1x = 10, v1y = 0;
float p2x = 0, p2y = -1;
float v2x = 5, v2y = 5;

(私のこの記述への理解が正しければ,ですが)2つの線分は (1,0) で交差するのではないでしょうか.
なので,このコードは交点の座標を(前記のように同じものを2回)
1.0, 0.0
1.0, 0.0
のように(:出力される桁数が違うだろうけども)表示し,
次に,「距離」を
0.0
のように表示し(交わっているのだから距離は0),
最後に,t1とt2の値を
0.1, 0.2
みたく表示するのが正解なのではないでしょうか.

で,実際に動かしてみると,そのような出力になっているように見えます.

…なので……今の所,問題はなさそうに見えます.

投稿2020/06/25 08:56

編集2020/06/25 08:57
fana

総合スコア11996

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

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

apa

2020/06/26 02:37

すいません 自分の書きかたが間違っていたのですが、距離ではなく最短距離の座標ですね 書き方が悪くて申し訳ありません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問