Как масштабировать куб, нажав кнопку в C #? - PullRequest
0 голосов
/ 24 ноября 2011

У меня есть программа, которая печатает куб и может вращаться.Вот код:

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 в классе Projector, когда он увеличился в 2 раза, масштабируемый куб, но я не знаю, как его можно увеличить с помощью кнопки.

1 Ответ

1 голос
/ 24 ноября 2011

Поле planeDistance является открытым, поэтому вы можете изменить его вне класса.то есть просто добавьте что-то вроде следующего в обработчик событий кнопки:

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

Стоит отметить, что это не меняет размер куба, он меняет то, как далеко от него находится камера.Таким образом, хотя размер куба меняется, это происходит только потому, что камера перемещается ближе / дальше.


Чтобы реально изменить размер куба, необходимо изменить поля в cube класс.Поскольку размер определяется векторами, созданными в конструкторе, у вас нет простого способа изменить их после создания куба.

  1. Вы можете создать новый куб, когда захотите изменитьразмер (следите за размером в другой переменной формы).
  2. Вы можете добавить метод к классу куба, который создает новые векторы, определяющие новый размер (это будет выглядеть немного как конструктор,только заполняет массивы, но не создает их).
  3. Вы можете добавить поле размера в свой куб, всегда создавать единичный куб (1, 1, 1), а затем при рендеринге умножать каждый вектор на свой размер.
...