Ejemplo n.º 1
0
        private void FirstPart(Graphics g, int x, int y, int a, int b, double start, double end, bool pieStart, bool pieEnd)
        {
            double start2 = start;

            start = (start * Math.PI) / 180;
            end   = (end * Math.PI) / 180;
            int start_x = Math.Abs((int)(a * Math.Cos(end)));    // Компонента x
            int start_y = Math.Abs((int)(b * Math.Sin(end)));;   // Компонента y
            int end_x   = Math.Abs((int)(a * Math.Cos(start)));  // Компонента x конца
            int end_y   = Math.Abs((int)(b * Math.Sin(start)));; // Компонента y конца
            int _y      = start_y;
            int _x      = start_x;
            int a_sqr   = a * a;                                                                                         // a^2, a - большая полуось
            int b_sqr   = b * b;                                                                                         // b^2, b - малая полуось
            int delta   = 4 * b_sqr * ((_x + 1) * (_x + 1)) + a_sqr * ((2 * _y - 1) * (2 * _y - 1)) - 4 * a_sqr * b_sqr; // Функция координат точки (x+1, y-1/2)

            if (pieEnd)
            {
                //bitmap = Line.Bresenham(bitmap, x + _x, y + _y, x, y, color);
                Line.Newline(g, x + _x, y + _y, x, y, color);
            }


            //серединная точка при выборе пикселей
            while (a_sqr * (2 * _y - 1) > 2 * b_sqr * (_x + 1)) // Первая часть дуги
            {
                // рисуем
                if (((x + _x) >= 0) && ((y + _y) >= 0) && ((x + _x) < _weight) && ((y + _y) < _height))
                {
                    g.FillRectangle(new SolidBrush(color), x + _x, y + _y, 1, 1);
                    //bitmap.SetPixel(x + _x, y + _y, color);//1
                }
                if ((((_y - end_y) > 0) && ((_y - end_y) < 7)) && (((end_x - _x) > 0) && ((end_x - _x) < 7))) //условие выхода
                {
                    if (pieStart)
                    {
                        int dy = 0;
                        if (start2 != 0)
                        {
                            dy = _y;
                        }
                        //bitmap = Line.Bresenham(bitmap, x + _x, y + _y, x, y, color);
                        Line.Newline(g, x + _x, y + dy, x, y, color);
                        break;
                    }
                }

                if (delta < 0) // Переход по горизонтали
                {
                    _x++;
                    delta += 4 * b_sqr * (2 * _x + 3);
                }
                else // Переход по диагонали
                {
                    _x++;
                    delta = delta - 8 * a_sqr * (_y - 1) + 4 * b_sqr * (2 * _x + 3);
                    _y--;
                }
            }

            delta = b_sqr * ((2 * _x + 1) * (2 * _x + 1)) + 4 * a_sqr * ((_y + 1) * (_y + 1)) - 4 * a_sqr * b_sqr; // Функция координат точки (x+1/2, y-1)

            while (_y + 1 != 0)                                                                                    // Вторая часть дуги, если не выполняется условие первого цикла, значит выполняется a^2(2y - 1) <= 2b^2(x + 1)
            {
                if (((x + _x) >= 0) && ((y + _y) >= 0) && ((x + _x) < _weight) && ((y + _y) < _height))
                {
                    g.FillRectangle(new SolidBrush(color), x + _x, y + _y, 1, 1);
                    //bitmap.SetPixel(x + _x, y + _y, color);//1
                }

                if ((((_y - end_y) > 0) && ((_y - end_y) < 7)) && (((end_x - _x) > 0) && ((end_x - _x) < 7))) //условие выхода
                {
                    if (pieStart)
                    {
                        int dy = 0;
                        if (start2 != 0)
                        {
                            dy = _y;
                        }
                        Line.Newline(g, x + _x, y + dy, x, y, color);
                        break;
                    }
                }
                if (delta < 0) // Переход по вертикали
                {
                    _y--;
                    delta += 4 * a_sqr * (2 * _y + 3);
                }
                else // Переход по диагонали
                {
                    _y--;
                    delta += (-8 * b_sqr * (_x + 1) + 4 * a_sqr * (2 * _y + 3));
                    _x++;
                }
            }
            if (pieStart)
            {
                int dy = 0;
                if (start2 != 0)
                {
                    dy = _y;
                }
                Line.Newline(g, x + _x, y + dy, x, y, color);
            }
        }