2011-12-14 13 views
2

私は自分の脳をつかんで、効果をアニメーション化する方法を見つけようとしています。これは私がmath.stackexchange.comで尋ねた質問に関連しています。サイドノートとして問題を描く3Dスタイルの効果

https://math.stackexchange.com/questions/91120/equal-division-of-rectangles-to-make-total/

、私は上記の質問に定義された描画アルゴリズムを実装していない - 代わりに、それはより凝縮見えるように視点を変更するために、私自身を使用して。

固定3Dスタイルのエフェクトを描画することができましたが、ロジックの周りに脳をラッピングして、下にあるラインが自分の方向に向いているように見せているときに問題があります。

enter image description here

私のコードは次のように、各ボタンのクリックは、長方形のサイズを変更し、近くに移動させなければならない

 List<double> sizes = new List<double>(); 
     private void Form1_Load(object sender, EventArgs e) 
     { 
      for (int y = 1; y < 10; y++) 
      { 
       double s = ((240/2)/y)/4; 
       sizes.Add(s); 
      } 
      sizes.Add(0); 
     } 

     int offset = 0; 
     private void button1_Click(object sender, EventArgs e) 
     { 
      Bitmap b = new Bitmap(320, 480); 
      Graphics g = Graphics.FromImage(b); 

      Color firstColor = Color.DarkGray; 
      Color secondColor = Color.Gray;  
      Color c = firstColor; 

      int yOffset = 0; 
      for(int i = 0; i < sizes.Count; i++) 
      { 
       c = (i % 2 == 0) ? firstColor : secondColor; 

       int y = (int)Math.Round(b.Height - yOffset - sizes[i]); 
       int height = (int)Math.Round(sizes[i]); 

       g.FillRectangle(new SolidBrush(c), new Rectangle(0, y + offset, b.Width, height + offset)); 
       yOffset += (int)sizes[i]; 
      } 

      this.BackgroundImage = b; 
      offset+=1; 
     } 

、です。しかし、私の四角形は成長するものではありません。私のロジックは大丈夫ですが、動く限りは動作しません。

だから私の質問は次のとおりです。

は、私は認識していないよ、この効果のための既存のアルゴリズムがあり、またはこれは私が思考上だと非常に単純なものでしょうか?私の論理を訂正したり、正しい方向に私を指し示す助けがあれば、非常に感謝しています。

+0

無関係なサイドノートでは、あなたがクリックするたびに三つの異なる使い捨てのリソースを作成します。 "using"ステートメントでそれらをラップし、新しいBackgroundImageを新しいものに置き換えるときはそれを破棄してください。 –

+0

@ Moozhe - これはロジックを取得するためのコード(button1とForm1のように)を捨てるだけなので、パフォーマンスについてはあまり心配していません。最終製品はiOSで開発される予定です。私は一般的な描画アルゴリズムを打ち破ろうとしています。 :) –

+0

@ジョージ私はできることをした - あなたを満足させるかもしれない私の答えがある –

答えて

3

興味深い...

(ここでは答えのビデオ:http://youtu.be/estq62yz7v0

私はそのようにそれを行うだろう:、

まず矩形の描画をドロップすると、ラインであなたの効果線を引きます。同様に:

for (int y=start;y<end;y++) 
{ 
    color = DetermineColorFor(y-start); 
    DrawLine(left, y, right, y, color); 
} 

これはもちろんGDI +などでは問題にならない擬似コードです。

DetermineColorFor()のコード方法を除き、ここではすべてが明確です。このメソッドは、指定されたPROJECTEDの高さで行の色を返さなければなりません。今 projection diagram

、絵の上に、あなたが持っている:

  • を使用すると、ビュー(X)のポイント - それはあなたの画面だ(アイ
  • 赤い線を描画する方法を知りませんでした - 投影面)
  • 下部のバックグラウンド(交互ストライプ)
  • 、あなたがDetermineColorFor()方法を考案助けるべきいくつかの突出ライン

ヒント - 画面座標から 'bar'座標に移動するヒント - 三角形の類似点。
次のヒント - 'bar'座標の場合、モジュロ演算子を使用して色を決定します。

必要であれば、私はより多くのヒントを追加しますが、あなたが自分でこれを解決した場合、それは素晴らしいことです。


私は何とか質問に触発された、およびソリューションのためのコードを作成しました。ここにある:

int _offset = 0; 
double period = 20.0; 
private void timer1_Tick(object sender, EventArgs e) 
{ 
    for (int y = Height/3; y < Height; y++) 
    { 
     using (Graphics g = CreateGraphics()) 
     { 
      Pen p = new Pen(GetColorFor(y - Height/3)); 
      g.DrawLine(p, 0, y, Width, y); 
      p.Dispose(); 
     } 
    } 
    _offset++; 
} 

private Color GetColorFor(int y) 
{ 
    double d = 10.0; 
    double h = 20.0; 
    double z = 0.0; 
    if (y != 0) 
    { 
     z = d * h/(double)y + _offset; 
    } 
    double l = 128 + 127 * Math.Sin(z * 2.0 * Math.PI/period); 
    return Color.FromArgb((int)l, (int)l, (int)l); 
} 

と実験:

  • d - 眼から投影スクリーンまでの距離
  • h - 'バー'
  • periodから眼の高さ - ストライプ「バー」

の幅は、私は、フォーム上のタイマーを持っていましたイベントが正しくフックされます。タイマーの持続時間は20msでした。

+0

非常にクールな解決策 - しかし、勾配効果を防止し、元の質問で私のスクリーンショットのような実線を持つことは可能ですか? –

+0

です。しかし、私はこの点からあなたのためにそれを提供しません:)少し実験... –

+0

もし ''(l <= 128){l = 0;} else {l = 255;} '= P –

0

ここで2Dレンダリングについて話していることを考慮すると、私には控えめなものですが、私にはあなたはホイールを再開させるようです。あなたが必要とするのは、IMHOです。既に2Dレンダリング用にGDI +で利用できるMatrix Transformationsが使用されています。

GDI +でそれをaplyingの例:彼らはGraphics内部にあるSystem.Drawing.Drawing2D.Matrixクラスを使用する。このためGDI+ and MatrixTranformations

私が今までに使用したことのない最高の2Dレンダリングフレームワークは、大きな実生産プロジェクトで大きな成功を収めたPiccolo2Dフレームワークです。間違いなく2Dレンダリングプロジェクトにこれを使用しますが、まずそれを少し勉強する必要があります。

これが役に立ちます。

+0

ありがとう - しかし、私はフレームワーク固有ではない使用するアルゴリズムを探しています。たとえそれを.NETで実装することができたとしても、それをiOSにどのくらいうまく移行できるかはわかりません。 –

+0

@George:間違いなく、GDI +のマトリックスのトランスフォーメーションを中継します。それらは複雑ではなく、アルゴリズムよりもはるかに信頼性が高く、何年も後に数学があるからです。 – Tigran

+0

どのような種類の行列変換も必要ありません。問題は面白くて、2次元ドメインのみに取り組まなければならない。 –