Построить график функции y=x^2. График строится из отрезков и алгоритма Брезенхема - C#

Узнай цену своей работы

Формулировка задачи:

Построить график функции y=x^2. График строится с помощью отрезков. Для построения отрезков использовать алгоритм Брезенхема.

Решение задачи: «Построить график функции y=x^2. График строится из отрезков и алгоритма Брезенхема»

textual
Листинг программы
interface IPlotter
{
    void Plot(int x, int y);
}
 
class BresenhamsOctantTransformation
{
    public Point SwitchToOctantZeroFrom(int octant, Point p)
    {
        switch (octant)
        {
            case 0: return new Point(p.X, p.Y);
            case 1: return new Point(p.Y, p.X);
            case 2: return new Point(p.Y, -p.X);
            case 3: return new Point(-p.X, p.Y);
            case 4: return new Point(-p.X, -p.Y);
            case 5: return new Point(-p.Y, -p.X);
            case 6: return new Point(-p.Y, p.X);
            case 7: return new Point(p.X, -p.Y);
            default: throw new ArgumentOutOfRangeException(nameof(octant));
        }
    }
 
    public Point SwitchFromOctantZeroTo(int octant, Point p)
    {
        switch (octant)
        {
            case 0: return new Point(p.X, p.Y);
            case 1: return new Point(p.Y, p.X);
            case 2: return new Point(-p.Y, p.X);
            case 3: return new Point(-p.X, p.Y);
            case 4: return new Point(-p.X, -p.Y);
            case 5: return new Point(-p.Y, -p.X);
            case 6: return new Point(p.Y, -p.X);
            case 7: return new Point(p.X, -p.Y);
            default: throw new ArgumentOutOfRangeException(nameof(octant));
        }
    }
}
 
class BresenhamsPlotter : IPlotter
{
    private BresenhamsOctantTransformation _transformation;
    private IPlotter _plotter;
    private int _octant;
    
    public BresenhamsPlotter(int octant, IPlotter plotter, BresenhamsOctantTransformation trasformation)
    {
        _plotter = plotter;
        _octant = octant;
        _transformation = trasformation;
    }
    
    public void Plot(int x, int y)
    {
        Point output = _transformation.SwitchFromOctantZeroTo(_octant, new Point(x, y));
        _plotter.Plot(output.X, output.Y);
    }
}
 
class BresenhamsBasicAlgorithm
{
    public void DrawLine(Point start, Point end, IPlotter plotter)
    {
        if (Math.Abs(end.X - start.X) < 1e-6)
        {
            DrawVertical(start.X, start.Y, end.Y, plotter);
            return;
        }
        
        DrawLineImpl(start, end, plotter);
    }
    
    private void DrawLineImpl(Point start, Point end, IPlotter plotter)
    {
        int dx = end.X - start.X;
        int dy = end.Y - start.Y;
        
        int d = 2 * dy - dx;
        int y = start.Y;
        
        for (int x = start.X; x <= end.X; x++)
        {
            plotter.Plot(x, y);
            
            if (d > 0)
            {
                y = y + 1;
                d -= dx;
            }
            
            d += dy;
        }
    }
    
    private void DrawVertical(int x, int yStart, int yEnd, IPlotter plotter)
    {
        int dy = yEnd > yStart ? 1 : -1;
 
        for (int y = yStart; true; y += dy)
        {
            plotter.Plot(x, y);
            
            if (y == yEnd) break;
        }
    }
}
 
class BresenhamsOctantWiseAlgorithm
{
    private BresenhamsBasicAlgorithm _basicAlgorithm = new BresenhamsBasicAlgorithm();
    private BresenhamsOctantTransformation _transformation = new BresenhamsOctantTransformation();
    
    public void DrawLine(Point start, Point end, IPlotter plotter)
    {
        if (start.X > end.X)
        {
            var temp = start;
            start = end;
            end = temp;
        }
        
        int octant = GetOctant(end.X - start.X, end.Y - start.Y);
        
        start = _transformation.SwitchToOctantZeroFrom(octant, start);
        end = _transformation.SwitchToOctantZeroFrom(octant, end);
        
        var bresenhamsPlotter = new BresenhamsPlotter(octant, plotter, _transformation);
        
        _basicAlgorithm.DrawLine(start, end, bresenhamsPlotter);
    }
 
    private int GetOctant(int dx, int dy)
    {
        if (dy >= 0)
            if (dy <= dx)
                return 0;
            else
                return 1;
        else
            if (-dy <= dx)
            return 7;
        else
            return 6;
    }
}
 
class StupidPlotter : IPlotter
{
    private Graphics _graphics;
    private Pen _pen;
    
    public StupidPlotter(Graphics graphics, Pen pen)
    {
        _graphics = graphics;
        _pen = pen;
    }
    
    public void Plot(int x, int y)
    {
        _graphics.DrawEllipse(_pen, x - 0.1f, y - 0.1f, 0.2f, 0.2f);
    }
}
 
class MainForm : Form
{
    private Point _start;
    private Point _end;
    private bool _hold;
    
    public MainForm()
    {
        base.DoubleBuffered = true;
        
        MouseDown += (_, e) =>
        {
            if (e.Button != MouseButtons.Left) return;
            
            _hold = true;
            _start = _end = e.Location;
            
            Invalidate();
        };
 
        MouseUp += (_, e) =>
        {
            if (e.Button != MouseButtons.Left || !_hold) return;
            
            _hold = false;
            _end = e.Location;
            
            Invalidate();
        };
 
        MouseMove += (_, e) =>
        {
            if (!_hold) return;
            
            _end = e.Location;
            
            Invalidate();
        };
    }
    
    protected override void OnPaint(PaintEventArgs e)
    {
        var plotter = new StupidPlotter(e.Graphics, Pens.Red);
        var bresenhamsAlgorithm = new BresenhamsOctantWiseAlgorithm();
        bresenhamsAlgorithm.DrawLine(_start, _end, plotter);
    }
}
 
void Main()
{
    Application.Run(new MainForm());
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.1 из 5
Похожие ответы