2011-12-14 43 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

無關的一面說明,您在每次點擊時創建三個不同的可用資源。嘗試將它們包裝在「使用」語句中,並在用新的替換它時處置舊的BackgroundImage。 – 2011-12-14 15:15:13

+0

@Moozhe - 這只是丟棄代碼(如button1和Form1所指出的)以獲得邏輯,所以我並不真正過度關心性能。最終產品將在iOS中開發。我只是試圖找出一般的繪圖算法。 :) – 2011-12-14 15:16:42

+0

@George我盡我所能 - 我的答案可能會滿足你 – 2011-12-14 18:23:30

回答

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()方法

提示 - 使用三角形相似性從屏幕座標移動到「條形」座標。
下一條提示 - 當您處於「酒吧」座標中時,使用模運算符來確定顏色。

如果需要,我會添加更多提示,但如果您自己解決這個問題,那將會很棒。


我從某種程度上受到了這個問題的啓發,並且爲解決方案創建了一個代碼。在這裏它是:

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 - 眼睛的高度從 '酒吧'
  • period - - 從眼睛到投影屏幕
  • h距離條紋'bar'上的寬度

我在窗體上有一個計時器和事件正確掛鉤。計時器持續時間爲20ms。

0

考慮到你在這裏談論2D渲染,就像我對它的瞭解一樣,對我來說,似乎你會重新發明輪子。導致你需要什麼,恕我直言;在GDI +中已經可以使用Matrix Transformations進行2D渲染。

在GDI + aplying它的實例:GDI+ and MatrixTranformations

爲此,他們使用System.Drawing.Drawing2D.Matrix類,它是內部Graphics

我曾經使用過的有史以來最好的2D渲染框架是Piccolo2D框架,我在大型實際生產項目中取得了巨大成功。絕對使用這個爲你的2D渲染項目,但首先你需要研究一點點。

希望這會有所幫助。