自機と敵が一機ずつ居るとします。
そのふたつを結ぶ線分の中点からある程度(ここでは線分の長さと同じにしようとしています)垂直に離れた点を求めたいです。
自分は
自機座標をA(ax,ay) 敵座標をB(bx,by)と置くとその2つを結ぶ線分の中心座標T(tx,ty)を
tx = (ax+bx)/2
ty = (ay+by)/2
TとAの距離 r を
r^2 = (tx-ax)^2 + (ty-ay)^2
そしてAをTを中心に90度回転した座標C(cx,cy)を
cx = r * cos(π/2) + tx
cy = r * sin(π/2) + ty
さらにその座標をTからCに向かって r 分延長した座標D(dx,dy)を
dx = (-r*tx+(r+r)cx)/r
dy = (-r*ty+(r+r)cy)/r
として最終的にDを求めようとしているのですがうまくいきません。
ABの線分を挟んで原点と逆の方向にとりたいのですがどうにも原点の方向に行ってしまったりして思い通りの場所に行きません。
ちなみに自機と敵は原点から一定距離の半径を持った同一円状をそれぞればらばらに回っています。
何が間違っているか、他の方法があるのか教えてください。お願いします。
環境 :Windows7 C++ VisualStudio2008 DXライブラリ
二点を結ぶ線の中点から垂直にある程度離れた点
Re: 二点を結ぶ線の中点から垂直にある程度離れた点
座標の回転てこんな式でしたっけ?マサヒコ さんが書きました: そしてAをTを中心に90度回転した座標C(cx,cy)を
cx = r * cos(π/2) + tx
cy = r * sin(π/2) + ty
cos(π/2), sin(π/2)は定数なので常に
cx = tx
cy = r + ty
となってしまいます。
Re: 二点を結ぶ線の中点から垂直にある程度離れた点
>>h2so5さん
http://dixq.net/forum/viewtopic.php?f=3&t=5036
ここを参考にしました。
>>赤鬼さん
最初にベクトルを使った計算法を書かれていた気がするのですが、気のせいでなければ詳しく教えて下さいませんか?
ちなみに現在自分が書いた式をお二人の意見を取り入れて手直ししましたが、
ぱっと見、求めたい点が出ているように見えるけど
自機と敵が交差して位置を入れ替えた時、点が原点側にいってしまう状態です。
http://dixq.net/forum/viewtopic.php?f=3&t=5036
ここを参考にしました。
>>赤鬼さん
最初にベクトルを使った計算法を書かれていた気がするのですが、気のせいでなければ詳しく教えて下さいませんか?
ちなみに現在自分が書いた式をお二人の意見を取り入れて手直ししましたが、
ぱっと見、求めたい点が出ているように見えるけど
自機と敵が交差して位置を入れ替えた時、点が原点側にいってしまう状態です。
Re: 二点を結ぶ線の中点から垂直にある程度離れた点
複素数を使えば、簡単に求められると思います。
(A + B) / 2.0 は A と B の中点で、
(B - A) * std::polar(1.0, M_PI / 2.0) は B から A に向かうベクトルを90度回転させたものです。
※座標系のとり方によっては、 return (A + B) / 2.0 - (B - A) * std::polar(1.0, M_PI / 2.0); とする必要があるかもしれません。
#define _USE_MATH_DEFINES // for Visual Studio
#include <cmath>
#include <complex>
std::complex<double> CalcX(std::complex<double> A, std::complex<double> B)
{
return (A + B) / 2.0 + (B - A) * std::polar(1.0, M_PI / 2.0);
}
(B - A) * std::polar(1.0, M_PI / 2.0) は B から A に向かうベクトルを90度回転させたものです。
※座標系のとり方によっては、 return (A + B) / 2.0 - (B - A) * std::polar(1.0, M_PI / 2.0); とする必要があるかもしれません。
Re: 二点を結ぶ線の中点から垂直にある程度離れた点
ベクトルは概念的な物でやってることは一緒です。
ただ、オーバーロードとクラスを用意すれば見掛け上簡素で綺麗なコードが書けるので最初に書きました。
(最適化が無ければちょっと無駄な処理が増えますけど)
しかし、座標がx,yで表示されていたのでベクトルじゃない方法の方がいいかと思いまして消しただけです。
他には自キャラと敵キャラのベクトルと、自キャラと目的の点とのベクトルの内積から+か-かで判断して法線ベクトルに-掛けるとかはどうでしょうか?
ただ、オーバーロードとクラスを用意すれば見掛け上簡素で綺麗なコードが書けるので最初に書きました。
(最適化が無ければちょっと無駄な処理が増えますけど)
しかし、座標がx,yで表示されていたのでベクトルじゃない方法の方がいいかと思いまして消しただけです。
他には自キャラと敵キャラのベクトルと、自キャラと目的の点とのベクトルの内積から+か-かで判断して法線ベクトルに-掛けるとかはどうでしょうか?
Re: 二点を結ぶ線の中点から垂直にある程度離れた点
予想外にコメントが多くてうれしいです。みなさんありがとうございます。
現在だいぶ狙ったものに近づいて来ました。
まだ完璧ではありませんが何とか行けそうです。とりあえず解決とさせて頂きます。
ありがとうございました。
現在だいぶ狙ったものに近づいて来ました。
まだ完璧ではありませんが何とか行けそうです。とりあえず解決とさせて頂きます。
ありがとうございました。