Алгоритм Брезенхема для прямой и окружности
Primary tabs
Forums:
алгоритм немного недоделанный
прямая пока может быть задана только под определенным углом
/
будет допилено и исправлено (готовую задачу не нашел, а переписывать сейчас влом)
namespace WFA2
{
public partial class Form1 : Form
{
static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
private Graphics g;
public Form1()
{
InitializeComponent();
Paint += new PaintEventHandler(Form1_Paint);
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
g = this.CreateGraphics();
BresenhamCircle(200, 200, 70);
// тут задаются координаты начальной точки и радиуса круга
draw_br_line2(100, 100, 400, 140);
// тут задаются две точки меджу которыми рисуется брезенхемовская прямая
}
private void Form1_Load(object sender, EventArgs e)
{
}
void draw_br_line2(int x0, int y0, int x1, int y1) // линия
{
Brush b1 = new SolidBrush(Color.Black);
// g.FillRectangle(b1, 250, 260, 2, 2);
int x = x0, y = y0, i = x0;
double Dy = 0, Dx = 0, D = 0, X = x0, Y = y0;
g.FillRectangle(b1, x0, y0, 4, 4);
// жирный квадратик - начальная точка (для удобства)
while (x < x1)
{
g.FillRectangle(b1, x, y, 2, 2);
Y = (y1 - y0) * (X - x0) / (x1 - x0) + y0;
Dy = Y - y;
if (Dy > 0.5)
{
y++;
}
if (x0 < x1)
{
x++;
}
if (x0 > x1)
{
x--;
}
X = x;
}
while (x > x1)
{
g.FillRectangle(b1, x, y, 2, 2);
Y = (y1 - y0) * (X - x0) / (x1 - x0) + y0;
Dy = Y - y;
if (Dy > 0.5)
{
y++;
}
if (x0 > x1)
{
x--;
}
X = x;
}
}
//......................
void BresenhamCircle(int x0, int y0, int radius) // круг
{
Brush b1 = new SolidBrush(Color.Black);
int x = radius;
int y = 0;
int radiusError = 1 - x;
g.FillRectangle(b1, x0, y0, 4, 4);
while (x >= y)
{
g.FillRectangle(b1, x + x0, y + y0, 2, 2);
g.FillRectangle(b1, y + x0, x + y0, 2, 2);
g.FillRectangle(b1, -x + x0, y + y0, 2, 2);
g.FillRectangle(b1, -y + x0, x + y0, 2, 2);
g.FillRectangle(b1, -x + x0, -y + y0, 2, 2);
g.FillRectangle(b1, -y + x0, -x + y0, 2, 2);
g.FillRectangle(b1, x + x0, -y + y0, 2, 2);
g.FillRectangle(b1, y + x0, -x + y0, 2, 2);
y++;
if (radiusError < 0)
{
radiusError += 2 * y + 1;
}
else
{
x--;
radiusError += 2 * (y - x + 1);
}
}
}
///////////////////
}
}
- Log in to post comments
- 13671 reads
vedro-compota
Wed, 01/29/2014 - 11:48
Permalink
алгоритм брезенхема
особенно в заголовке можно написать так:
Спасибо за вклад)
_____________
матфак вгу и остальная классика =)