二点を結ぶ線の中点から垂直にある程度離れた点

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
マサヒコ

二点を結ぶ線の中点から垂直にある程度離れた点

#1

投稿記事 by マサヒコ » 11年前

自機と敵が一機ずつ居るとします。
そのふたつを結ぶ線分の中点からある程度(ここでは線分の長さと同じにしようとしています)垂直に離れた点を求めたいです。

自分は
自機座標を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ライブラリ

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 二点を結ぶ線の中点から垂直にある程度離れた点

#2

投稿記事 by h2so5 » 11年前

マサヒコ さんが書きました: そして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
となってしまいます。

赤鬼
記事: 58
登録日時: 11年前

Re: 二点を結ぶ線の中点から垂直にある程度離れた点

#3

投稿記事 by 赤鬼 » 11年前

回転の式は
ある点P(x,y)にたいしてθの角度分動かしたい場合

コード:

x=x*cos(θ)-y*sin(θ);
y=y*cos(θ)+x*sin(θ);
で求められます。(加法定理ですね)
ですので90度動かしたいなら

コード:

x=x*cos(π/2)-y*sin(π/2);
y=y*cos(π/2)+x*sin(π/2);
となります。
さらに言えば

コード:

x=-y;
y=x;
こうなります。

マサヒコ

Re: 二点を結ぶ線の中点から垂直にある程度離れた点

#4

投稿記事 by マサヒコ » 11年前

>>h2so5さん
http://dixq.net/forum/viewtopic.php?f=3&t=5036
ここを参考にしました。

>>赤鬼さん
最初にベクトルを使った計算法を書かれていた気がするのですが、気のせいでなければ詳しく教えて下さいませんか?

ちなみに現在自分が書いた式をお二人の意見を取り入れて手直ししましたが、
ぱっと見、求めたい点が出ているように見えるけど
自機と敵が交差して位置を入れ替えた時、点が原点側にいってしまう状態です。

アバター
a5ua
記事: 199
登録日時: 13年前

Re: 二点を結ぶ線の中点から垂直にある程度離れた点

#5

投稿記事 by a5ua » 11年前

複素数を使えば、簡単に求められると思います。

コード:

#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);
}
(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); とする必要があるかもしれません。

赤鬼
記事: 58
登録日時: 11年前

Re: 二点を結ぶ線の中点から垂直にある程度離れた点

#6

投稿記事 by 赤鬼 » 11年前

ベクトルは概念的な物でやってることは一緒です。
ただ、オーバーロードとクラスを用意すれば見掛け上簡素で綺麗なコードが書けるので最初に書きました。
(最適化が無ければちょっと無駄な処理が増えますけど)
しかし、座標がx,yで表示されていたのでベクトルじゃない方法の方がいいかと思いまして消しただけです。

他には自キャラと敵キャラのベクトルと、自キャラと目的の点とのベクトルの内積から+か-かで判断して法線ベクトルに-掛けるとかはどうでしょうか?

マサヒコ

Re: 二点を結ぶ線の中点から垂直にある程度離れた点

#7

投稿記事 by マサヒコ » 11年前

予想外にコメントが多くてうれしいです。みなさんありがとうございます。
現在だいぶ狙ったものに近づいて来ました。
まだ完璧ではありませんが何とか行けそうです。とりあえず解決とさせて頂きます。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る