ある点から円との接点(接線)を求めるには?

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

ある点から円との接点(接線)を求めるには?

#1

投稿記事 by FE » 10年前

分かっている情報はある点(x、y)と円の半径r、と中心点sです。
どの様に計算すればよいのでしょうか?

アバター
usao
記事: 1887
登録日時: 11年前

Re: ある点から円との接点(接線)を求めるには?

#2

投稿記事 by usao » 10年前

>ある点
を点p,求めたい接点を点a と呼ぶことにすると,
三角形{p,a,s}は直角三角形だから,pからaまでの距離がわかる.
 ↓
aから直線{p,s}に垂線を下した点を仮にbとする.
三角形{p,a,b}は三角形{p,a,s}と相似なので,pからbまでの距離dxもわかるし,下した垂線の長さdyもわかる.
 ↓
既知のベクトル(p->s)方向の成分dxと,それに垂直な方向成分dyがわかったので
aの座標が得られた.

…かな?

FE

Re: ある点から円との接点(接線)を求めるには?

#3

投稿記事 by FE » 10年前

理解はしましたがプログラムの場合ベクトルがx,yの2点の減算でだすので各座標の保持ができないです。

保持するにはどのようにしたらよいでしょうか?

アバター
usao
記事: 1887
登録日時: 11年前

Re: ある点から円との接点(接線)を求めるには?

#4

投稿記事 by usao » 10年前

>プログラムの場合ベクトルがx,yの2点の減算でだすので各座標の保持ができない
・プログラムで計算を行う場合
・ベクトルを求めるには 2端点の座標の引き算を行う
 ↓
・故に,各座標の保持ができない ?

意味がわかりません><
「各座標」とは具体的には何? 保持できない理由は?
何をどうしたらどうなってしまうから困ったことになるのか,詳細にお願いします.

FE

Re: ある点から円との接点(接線)を求めるには?

#5

投稿記事 by FE » 10年前

すいません、こちらの勘違いで問題ありませんでした。
また、垂線を下すにはどういった方法を用いるのでしょうか?

アバター
usao
記事: 1887
登録日時: 11年前

Re: ある点から円との接点(接線)を求めるには?

#6

投稿記事 by usao » 10年前

>垂線を下す
考え方を述べるのにそう書いただけで,
実際上は,三角形の頂点pの箇所の角度(∠aps の角度)θに対する
cosθとsinθが得られているから,それをdx,dyの算出に使えばよいかと.

三角形{p,a,s}の各辺の長さが得られた時点で
(例えば線分{p,s}の長さを|ps|のように表記することにすると),
cosθ = |pa| / |ps|
sinθ = |as| / |ps| = r / |ps|
がわかる.
よって,垂線を(補助線として)引いてできた三角形{p,a,b}の辺の長さは,
|pb| (= dx) = |pa|cosθ
|ab| (= dy) = |pa|sinθ

あとは,p->s 方向単位ベクトルX_と,それに垂直な単位ベクトルY_を用いれば
a_ = p_ + dx*X_ + dy*Y_
として点aの座標a_が求まる.(もちろん,Y_の方向の取り方によって2通りの解がある)
(↑では,ベクトルには a_ のように _ を付けて書いた)

FE

Re: ある点から円との接点(接線)を求めるには?

#7

投稿記事 by FE » 10年前

dx、dyは取得できていたのですがY_の取得方法が分からなく先ほどの質問を投げさせていただきました。
Y_単位ベクトルはどのように取得するのでしょうか?
何度も似たような質問で申し訳ないです。

アバター
usao
記事: 1887
登録日時: 11年前

Re: ある点から円との接点(接線)を求めるには?

#8

投稿記事 by usao » 10年前

>Y_単位ベクトルはどのように取得するのでしょうか?
X_に垂直なベクトルは
X_を90度回転させれば得られます.

回転行列を用いて書くと

コード:

[Yx]  =  [ cos90   -sin90 ][ Xx ]
[Yy]      [ sin90    cos90 ][ Xy ]
という感じです.
今回は,cos90=0, sin90=1 ですから,結局,
Y_ = ( -Xy, Xx )
といった感じになります.(回転角度を-90度にすれば,反対側が得られます)

FE

Re: ある点から円との接点(接線)を求めるには?

#9

投稿記事 by FE » 10年前

コード:

// PとSを結ぶベクトル
PS.x = P.x - S.x;
PS.y = P.y - S.y;
//Pと接点の長さ
PA = sqrt((P.x*P.x) - (r*r));
// 計算用の値
dx = PA * (PA/Length(PS)); // Lengthはベクトルの長さ
dy = r * (dx/PA);
// 座標を求める
Normalize(PS);  // 正規化
terget.x = P.x + (PS.x * dx);
terget.y = P.y + (PS.y * dx);
// 法線ベクトル(垂直ベクトル) * dy
terget.x += -tie_nom.y * dy;
terget.y += tie_nom.x * dy;
私が考えたものはこういったものになったのですがどこがおかしいのでしょうか?

FE

Re: ある点から円との接点(接線)を求めるには?

#10

投稿記事 by FE » 10年前

コード:

// PとSを結ぶベクトル
PS.x = P.x - S.x;
PS.y = P.y - S.y;
//Pと接点の長さ
PA = sqrt((Length(PS)*Length(PS)) - (r*r));
// 計算用の値
dx = PA * (PA/Length(PS)); // Lengthはベクトルの長さ
dy = r * (dx/PA);
// 座標を求める
Normalize(PS);  // 正規化
terget.x = P.x + (PS.x * dx);
terget.y = P.y + (PS.y * dx);
// 法線ベクトル(垂直ベクトル) * dy
terget.x += -tie_nom.y * dy;
terget.y += tie_nom.x * dy;
間違いがあったので一部修正しました

box
記事: 2002
登録日時: 13年前

Re: ある点から円との接点(接線)を求めるには?

#11

投稿記事 by box » 10年前

どこがおかしいか、とたずねられましても、
その、おかしい内容の具体的な説明がありませんし、
それに、各構造体の定義やNormalize関数で何をしているか、
といった説明がありませんので、だれにも何とも答えられないと思います。

要するに、コードの一部「だけ」を見ても何もわからない、ということです。

パッと見て思うのは、Normalize関数で正規化(具体的な内容は
ご説明がないのでわかりません)を実行しようとしている箇所で、
PSを正規化した結果を仮に同じPSに返すのであれば、
PSのアドレスを渡す必要があるのでは?ということです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
usao
記事: 1887
登録日時: 11年前

Re: ある点から円との接点(接線)を求めるには?

#12

投稿記事 by usao » 10年前

最後に出てくる tie_nom は意図した値が入っているのでしょうか.
PSを使えば良いように見えますが.

閉鎖

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