>>924 多分それであってるんだと思いますが、
初心者なので、どのライブラリを使えば、逆正接できるのかわかりません。
926 :
921:2005/10/12(水) 14:04:55
X,Y座標をインプットすると、各種計算結果が出てくるライブラリはネットに転がってたりしないんでしょうか?
927 :
924:2005/10/12(水) 14:06:53
#include<math.h>
typedef struct {double x, double y} Point;
getDegree(Point p1, Point p2){
return (atan2(abs(p1.y-p2.y), abs(p1.x-p2.x)));
}
928 :
924:2005/10/12(水) 14:09:55
>>926 逆正接(逆タンジェント)はC/C++の標準ライブラリにあります。
最近のC++なら先頭2行は:
#include<cmath>
struct {double x, double y} Point;
929 :
921:2005/10/12(水) 14:13:23
>>927-928 ご回答=解答有難うございました。
C++を使ってるので、そのままコピペ致します。
930 :
924:2005/10/12(水) 14:13:35
関数の返値書き忘れた。doubleね。
931 :
924:2005/10/12(水) 14:16:37
>>929 別にコピーしてもいいけど、意味ちゃんとわかった?
あと、うっかりgetDegreeって書いちゃったけど結果は「度」じゃなくてラジアン単位ね。
932 :
921:2005/10/12(水) 14:19:41
>>930-931 実は結構理解していません。
でも、C++は普通に出来るので、動かしてみて〜直してみて、を繰り返そうと思いまつ。
あとよく思い返したらCだとabsじゃなくてfabsだなぁ。
C++ならabsでいいんだが。
あとあの按配だとリンカのフラグ指定もわからなかったりしてなぁ。
>>927 absはイランだろ 問題は2つの直線のなす角だから、
1、2つの直線の水平との角度をそれぞれ求めて差を出す(必要なら差の結果のモジュラ演算)
2、ArcCos(2つのベクトルの内積÷(abs(a)*abs(b))
935 :
921:2005/10/12(水) 14:30:31
やっぱ、回答が2種類になったら、
どちらを取ると見やすくてバグが出難くなるか検討しないといけないから、
図形的な理解すべきかも知れませんね。
別に性能は求めてないので、どちらでも問題は無いのですが。
>>932 数値計算で理解せずに「動かしてみて」なんてやってるとキリがないぞ?
正接tan(x)は高校で習ったろ?
atan(x)はtan()の逆関数つまり
x==atan(tan(x))、y==tan(atan(y))だ。
でatan2(y,x)==atan(y/x)だ。
(ただし実際の計算では誤差があるので==ではない)
>>921は線分の傾き(入力は座標2つであらわされる線分が一本)かとオモていタが。
2つの線分のなす角度か。だったら
>>934だな。
938 :
921:2005/10/12(水) 15:04:14
実は、結構934の内容理解できません。
>1、2つの直線の水平との角度をそれぞれ求めて差を出す(必要なら差の結果のモジュラ演算)
モジュラ演算は無視して良いですか?
>2、ArcCos(2つのベクトルの内積÷(abs(a)*abs(b))
ベクトルの内積とは、x1*x2 + y1*y2、で良いですか?
absのaとbは何を表すのでしょうか?
とするとまぁ、線分は方向ベクトルであらわしておいて内積とるのが無難だね。
いろいろポカがあったんで極力ちゃんと書いてみた。
#include<cmath>
struct Point2D {
double x;
double y;
Point2D(x, y) : x(x), y(y) {;}
};
struct Vector2D {
double x;
double y;
Vector2D(const Point2D& p)
: x(p.x), y(p.y) {;}
Vector2D(const Point2D& p1, const Point2D& p2)
: x(p1.x-p2.x), y(p1.y-p2.y) {;}
Vector2D getUnitVector(void) const;
};
inline double innerProduct(const Vector2D& v1, const Vector2D& v2){
return(v1.x*v2.x+v1.y*v2.y);
}
inline double norm(const Vector2D& v){
return(innerProduct(v,v));
}
inline double abs(const Vector2D& v){
return(sqrt(norm(v,v)));
}
inline Vector2D Vector2D::getUnitVector(void) const {
double absv = abs(*this);
return(Vector2D(x/absv, y/absv));
}
inline double getRadian(const Vector2D& v1, const Vector2D& v2) {
return (acos(innerProduct(v1.getUnitVector(), v2.getUnitVector()));
}
941 :
938:2005/10/12(水) 15:11:06
>>939 有難うございます。それを動かします。(動くまで自分で直してみます)
>モジュラ演算は無視して良いですか?
結果が-300度とかになっても問題なければ無視してもいい
+90度と-90度も 線分の場合は区別する場合と、区別しない場合もあるしね
>ベクトルの内積とは、x1*x2 + y1*y2、で良いですか?
>absのaとbは何を表すのでしょうか?
a,bが判らないのと同じく x1 x2も判らんけど、座標っぽい雰囲気があるなあ
座標じゃなくて方向ベクトルだから線分の終点-始点 でなければいけないよ。
でabsはその方向ベクトルの絶対値 sqr( x2^2+y2^2 )* abs( x1^2+x1^2)
× でabsはその方向ベクトルの絶対値 sqr( x2^2+y2^2 )* abs( x1^2+x1^2)
○ でabsはその方向ベクトルの絶対値 sqr( x1^2+y1^2 ) と sqr( x2^2+y2^2 )
944 :
921:2005/10/12(水) 15:29:23
>>942 有難うございました。
>>モジュラ演算は無視して良いですか?
> 結果が-300度とかになっても問題なければ無視してもいい
> +90度と-90度も 線分の場合は区別する場合と、区別しない場合もあるしね
あ、これは重要ですね。
C/C++標準ライブラリにあるかどうか知りたいです。
(自分でググりますが、「モジュラ演算とは」だと0件ですた)
よーだ:ルーキー、fmod()をつかえ。
>>944
次スレは950が建てるの?
948 :
デフォルトの名無しさん:2005/10/12(水) 16:19:11
2点間の距離を出すC/C++標準ライブラリとかあるんでしょうか?
950 :
949:2005/10/12(水) 16:43:38
ちなみに正確な距離を出したいのではなく遠い近いを比較したいだけならnorm()で十分。
hypotを使った方がいいよ
sqr(dx^2+dy^2) == hypot(dx,dy)
952 :
950:2005/10/12(水) 16:46:45
>>951 C/C++の標準ライブラリにはないXe(希ガス)。
954 :
デフォルトの名無しさん:2005/10/12(水) 16:53:11
>>950 なんか、
[C++ Error] : E2268 Call to undefined function 'norm'
みたいでつ。
955 :
デフォルトの名無しさん:2005/10/12(水) 16:54:22
>>955 #include <math.h> で hypot( dx, dy)が使えると思うよ。 ダメだったら諦める
958 :
955:2005/10/12(水) 17:10:57
959 :
949:2005/10/12(水) 17:11:20
960 :
955:2005/10/12(水) 17:12:30
>>957-958 ANSI C/C++、POSIXなどの標準規格では<cmath>や<math.h>には含まれないが
UNIX環境では割とあることが多いらしいそうな。System V系にはあるそうな。
後は処理系によってあったりなかったり。
>>961 Blitz++
MTL
POOMA
A++/P++
・・・なんてのがあるらしいよ。あとはこのキーワードでググってみて管祭。
>>963 >>964 ダウンロードしたり、演算リンク集なんか見てみましたが、
巨大だし、ドキュメントは英語ですね。
自作するよりは良いんでしょうが、大変そう。
>>965 自作するよりはよいどころではなく多分割と劇的に性能が違うと思うよ。
特にある程度以上の大きさの行列では。
968 :
965:2005/10/12(水) 17:56:03
劇的に良いわけですか。
質問ばかりですみませんが、座標系(言い方変ですか?)のライブラリのデファクトはどうなんでしょう?
やりたい事は、座標変換や面積計算やトポロジー的なことです。2次元、将来3次元かもです。
数学的な問題を解くのが目的か、グラフィックスとかの応用が目的か、
問題の規模や、リアルタイム・アプリケーションなのかそうでないかとか
あるいは単に宿題や趣味プログラミングかとか
その辺が分からないとなんともいえないよね。
例えば
>>966で紹介したライブラリ群とかは
概ね浮動小数点演算で大規模な問題を効率よく解くのには向いているが、
3次元で展開するリアルタイムゲームのエンジン部分とか
小さな行列をリアルタイムで解くような問題にはあまり向いてない。
また3Dグラフィックスならむしろグラフィック・ハードウェアの
演算機能を生かす必要があるから一般的な行列ライブラリより
OpenGLとかDirectXとか考えたほうがいいわけだろうし。
グラフィックスとかの応用が目的で、リアルタイムじゃないものお願いします。
グラフィックへの応用が目的なら、勉強がてらそこらへん自作するのも手だよ。
結局、応用するには基礎が出来てないとどうしようもない。
基礎を勉強するには、一度は苦労しないとね
>>961 >>964 >966
用途によっては
Boost::numeric::ublas
も使えるかも。Boost準標準だし。
しかし、2直線が挟む角度を求めるだけで、
こんなに話を膨らませられる君たちは天才だね。
なんなら、2直線が平行に近い場合の
ArcCos内積 を使う場合の精度問題について膨らませてもいいぞ。