掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.28950

atan2でDOMAIN error
投稿者---=,=(2006/11/20 18:44:10)


環境 WindowsXP,BCC 5.5

math.hをインクルードしてatan2を使ったのですが警告ダイアログ(atan2 DOMAIN error)が出て問題が発生したとでてプログラムが終了してしまいます。
atan2の引数に問題があると思いまして0以外の小数を入れるようにしてみましたが直りませんでした。
引数に指定してはいけない値があるのでしょうか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:atan2でDOMAIN error 28951 通りすがり 2006/11/20 18:52:39
<子記事> Re:atan2でDOMAIN error 28965 ぷはぁ 2006/11/21 15:59:26


No.28951

Re:atan2でDOMAIN error
投稿者---通りすがり(2006/11/20 18:52:39)


ソースコードを見せてください。


この投稿にコメントする

削除パスワード

No.28957

Re:atan2でDOMAIN error
投稿者---=,=(2006/11/20 23:03:47)


まだ中途半端だし、書き方が変なので少し恥ずかしいですが…
Cの勉強しながら3D表示するものを作っていて回転をさせる為にatan2を使ったらエラーが出てしまいました。

double win_w,win_h,cam_x,cam_y,cam_z,cam_v,camw_x,camw_y,camw_z;
//画面の幅・高さ カメラのX・Y・Z カメラの向き

void SetCam(double cx, double cy, double cz, double cwx, double cwy,double cwz){

cam_x=cx;
cam_y=cy;
cam_z=cz;
camw_x=cwx;
camw_y=cwy;
camw_z=cwz;
return;
}
//カメラの位置,角度を考慮して投影
void Pos3D(double cx, double cy, double cz, double *scx, double *scy){
double Camlong, CamAngleYZ,Nsin, Ncos ,x, y, z, camLx, camLy, camLz;
//カメラから対象座標までの距離を求める
Camlong = sqrt(pow(cx-camw_x, 2) + pow(cy-camw_y, 2) + pow(cz-camw_z, 2));
//カメラの角度を求める
if (camw_z-cz == 0 && camw_y-cy==0){
CamAngleYZ = atan(camw_y-cy / camw_z-cz);
}
//sin cosは高くつくので
Nsin = sin(CamAngleYZ), Ncos = cos(CamAngleYZ);
//座標変換
x=cx-cam_x;
y=cy-cam_y-Camlong;
z=cz-cam_z;

//回転を加える
camLx = x;
camLy = Ncos * z - Nsin * y;
camLz = Camlong + Nsin * z + Ncos * y;

//投影
*scx = camLx * win_w / camLz + win_w / 2;
*scy = camLy * win_w / camLz + win_h / 2;
return;
}
void Linev(double x1, double y1,double z1, double x2, double y2,double z2, char *hdc, char *p){
double scx1,scy1,scx2,scy2;
Pos3D(x1,y1,z1,&scx1,&scy1);
Pos3D(x1,y1,z1,&scx1,&scy1);
MoveToEx(hdc, scx1, scy1, p);
LineTo(hdc, scx2, scy2);
return;

}

↑を別ファイルでインクルードして

SetCam(0, -80, 600, 0, 0, 0);
Linev(50, 0, 0, -50, 0, 0, hdc, NULL);
Linev(0, 50, 0, 0, -50, 0, hdc, NULL);
Linev(0, 0, 50, 0, 0, -50, hdc, NULL);

これを読み出したところエラーが出ました。
長くなりました。すみません。


この投稿にコメントする

削除パスワード

No.28959

Re:atan2でDOMAIN error
投稿者---ぽへぇ(2006/11/21 07:01:33)


>atan2を使ったらエラーが出てしまいました。
使ってないよ。

//カメラの角度を求める
>if (camw_z-cz == 0 && camw_y-cy==0){
> CamAngleYZ = atan(camw_y-cy / camw_z-cz);
>}
0除算が起こります。

つっこみ所はたくさんありますが、
要所要所で各変数の値を確認してください。





この投稿にコメントする

削除パスワード

No.28966

Re:atan2でDOMAIN error
投稿者---=,=(2006/11/21 16:59:07)


>0除算が起こります。
すみません=!でした

>つっこみ所はたくさんありますが、
つっこんでください。お願いします。


この投稿にコメントする

削除パスワード

No.28971

Re:atan2でDOMAIN error
投稿者---ぽへぇ(2006/11/21 19:01:13)


>>つっこみ所はたくさんありますが、
>つっこんでください。お願いします。

「HTML変換ツール」って知っていますか?
宣言したことくらい守りましょう。
お願いする前に指摘されたことくらい直しましょう。

No.28959
>>atan2を使ったらエラーが出てしまいました。
>使ってないよ。

No.28965
>atan2関数には、2個の引数を渡します。



この投稿にコメントする

削除パスワード

No.28975

Re:atan2でDOMAIN error
投稿者---=,=(2006/11/21 22:02:39)


すみませんでした。
以後気をつけます。


この投稿にコメントする

削除パスワード

No.28981

Re:atan2でDOMAIN error
投稿者---ぽへぇ(2006/11/22 06:14:18)


>すみませんでした。
>以後気をつけます。
気が付いたところだけ。突っ込んでるだけなので特に答える義務もなし。

1.atan2 を使ったのか、それとも気が変わって atan にしたかったのか
    こちらに伝わってこなかった(結局どうしたの?)。

2.
>すみません=!でした
>if (camw_z-cz == 0 && camw_y-cy==0){
どっちを != にしたのかな? 両方?

3.
>if (camw_z-cz == 0 && camw_y-cy==0){
>   CamAngleYZ = atan(camw_y-cy / camw_z-cz);
if の条件次第では CamAngleYZ が初期化されないまま次のsin, cosに渡される

4.
//sin cosは高くつくので
と書きながら sin, cos を使っているけどこのコメントは何?

5.
>Pos3D(x1,y1,z1,&scx1,&scy1);
>Pos3D(x1,y1,z1,&scx1,&scy1);
2行目はおそらく
 Pos3D(x2, y2, z2, &scx2, &scy2);

6.
>void Linev(double x1, double y1,double z1, double x2, double y2,double z2, char *hdc, char *p){
>MoveToEx(hdc, scx1, scy1, p);
>LineTo(hdc, scx2, scy2);

MoveToEx, LineToの第1引数の型は HDC であって char* ではない。
MoveToExの第4引数の型は LPPOINT であって char* ではない。

7.
>↑を別ファイルでインクルードして
って何?
#include "hoge.c"
という書き方もできなくはないけど、きっと違うよね?




この投稿にコメントする

削除パスワード

No.28982

Re:atan2でDOMAIN error
投稿者---通りすがり(2006/11/22 06:35:49)


sinとcosの件は、「毎回計算するのはコスト(時間)がかかるので、
最初に一度だけ計算しておく」という意味だと思ふ。


この投稿にコメントする

削除パスワード

No.28965

Re:atan2でDOMAIN error
投稿者---ぷはぁ(2006/11/21 15:59:26)


atan2関数には、2個の引数を渡します。
2個の引数がともに0.0のとき、DOMAIN errorが発生します。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧