3

for ループがあり、その内部で整数 x が 533 から 813 に増加します。つまり、280 ずつ増加します。同じループの中で、上記が発生したときに y の値を 300 から 200 に減らしたいと考えています。つまり、x が 533 の場合、y は 300 でなければならず、x が 813 の場合、y は 200 でなければなりません。これは、反復ごとに y の値を 100/280 ずつ減らすことで実行できることを知っています。しかし、どちらも整数です。

ここに私が使用したいくつかのコードサンプルがありますが、動作していません.:

for(int i = 0; i < b.getSize(); i++) {
            x = b.getCar(i).getPosX();
            b.getCar(i).setPosX(++x);
            if(x >= ((getWidth() / 2) - 140) && x < ((getWidth() / 2) + 140)){
                y = b.getCar(i).getPosY();
                y = (double)(y - (10.0f / 28.0f));
                b.getCar(i).setPosY((int)y);                    
            }
        }

どうすればこれを行うことができますか。ありがとう!

4

5 に答える 5

4

単純なソリューションと複雑なソリューションの 2 つのソリューションがあります。シンプルなもの:

y = yoff + (int)( (double) height * x / width )

どこでyoff = 300, height = -100, width = 813-533。基本的に、浮動小数点演算を行い、結果を丸めます。

あるいは、ブレゼンハム ライン アルゴリズムを使用して純粋な整数演算を使用して同じことを行うこともできますが、それにはさらに多くのコードが必要になります。

于 2012-11-12T13:48:08.467 に答える
3

yは adoubleまたは aであるfloat必要があり、使用する場合はその値を丸める必要があります。


アニメーションをしたい場合は、インターポレーターを見てください。極値間の値を計算するロジックを抽象化できます。

基本的に、最初に補間器に開始値と終了値を指定します。

次に、補間器に時間を与えると、その時間値の開始と終了の間の値が返されます。

おまけ: 残りのコードに手を加えることなく、アニメーションのルック アンド フィールを変更できます。(あなたがしようとしているのは、実際には線形補間ですが、たとえば正弦関数や、バウンス、二次などの他のアルゴリズムを使用すると、はるかに見栄えがよくなります...)

于 2012-11-12T13:45:32.163 に答える
2

線を引くロジックのようです。Bresenham のアルゴリズムが最適なオプションです。

于 2012-11-12T13:46:46.627 に答える
1

yの正確なdouble dy値を追跡する補助変数を保持します。各反復で、式を使用して dy を更新し、丸められた/切り捨てられた dy の値を取得して y を更新します。

于 2012-11-12T13:48:45.930 に答える
1

何をしたいのかわかりませんが、現在のソリューションは浮動小数点数を整数に丸めることに苦しんでいます。これを回避するには、float / double で計算し、位置を設定するときに整数に変換します。

于 2012-11-12T13:49:30.713 に答える