Алгоритм Брезенхема: как вводить радиус окружности, длину линии и цвет данных фигур - C#
Формулировка задачи:
Доброго времени господа-форумчане!Мне нужно доработать программу, т е форму.Таким образом чтоб вводить радиус окружности,длину линии и цвет данных фигур.Кто может подсказать что по данной теме?
Кидаю скриншот проги(рисунок1)
Решение задачи: «Алгоритм Брезенхема: как вводить радиус окружности, длину линии и цвет данных фигур»
textual
Листинг программы
- using System;
- using System.Drawing;
- using System.Windows.Forms;
- namespace RasterAlgorithms
- {
- public partial class Form1 : Form
- {
- //Метод Main() - точка входа в программу
- public static void Main()
- {
- using (Form1 frm = new Form1())
- {
- Application.Run(frm);
- }
- }
- //Конструктор пользовательского класса, наследующего класс Form
- public Form1()
- {
- InitializeComponent();
- ResizeRedraw = true;
- }
- //Обработчик события OnPaint. Отрисовывает на форме её содержимое
- protected override void OnPaint(PaintEventArgs e)
- {
- //Устранение ошибки смещения на 1 пиксел
- e.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
- //Отрисовка 4-связной линии, построенной по алгоритму Брезенхема
- RasterAlgorithms.Bresenham4Line(
- e.Graphics,
- Color.Orange,
- 50, 34, ClientSize.Width - 10, ClientSize.Height - 50);
- //Отрисовка 8-связной линии, построенной по алгоритму Брезенхема
- RasterAlgorithms.Bresenham8Line(
- e.Graphics,
- Color.Blue,
- 30, 34, ClientSize.Width - 10, ClientSize.Height - 30);
- //Обычная линия
- e.Graphics.DrawLine(new Pen(Color.Brown),
- 10, 34, ClientSize.Width - 30, ClientSize.Height - 10);
- //Настройки сглаживания
- e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
- //Отрисовка окружности, построенной по алгоритму Брезенхема
- RasterAlgorithms.BresenhamCircle(
- e.Graphics,
- Color.Red,
- 400, 150, 75);
- //Окружность
- e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
- e.Graphics.DrawEllipse(new Pen(Color.Indigo), 100, 350, 150, 150);
- }
- //Описание элементов меню
- private void toolStripMenuItem2_Click(object sender, EventArgs e)
- {
- Application.Exit();
- }
- private void toolStripMenuItem4_Click(object sender, EventArgs e)
- {
- MessageBox.Show(
- "Линии (сверху вниз) : \n" +
- "1. 4-связная линия, построенная по алгоритму Брезенхема\n" +
- "2. 8-связная линия, построенная по алгоритму Брезенхема\n" +
- "3. Линия, встроенная в платформу\n" +
- "Окружности (сверху вниз) : \n" +
- "1. Окружность, построенная по алгоритму Брезенхема\n" +
- "2. Окружность, встроенная в платформу\n" +
- "");
- }
- }
- //Статический класс, содержащий реализацию растровых алгоритмов
- static class RasterAlgorithms
- {
- //Статический метод, реализующий отрисовку линии по алгоритму Ву
- public static void DrawWuLine(Graphics g, Color clr, int x0, int y0, int x1, int y1)
- {
- //Вычисление изменения координат
- int dx = (x1 > x0) ? (x1 - x0) : (x0 - x1);
- int dy = (y1 > y0) ? (y1 - y0) : (y0 - y1);
- //Если линия параллельна одной из осей, рисуем обычную линию - заполняем все пикселы в ряд
- if (dx == 0 || dy == 0)
- {
- g.DrawLine(new Pen(clr), x0, y0, x1, y1);
- return;
- }
- //Для Х-линии (коэффициент наклона < 1)
- if (dy < dx)
- {
- //Первая точка должна иметь меньшую координату Х
- if (x1 < x0)
- {
- x1 += x0; x0 = x1 - x0; x1 -= x0;
- y1 += y0; y0 = y1 - y0; y1 -= y0;
- }
- //Относительное изменение координаты Y
- float grad = (float)dy / dx;
- //Промежуточная переменная для Y
- float intery = y0 + grad;
- //Первая точка
- PutPixel(g, clr, x0, y0, 255);
- for (int x = x0 + 1; x < x1; x++)
- {
- //Верхняя точка
- PutPixel(g, clr, x, IPart(intery), (int)(255 - FPart(intery) * 255));
- //Нижняя точка
- PutPixel(g, clr, x, IPart(intery) + 1, (int)(FPart(intery) * 255));
- //Изменение координаты Y
- intery += grad;
- }
- //Последняя точка
- PutPixel(g, clr, x1, y1, 255);
- }
- //Для Y-линии (коэффициент наклона > 1)
- else
- {
- //Первая точка должна иметь меньшую координату Y
- if (y1 < y0)
- {
- x1 += x0; x0 = x1 - x0; x1 -= x0;
- y1 += y0; y0 = y1 - y0; y1 -= y0;
- }
- //Относительное изменение координаты X
- float grad = (float)dx / dy;
- //Промежуточная переменная для X
- float interx = x0 + grad;
- //Первая точка
- PutPixel(g, clr, x0, y0, 255);
- for (int y = y0 + 1; y < y1; y++)
- {
- //Верхняя точка
- PutPixel(g, clr, IPart(interx), y, 255 - (int)(FPart(interx) * 255));
- //Нижняя точка
- PutPixel(g, clr, IPart(interx) + 1, y, (int)(FPart(interx) * 255));
- //Изменение координаты X
- interx += grad;
- }
- //Последняя точка
- PutPixel(g, clr, x1, y1, 255);
- }
- }
- //Статический метод, реализующий отрисовку 8-связной линии по алгоритму Брезенхема
- static public void Bresenham8Line(Graphics g, Color clr, int x0, int y0, int x1, int y1)
- {
- //Изменения координат
- int dx = (x1 > x0) ? (x1 - x0) : (x0 - x1);
- int dy = (y1 > y0) ? (y1 - y0) : (y0 - y1);
- //Направление приращения
- int sx = (x1 >= x0) ? (1) : (-1);
- int sy = (y1 >= y0) ? (1) : (-1);
- if (dy < dx)
- {
- int d = (dy << 1) - dx;
- int d1 = dy << 1;
- int d2 = (dy - dx) << 1;
- PutPixel(g, clr, x0, y0, 255);
- int x = x0 + sx;
- int y = y0;
- for (int i = 1; i <= dx; i++)
- {
- if (d > 0)
- {
- d += d2;
- y += sy;
- }
- else
- d += d1;
- PutPixel(g, clr, x, y, 255);
- x++;
- }
- }
- else
- {
- int d = (dx << 1) - dy;
- int d1 = dx << 1;
- int d2 = (dx - dy) << 1;
- PutPixel(g, clr, x0, y0, 255);
- int x = x0;
- int y = y0 + sy;
- for (int i = 1; i <= dy; i++)
- {
- if (d > 0)
- {
- d += d2;
- x += sx;
- }
- else
- d += d1;
- PutPixel(g, clr, x, y, 255);
- y++;
- }
- }
- }
- //Статический метод, реализующий отрисовку 4-связной линии по алгоритму Брезенхема
- public static void Bresenham4Line(Graphics g, Color clr, int x0, int y0, int x1, int y1)
- {
- int dx = x1 - x0;
- int dy = y1 - y0;
- int d = 0;
- int d1 = dy << 1;
- int d2 = -(dx << 1);
- PutPixel(g, clr, x0, y0, 255);
- int x = x0;
- int y = y0;
- for (int i = 1; i <= dx + dy; i++)
- {
- if (d > 0)
- {
- d += d2;
- y++;
- }
- else
- {
- d += d1;
- x++;
- }
- PutPixel(g, clr, x, y, 255);
- }
- }
- //Статический метод, реализующий отрисовку окружности по алгоритму Брезенхема
- public static void BresenhamCircle(Graphics g, Color clr, int _x, int _y, int radius)
- {
- int x = 0, y = radius, gap = 0, delta = (2 - 2 * radius);
- while (y >= 0)
- {
- PutPixel(g, clr, _x + x, _y + y, 255);
- PutPixel(g, clr, _x + x, _y - y, 255);
- PutPixel(g, clr, _x - x, _y - y, 255);
- PutPixel(g, clr, _x - x, _y + y, 255);
- gap = 2 * (delta + y) - 1;
- if (delta < 0 && gap <= 0)
- {
- x++;
- delta += 2 * x + 1;
- continue;
- }
- if (delta > 0 && gap > 0)
- {
- y--;
- delta -= 2 * y + 1;
- continue;
- }
- x++;
- delta += 2 * (x - y);
- y--;
- }
- }
- //Метод, устанавливающий пиксел на форме с заданными цветом и прозрачностью
- private static void PutPixel(Graphics g, Color col, int x, int y, int alpha)
- {
- g.FillRectangle(new SolidBrush(Color.FromArgb(alpha, col)), x, y, 1, 1);
- }
- //Целая часть числа
- private static int IPart(float x)
- {
- return (int)x;
- }
- //дробная часть числа
- private static float FPart(float x)
- {
- while (x >= 0)
- x--;
- x++;
- return x;
- }
- }
- }
- //file Form1.Designer.cs
- namespace RasterAlgorithms
- {
- partial class Form1
- {
- /// <summary>
- /// Required designer variable.
- /// </summary>
- private System.ComponentModel.IContainer components = null;
- /// <summary>
- /// Clean up any resources being used.
- /// </summary>
- /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
- protected override void Dispose(bool disposing)
- {
- if (disposing && (components != null))
- {
- components.Dispose();
- }
- base.Dispose(disposing);
- }
- #region Windows Form Designer generated code
- /// <summary>
- /// Required method for Designer support - do not modify
- /// the contents of this method with the code editor.
- /// </summary>
- private void InitializeComponent()
- {
- this.menuStrip1 = new System.Windows.Forms.MenuStrip();
- this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem();
- this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem();
- this.menuStrip1.SuspendLayout();
- this.SuspendLayout();
- //
- // menuStrip1
- //
- this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.toolStripMenuItem1,
- this.toolStripMenuItem3});
- this.menuStrip1.Location = new System.Drawing.Point(0, 0);
- this.menuStrip1.Name = "menuStrip1";
- this.menuStrip1.Size = new System.Drawing.Size(784, 24);
- this.menuStrip1.TabIndex = 1;
- this.menuStrip1.Text = "menuStrip1";
- //
- // toolStripMenuItem1
- //
- this.toolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.toolStripMenuItem2});
- this.toolStripMenuItem1.Name = "toolStripMenuItem1";
- this.toolStripMenuItem1.Size = new System.Drawing.Size(37, 20);
- this.toolStripMenuItem1.Text = "File";
- //
- // toolStripMenuItem2
- //
- this.toolStripMenuItem2.Name = "toolStripMenuItem2";
- this.toolStripMenuItem2.Size = new System.Drawing.Size(152, 22);
- this.toolStripMenuItem2.Text = "Exit";
- this.toolStripMenuItem2.Click += new System.EventHandler(this.toolStripMenuItem2_Click);
- //
- // toolStripMenuItem3
- //
- this.toolStripMenuItem3.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
- this.toolStripMenuItem4});
- this.toolStripMenuItem3.Name = "toolStripMenuItem3";
- this.toolStripMenuItem3.Size = new System.Drawing.Size(44, 20);
- this.toolStripMenuItem3.Text = "Help";
- //
- // toolStripMenuItem4
- //
- this.toolStripMenuItem4.Name = "toolStripMenuItem4";
- this.toolStripMenuItem4.Size = new System.Drawing.Size(152, 22);
- this.toolStripMenuItem4.Text = "Help";
- this.toolStripMenuItem4.Click += new System.EventHandler(this.toolStripMenuItem4_Click);
- //
- // Form1
- //
- this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(784, 562);
- this.Controls.Add(this.menuStrip1);
- this.MainMenuStrip = this.menuStrip1;
- this.Name = "Алгоритм Брезенхема Бпм11-01";
- this.Text = "Алгоритм Брезенхема Бпм11-01";
- this.menuStrip1.ResumeLayout(false);
- this.menuStrip1.PerformLayout();
- this.ResumeLayout(false);
- this.PerformLayout();
- }
- #endregion
- private System.Windows.Forms.MenuStrip menuStrip1;
- private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1;
- private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2;
- private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem3;
- private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem4;
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д