私は学校の課題でベジェ曲面を書くプログラムを作成しています。
作成したプログラムは少し、内容が長いのでこちらからダウンロードして見ていただきたいです。
アドレス: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にしているのにきれいに分割されないです。添付した画像のような感じです。
長々しく書きましたが、用は指定通りに分割されないのはどうしてか?
学校の先生はプログラムの中の植木算がおかしいんだね。と言ってくれたのですが、
どこのことかいまいち分かりません。
分かる方がおられましたらご教授のほうお願いします。
ベジェ曲面について
Re:ベジェ曲面について
なんともすごい 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を越えます。
これが問題なのではないでしょうか。
ソースを見る限りコンパイル出来そうにないので、
植木算と言っているあたりから推測しますと問題になりそうなのは
[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:ベジェ曲面について
まずは回答ありがとうございます。
ご指摘どうり問題の部分
まだまだ勉強不足でお恥ずかしい限りです。
本当にありがとうございました。
ご指摘どうり問題の部分
for( i=0; i<=m; i++ ){ for( j=0; j<=n; j++ ){のとこに原因がありました。
まだまだ勉強不足でお恥ずかしい限りです。
本当にありがとうございました。