Алгоритм Брезенхема: как вводить радиус окружности, длину линии и цвет данных фигур - C#

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

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

Доброго времени господа-форумчане!Мне нужно доработать программу, т е форму.Таким образом чтоб вводить радиус окружности,длину линии и цвет данных фигур.Кто может подсказать что по данной теме? Кидаю скриншот проги(рисунок1)

Решение задачи: «Алгоритм Брезенхема: как вводить радиус окружности, длину линии и цвет данных фигур»

textual
Листинг программы
  1.  using System;
  2. using System.Drawing;
  3. using System.Windows.Forms;
  4.  
  5. namespace RasterAlgorithms
  6. {
  7.     public partial class Form1 : Form
  8.     {
  9.         //Метод Main() - точка входа в программу
  10.         public static void Main()
  11.         {
  12.             using (Form1 frm = new Form1())
  13.             {
  14.  
  15.                 Application.Run(frm);
  16.             }
  17.         }
  18.  
  19.         //Конструктор пользовательского класса, наследующего класс Form
  20.         public Form1()
  21.         {
  22.             InitializeComponent();
  23.             ResizeRedraw = true;
  24.         }
  25.  
  26.         //Обработчик события OnPaint. Отрисовывает на форме её содержимое
  27.         protected override void OnPaint(PaintEventArgs e)
  28.         {
  29.             //Устранение ошибки смещения на 1 пиксел
  30.             e.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
  31.  
  32.             //Отрисовка 4-связной линии, построенной по алгоритму Брезенхема
  33.             RasterAlgorithms.Bresenham4Line(
  34.                 e.Graphics,
  35.                 Color.Orange,
  36.                 50, 34, ClientSize.Width - 10, ClientSize.Height - 50);
  37.  
  38.             //Отрисовка 8-связной линии, построенной по алгоритму Брезенхема
  39.             RasterAlgorithms.Bresenham8Line(
  40.                 e.Graphics,
  41.                 Color.Blue,
  42.                 30, 34, ClientSize.Width - 10, ClientSize.Height - 30);
  43.  
  44.          
  45.            
  46.             //Обычная линия
  47.             e.Graphics.DrawLine(new Pen(Color.Brown),
  48.                 10, 34, ClientSize.Width - 30, ClientSize.Height - 10);
  49.  
  50.             //Настройки сглаживания
  51.             e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
  52.  
  53.             //Отрисовка окружности, построенной по алгоритму Брезенхема
  54.             RasterAlgorithms.BresenhamCircle(
  55.                 e.Graphics,
  56.                 Color.Red,
  57.                 400, 150, 75);
  58.  
  59.          
  60.  
  61.             //Окружность
  62.             e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
  63.             e.Graphics.DrawEllipse(new Pen(Color.Indigo), 100, 350, 150, 150);
  64.  
  65.        
  66.         }
  67.         //Описание элементов меню
  68.         private void toolStripMenuItem2_Click(object sender, EventArgs e)
  69.         {
  70.             Application.Exit();
  71.         }
  72.  
  73.         private void toolStripMenuItem4_Click(object sender, EventArgs e)
  74.         {
  75.             MessageBox.Show(
  76.                 "Линии (сверху вниз) : \n" +
  77.                 "1. 4-связная линия, построенная по алгоритму Брезенхема\n" +
  78.                 "2. 8-связная линия, построенная по алгоритму Брезенхема\n" +
  79.                 "3. Линия, встроенная в платформу\n" +
  80.                
  81.                 "Окружности (сверху вниз) : \n" +
  82.                 "1. Окружность, построенная по алгоритму Брезенхема\n" +
  83.                 "2. Окружность, встроенная в платформу\n" +
  84.                
  85.                 "");
  86.         }
  87.     }
  88.  
  89.     //Статический класс, содержащий реализацию растровых алгоритмов
  90.     static class RasterAlgorithms
  91.     {
  92.         //Статический метод, реализующий отрисовку линии по алгоритму Ву
  93.         public static void DrawWuLine(Graphics g, Color clr, int x0, int y0, int x1, int y1)
  94.         {
  95.             //Вычисление изменения координат
  96.             int dx = (x1 > x0) ? (x1 - x0) : (x0 - x1);
  97.             int dy = (y1 > y0) ? (y1 - y0) : (y0 - y1);
  98.             //Если линия параллельна одной из осей, рисуем обычную линию - заполняем все пикселы в ряд
  99.             if (dx == 0 || dy == 0)
  100.             {
  101.                 g.DrawLine(new Pen(clr), x0, y0, x1, y1);
  102.                 return;
  103.             }
  104.  
  105.             //Для Х-линии (коэффициент наклона < 1)
  106.             if (dy < dx)
  107.             {
  108.                 //Первая точка должна иметь меньшую координату Х
  109.                 if (x1 < x0)
  110.                 {
  111.                     x1 += x0; x0 = x1 - x0; x1 -= x0;
  112.                     y1 += y0; y0 = y1 - y0; y1 -= y0;
  113.                 }
  114.                 //Относительное изменение координаты Y
  115.                 float grad = (float)dy / dx;
  116.                 //Промежуточная переменная для Y
  117.                 float intery = y0 + grad;
  118.                 //Первая точка
  119.                 PutPixel(g, clr, x0, y0, 255);
  120.  
  121.                 for (int x = x0 + 1; x < x1; x++)
  122.                 {
  123.                     //Верхняя точка
  124.                     PutPixel(g, clr, x, IPart(intery), (int)(255 - FPart(intery) * 255));
  125.                     //Нижняя точка
  126.                     PutPixel(g, clr, x, IPart(intery) + 1, (int)(FPart(intery) * 255));
  127.                     //Изменение координаты Y
  128.                     intery += grad;
  129.                 }
  130.                 //Последняя точка
  131.                 PutPixel(g, clr, x1, y1, 255);
  132.             }
  133.             //Для Y-линии (коэффициент наклона > 1)
  134.             else
  135.             {
  136.                 //Первая точка должна иметь меньшую координату Y
  137.                 if (y1 < y0)
  138.                 {
  139.                     x1 += x0; x0 = x1 - x0; x1 -= x0;
  140.                     y1 += y0; y0 = y1 - y0; y1 -= y0;
  141.                 }
  142.                 //Относительное изменение координаты X
  143.                 float grad = (float)dx / dy;
  144.                 //Промежуточная переменная для X
  145.                 float interx = x0 + grad;
  146.                 //Первая точка
  147.                 PutPixel(g, clr, x0, y0, 255);
  148.  
  149.                 for (int y = y0 + 1; y < y1; y++)
  150.                 {
  151.                     //Верхняя точка
  152.                     PutPixel(g, clr, IPart(interx), y, 255 - (int)(FPart(interx) * 255));
  153.                     //Нижняя точка
  154.                     PutPixel(g, clr, IPart(interx) + 1, y, (int)(FPart(interx) * 255));
  155.                     //Изменение координаты X
  156.                     interx += grad;
  157.                 }
  158.                 //Последняя точка
  159.                 PutPixel(g, clr, x1, y1, 255);
  160.             }
  161.         }
  162.  
  163.        
  164.  
  165.         //Статический метод, реализующий отрисовку 8-связной линии по алгоритму Брезенхема
  166.         static public void Bresenham8Line(Graphics g, Color clr, int x0, int y0, int x1, int y1)
  167.         {
  168.             //Изменения координат
  169.             int dx = (x1 > x0) ? (x1 - x0) : (x0 - x1);
  170.             int dy = (y1 > y0) ? (y1 - y0) : (y0 - y1);
  171.             //Направление приращения
  172.             int sx = (x1 >= x0) ? (1) : (-1);
  173.             int sy = (y1 >= y0) ? (1) : (-1);
  174.  
  175.             if (dy < dx)
  176.             {
  177.                 int d = (dy << 1) - dx;
  178.                 int d1 = dy << 1;
  179.                 int d2 = (dy - dx) << 1;
  180.                 PutPixel(g, clr, x0, y0, 255);
  181.                 int x = x0 + sx;
  182.                 int y = y0;
  183.                 for (int i = 1; i <= dx; i++)
  184.                 {
  185.                     if (d > 0)
  186.                     {
  187.                         d += d2;
  188.                         y += sy;
  189.                     }
  190.                     else
  191.                         d += d1;
  192.                     PutPixel(g, clr, x, y, 255);
  193.                     x++;
  194.                 }
  195.             }
  196.             else
  197.             {
  198.                 int d = (dx << 1) - dy;
  199.                 int d1 = dx << 1;
  200.                 int d2 = (dx - dy) << 1;
  201.                 PutPixel(g, clr, x0, y0, 255);
  202.                 int x = x0;
  203.                 int y = y0 + sy;
  204.                 for (int i = 1; i <= dy; i++)
  205.                 {
  206.                     if (d > 0)
  207.                     {
  208.                         d += d2;
  209.                         x += sx;
  210.                     }
  211.                     else
  212.                         d += d1;
  213.                     PutPixel(g, clr, x, y, 255);
  214.                     y++;
  215.                 }
  216.             }
  217.         }
  218.         //Статический метод, реализующий отрисовку 4-связной линии по алгоритму Брезенхема
  219.         public static void Bresenham4Line(Graphics g, Color clr, int x0, int y0, int x1, int y1)
  220.         {
  221.             int dx = x1 - x0;
  222.             int dy = y1 - y0;
  223.             int d = 0;
  224.             int d1 = dy << 1;
  225.             int d2 = -(dx << 1);
  226.             PutPixel(g, clr, x0, y0, 255);
  227.             int x = x0;
  228.             int y = y0;
  229.  
  230.             for (int i = 1; i <= dx + dy; i++)
  231.             {
  232.                 if (d > 0)
  233.                 {
  234.                     d += d2;
  235.                     y++;
  236.                 }
  237.                 else
  238.                 {
  239.                     d += d1;
  240.                     x++;
  241.                 }
  242.                 PutPixel(g, clr, x, y, 255);
  243.             }
  244.         }
  245.         //Статический метод, реализующий отрисовку окружности по алгоритму Брезенхема
  246.         public static void BresenhamCircle(Graphics g, Color clr, int _x, int _y, int radius)
  247.         {
  248.             int x = 0, y = radius, gap = 0, delta = (2 - 2 * radius);
  249.             while (y >= 0)
  250.             {
  251.                 PutPixel(g, clr, _x + x, _y + y, 255);
  252.                 PutPixel(g, clr, _x + x, _y - y, 255);
  253.                 PutPixel(g, clr, _x - x, _y - y, 255);
  254.                 PutPixel(g, clr, _x - x, _y + y, 255);
  255.                 gap = 2 * (delta + y) - 1;
  256.                 if (delta < 0 && gap <= 0)
  257.                 {
  258.                     x++;
  259.                     delta += 2 * x + 1;
  260.                     continue;
  261.                 }
  262.                 if (delta > 0 && gap > 0)
  263.                 {
  264.                     y--;
  265.                     delta -= 2 * y + 1;
  266.                     continue;
  267.                 }
  268.                 x++;
  269.                 delta += 2 * (x - y);
  270.                 y--;
  271.             }
  272.         }
  273.         //Метод, устанавливающий пиксел на форме с заданными цветом и прозрачностью
  274.         private static void PutPixel(Graphics g, Color col, int x, int y, int alpha)
  275.         {
  276.             g.FillRectangle(new SolidBrush(Color.FromArgb(alpha, col)), x, y, 1, 1);
  277.         }
  278.         //Целая часть числа
  279.         private static int IPart(float x)
  280.         {
  281.             return (int)x;
  282.         }
  283.         //дробная часть числа
  284.         private static float FPart(float x)
  285.         {
  286.             while (x >= 0)
  287.                 x--;
  288.             x++;
  289.             return x;
  290.         }
  291.     }
  292. }
  293.  
  294.  
  295. //file Form1.Designer.cs
  296.  
  297. namespace RasterAlgorithms
  298. {
  299.     partial class Form1
  300.     {
  301.         /// <summary>
  302.         /// Required designer variable.
  303.         /// </summary>
  304.         private System.ComponentModel.IContainer components = null;
  305.  
  306.         /// <summary>
  307.         /// Clean up any resources being used.
  308.         /// </summary>
  309.         /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
  310.         protected override void Dispose(bool disposing)
  311.         {
  312.             if (disposing && (components != null))
  313.             {
  314.                 components.Dispose();
  315.             }
  316.             base.Dispose(disposing);
  317.         }
  318.  
  319.         #region Windows Form Designer generated code
  320.  
  321.         /// <summary>
  322.         /// Required method for Designer support - do not modify
  323.         /// the contents of this method with the code editor.
  324.         /// </summary>
  325.         private void InitializeComponent()
  326.         {
  327.             this.menuStrip1 = new System.Windows.Forms.MenuStrip();
  328.             this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
  329.             this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem();
  330.             this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem();
  331.             this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem();
  332.             this.menuStrip1.SuspendLayout();
  333.             this.SuspendLayout();
  334.             //
  335.             // menuStrip1
  336.             //
  337.             this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
  338.             this.toolStripMenuItem1,
  339.             this.toolStripMenuItem3});
  340.             this.menuStrip1.Location = new System.Drawing.Point(0, 0);
  341.             this.menuStrip1.Name = "menuStrip1";
  342.             this.menuStrip1.Size = new System.Drawing.Size(784, 24);
  343.             this.menuStrip1.TabIndex = 1;
  344.             this.menuStrip1.Text = "menuStrip1";
  345.             //
  346.             // toolStripMenuItem1
  347.             //
  348.             this.toolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
  349.             this.toolStripMenuItem2});
  350.             this.toolStripMenuItem1.Name = "toolStripMenuItem1";
  351.             this.toolStripMenuItem1.Size = new System.Drawing.Size(37, 20);
  352.             this.toolStripMenuItem1.Text = "File";
  353.             //
  354.             // toolStripMenuItem2
  355.             //
  356.             this.toolStripMenuItem2.Name = "toolStripMenuItem2";
  357.             this.toolStripMenuItem2.Size = new System.Drawing.Size(152, 22);
  358.             this.toolStripMenuItem2.Text = "Exit";
  359.             this.toolStripMenuItem2.Click += new System.EventHandler(this.toolStripMenuItem2_Click);
  360.             //
  361.             // toolStripMenuItem3
  362.             //
  363.             this.toolStripMenuItem3.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
  364.             this.toolStripMenuItem4});
  365.             this.toolStripMenuItem3.Name = "toolStripMenuItem3";
  366.             this.toolStripMenuItem3.Size = new System.Drawing.Size(44, 20);
  367.             this.toolStripMenuItem3.Text = "Help";
  368.             //
  369.             // toolStripMenuItem4
  370.             //
  371.             this.toolStripMenuItem4.Name = "toolStripMenuItem4";
  372.             this.toolStripMenuItem4.Size = new System.Drawing.Size(152, 22);
  373.             this.toolStripMenuItem4.Text = "Help";
  374.             this.toolStripMenuItem4.Click += new System.EventHandler(this.toolStripMenuItem4_Click);
  375.             //
  376.             // Form1
  377.             //
  378.             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
  379.             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
  380.             this.ClientSize = new System.Drawing.Size(784, 562);
  381.             this.Controls.Add(this.menuStrip1);
  382.             this.MainMenuStrip = this.menuStrip1;
  383.             this.Name = "Алгоритм Брезенхема Бпм11-01";
  384.             this.Text = "Алгоритм Брезенхема Бпм11-01";
  385.             this.menuStrip1.ResumeLayout(false);
  386.             this.menuStrip1.PerformLayout();
  387.             this.ResumeLayout(false);
  388.             this.PerformLayout();
  389.  
  390.         }
  391.  
  392.         #endregion
  393.  
  394.         private System.Windows.Forms.MenuStrip menuStrip1;
  395.         private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1;
  396.         private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2;
  397.         private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem3;
  398.         private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem4;
  399.     }
  400. }

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


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

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

11   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы