2011-11-24 48 views
0

我有一個打印立方體和可以旋轉的程序。這是代碼。如何通過在C#中按下按鈕來縮放立方體?

public partial class ProjectorForm : Form 
{ 
    Projector projector; 
    Cube cube; 
    float deltaRot;   



    public ProjectorForm() 
    {    
     InitializeComponent(); 

    } 

    private void ProjectorForm_Load(object sender, EventArgs e) 
    { 

     deltaRot = 0.01f; 

     projector = new Projector(); 
     cube = new Cube(Vector3.UnitZ * 20*10, 10*10, 10*10, 15*10); 

     updateTimer.Start(); 
    } 

    private void updateTimer_Tick(object sender, EventArgs e) 
    { 
     if (rotXBox.Checked) 
      cube.RotateX(deltaRot); 
     if (rotYBox.Checked) 
      cube.RotateY(deltaRot); 
     if (rotZBox.Checked) 
      cube.RotateZ(deltaRot); 



     doubleBufferedPanel1.Invalidate(); 
    } 



    private void doubleBufferedPanel1_Paint(object sender, PaintEventArgs e) 
    { 

     e.Graphics.Clear(Color.White); 
     cube.Draw(projector, Color.Black, doubleBufferedPanel1.ClientSize.Width, doubleBufferedPanel1.ClientSize.Height, e.Graphics); 


    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     deltaRot = float.Parse(deltaRotBox.Text); 
    } 




} 

class Projector 
{ 
    public Vector3 cameraPosition; 
    public float planeDistance; 
    ProjectorForm n = new ProjectorForm(); 





    public Projector() 
    { 
     cameraPosition = Vector3.Zero; 
     planeDistance = 256; //Here, multiply by 2 and the scaled cube, how to make that scale when you press the button. 

    } 

    public PointF Project(Vector3 point, float width, float height) 
    { 
     float x = cameraPosition.X + ((cameraPosition.Z + planeDistance)/(point.Z - cameraPosition.Z)) * (point.X - cameraPosition.X) + width/2; 
     float y = cameraPosition.Y + ((cameraPosition.Z + planeDistance)/(point.Z - cameraPosition.Z)) * (point.Y - cameraPosition.Y) + height/2; 
     return new PointF(x, y); 
    } 

    public void DrawLine(Color color, Vector3 p1, Vector3 p2, float width, float height, Graphics g) 
    { 
     g.DrawLine(new Pen(color), Project(p1, width, height), Project(p2, width, height)); 
    } 

    public void FillPolygon(Color color, Vector3[] vertices, float width, float height, Graphics g) 
    { 
     PointF[] points = new PointF[vertices.Length]; 
     for (int i = 0; i < points.Length; i++) 
      points[i] = Project(vertices[i], width, height); 
     g.FillPolygon(new SolidBrush(color), points); 
    } 
} 

如何通過按下按鈕來縮放立方體。我在投影機類中找到了變量planeDistance,當它增加了2倍的立方體縮放時,但我不知道如何通過按鈕增加它。

+2

百萬條代碼行的其餘部分在哪裏?請善良,向我們展示你的問題的熱點。 – Fischermaen

回答

1

該字段planeDistance是公開的,所以你可以從課外改變它。即只需添加類似於下面的一個按鈕的事件處理程序:

projector.planeDistance += 10; // Change 10 as appropriate 

值得一提的是,這並不改變立方體的大小,它改變了相機是如何遠離它。所以,雖然立方體的大小正在變化,但這只是因爲相機正在靠近/遠離。


要實際更改立方體的大小,您必須更改cube類中的字段。 由於大小是由構造函數中創建的向量定義的,因此一旦創建了多維數據集,您就沒有一種更改它們的簡單方法。

  1. 無論何時要更改大小(記錄表單上其他變量的大小),您都可以創建一個新的多維數據集。
  2. 您可以向立方體類添加一個方法,創建定義新尺寸的新向量(它看起來有點像構造函數,只填充數組,不創建它們)。
  3. 您可以將大小字段添加到您的多維數據集,始終創建一個單位多維數據集(1,1,1),然後在繪製時將每個向量乘以您的大小。
+0

謝謝你的需求。 –