Вращение нарисованных объектов - PullRequest
0 голосов
/ 16 ноября 2011

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

Graphics surface = this.splitContainer1.Panel2.CreateGraphics();
Pen pen1 = new Pen(ColorR.BackColor, float.Parse(boxWidth.Text));

switch (currentObject)
{
case "line":
    if (step == 1)
    {
        splitContainer1.Panel2.Focus();
        one.X = e.X;
        one.Y = e.Y;
        boxX.Text = one.X.ToString();
        boxY.Text = one.Y.ToString();
        step = 2;
    }
    else
    {
        two.X = e.X;
        two.Y = e.Y;
        boxX2.Text = two.X.ToString();
        boxY2.Text = two.Y.ToString();
        surface.DrawLine(pen1, one, two);
        step = 1;
    }
    break;

case "circle":
    if (step == 1)
    {
        boxX.Text = e.X.ToString();
        boxY.Text = e.Y.ToString();
        step = 2;
    }
    else
    {
        int tempX = int.Parse(boxX.Text);
        int tempY = int.Parse(boxY.Text);
        int tempX2 = e.X;
        int tempY2 = e.Y;
        int sideX, sideY;
        if (tempX > tempX2)
        {
            sideX = tempX - tempX2;
        }
        else
        {
            sideX = tempX2 - tempX;
        }

        if (tempY > tempY2)
        {
            sideY = tempY - tempY2;
        }
        else
        {
            sideY = tempY2 - tempY;
        }

        double tempRadius;
        tempRadius = Math.Sqrt(sideX * sideX + sideY * sideY);
        tempRadius *= 2;

        bWidth.Text = bHeight.Text = Convert.ToInt32(tempRadius).ToString();

        surface.DrawEllipse(
           pen1,
           int.Parse(boxX.Text) - int.Parse(bWidth.Text) / 2, 
           int.Parse(boxY.Text) - int.Parse(bHeight.Text) / 2,
           float.Parse(bWidth.Text), float.Parse(bHeight.Text));
        step = 1;
    }
    break;

case "square":
    if (step == 1)
    {
        boxX.Text = e.X.ToString();
        boxY.Text = e.Y.ToString();
        step = 2;
    }
    else if (step == 2)
    {
        int tempX = e.X;
        if (tempX > int.Parse(boxX.Text))
        {
            bWidth.Text = (tempX - int.Parse(boxX.Text)).ToString();
        }
        else
        {
            bWidth.Text = (int.Parse(boxX.Text) - tempX).ToString();
        }

        step = 3;
    }
    else
    {
        int tempY = e.Y;
        if (tempY > int.Parse(boxY.Text))
        {
            bHeight.Text = (tempY - int.Parse(boxY.Text)).ToString();
        }
        else
        {
            bHeight.Text = (int.Parse(boxY.Text) - tempY).ToString();
        }

        surface.DrawRectangle(
            pen1,
            int.Parse(boxX.Text),
            int.Parse(boxY.Text),
            int.Parse(bWidth.Text),
            int.Parse(bHeight.Text));
        step = 1;
    }

    break;
}

Так что после того, как я нарисовал изображения, я хочу иметь возможность выбрать фигуру и - например - изменить цвет или повернуть его. Но я не могу понять, как это сделать.

Ответы [ 2 ]

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

Я предлагаю определить базовый абстрактный класс фигур, который имеет методы, которые должны предоставлять все фигуры, такие как метод рисования себя на графическом объекте, метод, который сообщает, находится ли внутри него / должна ли точка при его выборе, методчтобы повернуть его на заданную величину и метод для изменения цвета.

После того, как вы получили класс формы, вам нужно решить, как заполнять методы для каждой производной формы.Для рисования у вас уже есть код.Для его выбора это будет зависеть от формы.Для чего-то вроде круга это довольно просто, просто вычислите расстояние между центром круга и нажатой точкой, для чего-то вроде линии это сложнее, так как вы не хотите, чтобы пользователь нажимал на нее точно.

Это оставляет вращение и изменение цвета.Изменить цвет легко, просто выберите свойство Color в классе Shape, затем, когда вы рисуете свои фигуры, используйте этот цвет для создания кисти или пера.

Что касается вращения, взгляните на Graphics.RotateTransform.


public abstract class Shape
{
    public Color Color { get; set; }
    public float Rotation { get; set; }
    public Point Position { get; set; }

    public Shape(Color color, float rotation, Point position)
    {
        Color = color;
        Rotation = rotation;
        Position = position;
    }

    public void ChangeRotation(float amount)
    {
        Rotation += amount;
    }

    public abstract void Draw(Graphics graphics);
    public abstract bool WithinBounds(Point point);
}

public class Circle : Shape
{
    public float Radius { get; set; }

    public Circle(Color color, float rotation, Point position)
        :base(color, rotation, position)
    {

    }

    public override void Draw(Graphics graphics)
    {

    }

    public override bool WithinBounds(Point point)
    {
        if (Math.Sqrt(Math.Pow(point.X - Position.X, 2) + Math.Pow(point.Y - Position.Y, 2)) <= Radius)
            return true;
        else
            return false;

        // Note, if statement could be removed to become the below:
        //return Math.Sqrt(Math.Pow(point.X - Position.X, 2) + Math.Pow(point.Y - Position.Y, 2)) <= Radius;
    }
}
0 голосов
/ 16 ноября 2011

Посмотрите на метод RotateTransform объекта Graphics.Также есть метод TranslateTransform.

...