Построить график функции 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());
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д