Я предлагаю определить базовый абстрактный класс фигур, который имеет методы, которые должны предоставлять все фигуры, такие как метод рисования себя на графическом объекте, метод, который сообщает, находится ли внутри него / должна ли точка при его выборе, методчтобы повернуть его на заданную величину и метод для изменения цвета.
После того, как вы получили класс формы, вам нужно решить, как заполнять методы для каждой производной формы.Для рисования у вас уже есть код.Для его выбора это будет зависеть от формы.Для чего-то вроде круга это довольно просто, просто вычислите расстояние между центром круга и нажатой точкой, для чего-то вроде линии это сложнее, так как вы не хотите, чтобы пользователь нажимал на нее точно.
Это оставляет вращение и изменение цвета.Изменить цвет легко, просто выберите свойство 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;
}
}