プロが教える店舗&オフィスのセキュリティ対策術

2次元状に四点がありその中心を求め
その中心から各点に線を引きその間の角度を求めたいのですが、
どのようにすれば数式で求められるでしょうか?

各座標を平均して中心をだし、
HPを見ながら
座標をベクトルに変えて内積をだし
アークサイン..etc色々やってみたのですが
学がないものでなんとも..orz

私みたいなのでもわかる数式があれば教えて頂けないでしょうか。

よろしくお願い致しますm(__)n

A 回答 (3件)

>2次元状に四点がありその中心を求め


「中心」ってなんですかというのが問題なんですが

>各座標を平均して中心をだし、
ということだと
( (x1+x2+x3+x4)/4, (y1+y2+y3+y4)/4 )
のことでしょうか.
これなら重心ですよね

それなら,この点が原点になるように
4点を平行移動したあとの
各点の座標を
(X1,Y1) (X2,Y2) (X3,Y3) (X4,Y4)
として,Y1/X1 Y2/X2 Y3/X3 Y4/X4
を求めてください.
それらの値が,x軸の正の方向との
原点と各頂点までの線分がなす角のtanです.
ここまでわかると
「重心から各頂点に引いた線分のなす角のtan」は
tanの加法定理からだせます.
tanまで出せればarctanで角度そのものは出せます
    • good
    • 0
この回答へのお礼

有り難うございます。
重心ですね...それすらわからない状態で...
がんばってみます。

お礼日時:2005/09/17 11:26

一般化した質問ではやたら変数が増え、結果としての式が長くなるだけで、ひたすら式を書き下していくだけの問題じゃないでしょうか?



>色々やってみたのですが
>学がないものでなんとも..orz
>私みたいなのでもわかる数式があれば教えて
このような質問をされた以上経過式や結果の式を示してください。そして学が無いと逃げて、結果や分かる式を求められるのは、本来はあなたが単純な式をひたすら変形して導出すべきところを回答者に代わりにやってもらうといった手抜きで、学の問題ではないと思います。
そうでないなら、質問をもっと単純化して点A(x1,y1),B(x2,y2),M(xo,yo)に対して角BMAの偏角θ21を求める質問にされるとか、あくまでこの質問にこだわなら、どれか1つだけの角に限定しかつその結果と導出過程を示して、これで良いですか、とかこの部分を教えてください、といった質問に変えていただいたほうが良いですね。
4つの角の似たような式を全部書くだけでも回答を非常に長くしてしまいます。

あなたの質問に対して、解答にいたる過程が何も書かれないとマナー違反になりますよ。

質問を分からないところだけを取り出して単純化し、あなたの分かる範囲の解答を示すようにして分からない部分、結果があっているかどうかといた質問の仕方をされた方がいいかと思います。

この回答への補足

あっ 単純計算して動かしてもあからさまに 違うよな(--;
と思える数字しか出てこなかったので、
色々いじってて止まっているのでこれ自身は動きません(^^;

補足日時:2005/09/17 11:42
    • good
    • 0
この回答へのお礼

有り難うございます。
>本来はあなたが単純な式をひたすら変形して導出すべきところを
それすらわからない状態でしてすいませんm(__)m

距離などの式のように
一発で出せるような式があるのかと思いまして。
式を出せなかったのは、
プログラムになっているので下記に張ります。
ただここは数学ですのでどうかと思ったので。

直そうと思っても
数式→プログラムは本見ながら出来るのですが、
プログラム→数式は.....

これもHPからの寄せ集めでいらない部分などあるお思いますが。
私自身確実に内容を把握してないので(^^;

vec3 Test1;
vec3 Test2;
Test1 = (PointVec[0] + PointVec[1] + PointVec[2] + PointVec[3]) / 4;
for(int i = 0; i < 4;i++){
Test[i] = normalize(PointVec[i]);}
//vec3 Te = normalize(vec3(100,100,100));
float hhh[4];
for(int i = 0; i < 4;i++){
hhh[i] = inner_product(Te,Test[i]);
double rad[4];
double n[4];
for(int i = 0; i < 4;i++){
rad[i] = asin(hhh[i]);
n[i] = ((rad[i]*180.0) / 3.1415926538);
}

お礼日時:2005/09/17 11:38

#2です。


プログラムを数式に直したら簡単ということはありません。
プログラムは「極座標表示と直交座標表示を意識することなく計算できること」、「内積が関数計算できること」、「計算機には簡単な計算でも式に書き下すと複雑な式になる場合がある」、「式の変数への置き換えで元の変数と最終の式の関係が見えなくなること」
などが原因で
質問者さんがプログラムから数式への書き下しが困難となっていると思います。

質問者さんが理解できないプログラムを持ってきても意味はありません(役立ちません)。

A#2で補足のプログラムは
>//vec3 Te = normalize(vec3(100,100,100));
は3次元ベクトルみたいです。また
>rad[i] = asin(hhh[i]);
は内積のcosθのθの余角(π/2 -θ)を求めているようだし、正しく動作することをチェックされたプログラムですか?

プログラムから忠実に数式を起こすことは少し無理なような気がします。やり方だけヒントにして自分で数式を作られるなら良いですが。。。

プログラムをヒントにした方法の手順は以下のように掛けます。ただこの手順は計算機向きです。
1)4つの点ベクトルr1,r2,r3,r4は2)の中心点に対する偏角の昇順に予め並んでいる(並べてある)と仮定する。
2)加重中心点ベクトルp=(r1+r2+r3+r4)の計算
3)中心点に4つの点を平行移動する。移動後の点ベクトル{si|si=ri-p,i=1,2,3,4}とおく。
4)各点ベクトル{si}を絶対値1に正規化する。
正規化されたベクトルは{ti| ti=si/|si|,i=1,2,3,4}で求める。
5)求める偏角は{θji|θji=arccos[内積(ti,tj)],(i,j)=(1,2),(2,3),(3,4),(4,1)}で求める。
結果は通常ラジアン単位で出てきます。
角度を度(°)に変換する場合は換算係数(180/π)を掛けます。

参考にされても良いですし、最初から直交座標系だけで考えられても良いですね。
直交座標系で計算する場合は#1さんの方法でほぼいいと思いますが、最後にarctanを計算するとき、計算機ではarctanは主値(atctanの主値の範囲は-π/2~π/2)で計算値が出てきますので、実際の角度が主値の範囲の外にある場合は角度の補正が必要になりますのでご注意ください。
    • good
    • 0
この回答へのお礼

有り難うございます。

このプログラムは 3次元になっているのも、
他のものを見ながら色々いじっていたので
(参考が3次元のものだったり2次元の物だったり色々でしたので(^^;)

>正しく動作することをチェックされたプログラムですか?
元々 プログラムが作りたくて数式を調べていて、
いじる前は動作するのは確認しましたが、
式の内容は前にも書きましたが、
色々な所からこれがいるあれがいるとと言う事で、
自分でつなぎ合わせましたので(^^;
それで結局基本の式がわからないと.....
と言う事でここで聞いたのです。
それと独自の関数(私のではないですが(^^;)も使っていますので。

基本的に元の数学がわからないので、
プログラムの方でも聞けないので..orz
こちらでお聞きしました。

>直交座標系だけで考えられても良いですね。

とりあえず一番単純なのをやって勉強してみます。
有り難うございますm(_)m

お礼日時:2005/09/17 18:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!