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);
そもそも、P1XやP2Xはなんの値なのでしょうか?
同じ座標を違う方法で求めているだけに見えるのですが…
最短距離座標です
P1X、P1Yは線分p1からp2までの最短距離
P2X、P2Yは線分p2からp1までの最短距離です
わかりにくくてすいません
そもそも2次元平面上ではねじれの関係にはなりません。直線であれば交わるか平行のどちらかです。参照のサイトはシリーズものの一部みたいですが、その前のステップまでは読んだりコードを書いたりしたのですか?たんにつまみ食いして爆死しているように見えます。
もちろんそれをしたうえでの質問です
ねじれの関係と書いてあるのはコピーペーストしたとき書かれていたものを
自分が消していなかっただけです
分をややこしくしたのであればすいません
回答した通り,現状「何が問題点なのか」が不明です.
「何がどうなるべき」であるのかを,図か何かで示せませんか?
P1X,P1Y,P2X,P2Y 等が2本の線に対してどこの何の量に相当するものなのか,というのを.
画像のほう追加しました
これでわかりやすくなりましたでしょうか?
(図の見方がわからんという…)
具体的にどのあたりがわかりにくいでしょうか?
回答2件
あなたの回答
tips
プレビュー