Этап 7
This commit is contained in:
43
Minint.Core/Services/Impl/DrawingService.cs
Normal file
43
Minint.Core/Services/Impl/DrawingService.cs
Normal file
@@ -0,0 +1,43 @@
|
||||
using Minint.Core.Models;
|
||||
|
||||
namespace Minint.Core.Services.Impl;
|
||||
|
||||
public sealed class DrawingService : IDrawingService
|
||||
{
|
||||
public void ApplyBrush(MinintLayer layer, int cx, int cy, int radius, int colorIndex, int width, int height)
|
||||
{
|
||||
foreach (var (x, y) in GetBrushMask(cx, cy, radius, width, height))
|
||||
layer.Pixels[y * width + x] = colorIndex;
|
||||
}
|
||||
|
||||
public void ApplyEraser(MinintLayer layer, int cx, int cy, int radius, int width, int height)
|
||||
{
|
||||
foreach (var (x, y) in GetBrushMask(cx, cy, radius, width, height))
|
||||
layer.Pixels[y * width + x] = 0;
|
||||
}
|
||||
|
||||
public List<(int X, int Y)> GetBrushMask(int cx, int cy, int radius, int width, int height)
|
||||
{
|
||||
var mask = new List<(int, int)>();
|
||||
int r = Math.Max(radius, 0);
|
||||
int r2 = r * r;
|
||||
|
||||
int xMin = Math.Max(0, cx - r);
|
||||
int xMax = Math.Min(width - 1, cx + r);
|
||||
int yMin = Math.Max(0, cy - r);
|
||||
int yMax = Math.Min(height - 1, cy + r);
|
||||
|
||||
for (int py = yMin; py <= yMax; py++)
|
||||
{
|
||||
int dy = py - cy;
|
||||
for (int px = xMin; px <= xMax; px++)
|
||||
{
|
||||
int dx = px - cx;
|
||||
if (dx * dx + dy * dy <= r2)
|
||||
mask.Add((px, py));
|
||||
}
|
||||
}
|
||||
|
||||
return mask;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user