1
0
Files
OAiP-Presnyakov_Ilya-Labora…/DrawFigureLibrary/Figure.cs
2026-02-26 12:12:38 +03:00

78 lines
2.1 KiB
C#

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace DrawFigureLibrary
{
public abstract class Figure
{
public string? Name { get; }
public int x;
public int y;
public int w;
public int h;
public Figure(string name, int x, int y, int w, int h)
{
this.Name = name;
this.x = x;
this.y = y;
this.w = w;
this.h = h;
}
public abstract void Draw(DrawingContext ctx);
public abstract void MoveBy(int dX, int dY);
public override string ToString() => Name ?? "";
public static bool Check(Figure fig, int dX, int dY, Image img)
{
long nx = (long)fig.x + dX;
long ny = (long)fig.y + dY;
long nr = nx + fig.w;
long nb = ny + fig.h;
return nx >= 0 &&
ny >= 0 &&
nr <= (long)img.ActualWidth &&
nb <= (long)img.ActualHeight;
}
public virtual bool HitTest(Point p) => p.X >= x && p.X <= x + w && p.Y >= y && p.Y <= y + h;
public virtual bool MoveByChecked(int dX, int dY)
{
if (Init.DrawingImage == null) return false;
if (!Check(this, dX, dY, Init.DrawingImage)) return false;
MoveBy(dX, dY);
return true;
}
public virtual void ResizeTo(int newW, int newH)
{
if (newW <= 0 || newH <= 0) throw new ArgumentException("Размеры должны быть > 0");
w = newW;
h = newH;
}
public virtual bool ResizeToChecked(int newW, int newH)
{
if (Init.DrawingImage == null) return false;
if (newW <= 0 || newH <= 0) return false;
long nr = (long)x + newW;
long nb = (long)y + newH;
if (x < 0 || y < 0) return false;
if (nr > (long)Init.DrawingImage.ActualWidth) return false;
if (nb > (long)Init.DrawingImage.ActualHeight) return false;
ResizeTo(newW, newH);
return true;
}
}
}