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); } }