Алгоритм Брезенхема для прямой и окружности

алгоритм немного недоделанный
прямая пока может быть задана только под определенным углом
/
будет допилено и исправлено (готовую задачу не нашел, а переписывать сейчас влом)


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);
                }
            }
        }
        ///////////////////       
    }
}
vedro-compota's picture

алгоритм брезенхема

особенно в заголовке можно написать так:

Алгоритм Брезенхема

Спасибо за вклад)

_____________
матфак вгу и остальная классика =)