ベジェ曲面について

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

ベジェ曲面について

#1

投稿記事 by へたれ » 16年前

私は学校の課題でベジェ曲面を書くプログラムを作成しています。
作成したプログラムは少し、内容が長いのでこちらからダウンロードして見ていただきたいです。
アドレス:http://www1.axfc.net/uploader/He/so/163828
パス:bezier

このプログラムの説明として、イメージとしては制御点を16点(x,y,z座標)を指定しています(つまり48個の座標を指定するということです)
*-*-*-*
*-*-*-*
*-*-*-*
*-*-*-*どれがどれに対応しているかはp[3][4][4]の[3]は(x,y,z)で次の[4][4]は各制御点です([0][0]が一番左下で[3][0]が右下で[3][0]が左上です)
これをベジェ曲線の計算式に入れて取り出したい面q00,q10,q01,q11の座標をstl形式風のファイルに出力さしているのですが、面の分割数(ここではm,nとしています)を5,5などm=nにしているのにきれいに分割されないです。添付した画像のような感じです。

長々しく書きましたが、用は指定通りに分割されないのはどうしてか?
学校の先生はプログラムの中の植木算がおかしいんだね。と言ってくれたのですが、
どこのことかいまいち分かりません。
分かる方がおられましたらご教授のほうお願いします。

Justy

Re:ベジェ曲面について

#2

投稿記事 by Justy » 16年前

 なんともすごい scanfですね。

 ソースを見る限りコンパイル出来そうにないので、
植木算と言っているあたりから推測しますと問題になりそうなのは
[color=#e0f0ff" size="-1" face="monospace]
for( i=0; i<=m; i++ ){
for( j=0; j<=n; j++ ){
[/color]
の部分でしょう。

 mと nが面の分割数だとすると、 for文における iや jの最後ループは
mや nの値をとることになり、その場合
[color=#e0f0ff" size="-1" face="monospace]
u1 = ((double)i + 1.0) / (double)m;
v1 = ((double)j + 1.0) / (double)n;
[/color]
この部分で iや jに 1.0を足したことで、
[color=#e0f0ff" size="-1" face="monospace]
u1 = (m + 1.0) / m;
v1 = (n + 1.0) / n;
[/color]
という計算をすることになり、u1や v1は 1.0を越えます。

 これが問題なのではないでしょうか。

へたれ

Re:ベジェ曲面について

#3

投稿記事 by へたれ » 16年前

まずは回答ありがとうございます。

ご指摘どうり問題の部分
for( i=0; i<=m; i++ ){ 
        for( j=0; j<=n; j++ ){
のとこに原因がありました。
まだまだ勉強不足でお恥ずかしい限りです。
本当にありがとうございました。

閉鎖

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