Среда программирования:
Microsoft Visual C# 2010 Express
Статья по теме:
Провести прямую линию между двумя точками, заданными своими координатами. Использовать растровый алгоритм Брезенхэма.
Алгоритм основан на том, что для каждой точки растра существует ровно 4 соседних точки. Это означает, что две соседние точки могут отличаться друг от друга только по одной координате и только на 1 единицу. Т. е. для точки (x, y) соседними являются точки (x+1, y), (x-1, y), (x, y+1), (x, y-1). Точка (x+1, y+1) может оказаться закрашенной только если закрашена точка (x+1, y) или (x, y+1). Алгоритм Брезенхема модифицированный по такому закону реализован в данной программе.
Код программы:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } //Метод, устанавливающий пиксел на форме с заданными цветом и прозрачностью 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); } //Статический метод, реализующий отрисовку 4-связной линии static public void Bresenham4Line(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+=sx; } } 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+=sy; } } } private void button1_Click(object sender, EventArgs e) { Graphics g = pictureBox1.CreateGraphics(); Bresenham4Line(g, Color.Black, 10, 34, pictureBox1.ClientSize.Width - 10, pictureBox1.ClientSize.Height - 10); } } }
Прикрепленный файл | Размер |
---|---|
Алгоритм Брезенхэма (пример) | 4.17 кб |
Алгоритм Брезенхэма (исходный код) | 42 кб |