private void Circul int int int int int col row col перемещение по row

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
private void Circul(int x, int y, int a, int b)
{
int col = 0, row = 0; // col - перемещение по х, row - перемещение по у.
int a_square, b_square, two_a_square, two_b_square, four_a_square, four_b_square, d;
Graphics g = Graphics.FromHwnd(this.Handle);// объявление графической переменной, которая будет рисовать на форме
Pen Brush = new Pen(new SolidBrush(Color.Blue), 2f); // создание ручки
b_square = b * b; // подсчет площади квадрата для радиуса б
a_square = a * a; // подсчет площади квадрата для радиуса а
row = b; // самая первая
col = 0; // точка - (0, r)
two_a_square = a_square << 1; // подсчет 2х площадей а
four_a_square = a_square << 2; // подсчет 4х площадей а
four_b_square = b_square << 2; // подсчет 4х площадей б
two_b_square = b_square << 1; // подсчет 2х площадей б
d = two_a_square * ((row - 1) * (row)) + a_square + two_b_square * (1 - a_square); // магическая формула.
// нашел где-то в интернете
while (a_square * (row) > b_square * (col)) // до тех пор, пока мы не перешли до перехода из радиуса а в радиус б
// помнишь, я тебе рассказывал в среду тот переход на графике? Вот тут именно он.
{
g.DrawRectangle(Brush, col + x, row + y, 1, 1);// рисуем
g.DrawRectangle(Brush, col + x, y - row, 1, 1);// по всем
g.DrawRectangle(Brush, x - col, row + y, 1, 1);// четырем
g.DrawRectangle(Brush, x - col, y - row, 1, 1);// направлениям
if (d >= 0)
{
row--;
d -= four_a_square * (row);
} // если выполняется условие, то уменьшаем координату У, она тут подразумевается под row. Затем уменьшаем
// нашу формулу на один шаг.
// ---------------------//
d += two_b_square * (3 + (col << 1)); // в любом случае прибавляем к Х
col++; // под Х здесь подразумевается col. Увелчиваем значение формулы на значение. Почему именно такое значение везде?
// Потому что эта разница на которую изменяется наша д на каждом шагу. Это объяснение актуально для любого изменения
// формулы d.
}
d = two_b_square * (col + 1) * col + two_a_square * (row * (row - 2) + 1) + (1 - two_a_square) * b_square;
// новая формула для случая, когда мы "перевалили" за гранцу перехода из зоны радиуса б, в зону радиуса а.
// как - то криво звучит, но, я надеюсь, ты вспомнишь тот график, на котором я пояснял тебе переход этот.
while (((row) + 1) > 0) // условие, когда мы в зоне радиуса а.
{
g.DrawRectangle(Brush, col + x, row + y, 1, 1); // рисуем
g.DrawRectangle(Brush, col + x, y - row, 1, 1); // во всех
g.DrawRectangle(Brush, x - col, row + y, 1, 1); // четырех
g.DrawRectangle(Brush, x - col, y - row, 1, 1); // направлениях
if (d <= 0)
{
col++;
d += four_b_square * col;
} // если выполняет условие, то продвигаемся по Х, увеличиваем значение формулы
row--; // в любом случае, спускаемся по У на единицу и изменяем значение формулы
d += two_a_square * (3 - (row << 1));
}
}