- 締切済み
点が端に来た時に、反対側にワープするのではなく、方向を変えて跳ね返るようにしてみよう。
下記のプログラミングを点が端に来た時に、反対側にワープするのではなく、方向を変えて跳ね返るようにかえるのですが、どのようにすればいいのでしょうか?是非皆さんの優秀な意見をお聞きしたいです。 #include "/pub/sfc/ipl/com-pro/sfcLib.cpp" #include <unistd.h> using namespace std; main(){ int x[4];int y[4];int z[4]; x[0]=0;x[1]=4;x[2]=7;x[3]=2; y[0]=3;y[1]=1;y[2]=2;y[3]=5; z[0]=1;z[1]=4;z[2]=6;z[3]=2; sfcInit(); while(true){ for(int i=0;i<4;i++){ sfcPoint(x[i],y[i],z[i]); } usleep(500000); for(int i=0;i<4;i++){ sfcPoint(x[i],y[i],7); } for(int i=0;i<4;i++){ x[i]++; y[i]++; if(x[i]>9,y[i]>9){ x[i]=0,y[i]=0; } } } }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- tokichim
- ベストアンサー率42% (88/205)
難しく言うと移動ベクトルを変化させるわけですが… 「跳ね返る」とは何なのか、を考えてみましょう。 壁に垂直な軸の移動方向が反転するということです(上下の壁ならY軸、左右の壁ならX軸)。 では反転するとは何なのか。 ある座標軸方向の移動量がプラスならマイナスに、マイナスならプラスになるということです(座標のマス目と点の移動する様子を紙に書いてみればわかると思います)。 そこでソースを見れば答えが見えてくると思います。 まず移動させる部分。 元ソースでは++を使って1ずつプラスさせることしかしていません。これをプラスまたはマイナスどちらにも変化させられるようにする必要があります。ヒント:点の移動量(方向)の変数を導入します。 次に壁(端)に来たかどうかを判定する部分。 元ソースではプラス方向にしか動かないので、右下端すなわちXY座標の最大値しか判定していませんが、これを上下左右全部の端について判定してやります。 (ちなみに元ソースも少しヘンですね。端に来た点はみんなXY座標ともゼロの原点に戻ってしまいます。正確にいうと反対側にワープしてないですね) 具体的なソースは書きません。がんばって考えてください。
- CrystalT
- ベストアンサー率42% (30/70)
たとえば、 x[i]++; if(x[i]>9){ x[i]=0; } としている部分で、x[i]が9を超えたら0に戻るという処理をしていますので、 xflag=1; と、先にやっておいて、 x[i] += xflag; if(x[i]>=9 || x[i]<=0){ xflag = xflag * -1; } とやるのが基本です。 処理の手順や場所については、適宜変える必要がありますが。