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; } } }