Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 17.06.2018
Сообщений: 5
1

Попиксельно закрасить окружность

17.06.2018, 19:18. Показов 1049. Ответов 14
Метки нет (Все метки)

Помогите , нужно попиксельно закрасить окружность через кнопку button4_Click

C#
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Graphics g = pictureBox1.CreateGraphics();
            int x1 = int.Parse(textBox1.Text), y1 = int.Parse(textBox2.Text), x2 = int.Parse(textBox3.Text), y2 = int.Parse(textBox4.Text);
            int d, i = 1;
            if (Math.Abs(x2 - x1) >= Math.Abs(y2 - y1)) d = Math.Abs(x2 - x1); else d = Math.Abs(y2 - y1);
            double dx = (x2 - x1) / (double)d, dy = (y2 - y1) / (double)d;
            double x = x1 + 0.5 * Math.Sign(dx), y = y1 + 0.5 * Math.Sign(dy);
            while (i <= d)
        {
                g.FillRectangle(Brushes.Black, (int)x, (int)y, 1, 1);
                x += dx;
                y += dy;
                i++;
        }
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            Graphics g = pictureBox1.CreateGraphics();
            int x1 = int.Parse(textBox1.Text), y1 = int.Parse(textBox2.Text), x2 = int.Parse(textBox3.Text), y2 = int.Parse(textBox4.Text);
            int x = x1, y = y1;
            int dx = Math.Abs(x2 - x1), dy = Math.Abs(y2 - y1);
            int s1 = Math.Sign(x2 - x1), s2 = Math.Sign(y2 - y1), obmen, t;
            if (dy > dx)
        {
                t = dx;
                dx = dy;
                dy = t;
                obmen = 1;
        }
            else obmen = 0;
            int ee = 2 * dy - dx;
            for (int i = 1; i <= dx; i++)
        {
                g.FillRectangle(Brushes.Black, x, y, 1, 1);
                while (ee >= 0)
        {
                    if (obmen == 1) x += s1; else y += s2;
                    ee -= 2 * dx;
        }
                if (obmen == 1) y += s2; else x += s1;
                ee += 2 * dy;
        }
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            Graphics g = pictureBox1.CreateGraphics();
            int x = int.Parse(textBox1.Text);
            int y = int.Parse(textBox2.Text);
            int R = int.Parse(textBox5.Text);
            int Xi = 0, Yi = R, d = 2 * (1 - R), s;
 
            while (Yi > 0)
        {
                g.FillRectangle(Brushes.Blue, (x + Xi), (y + Yi), 3, 3);
                g.FillRectangle(Brushes.Blue, (x + Xi), (y - Yi), 3, 3);
                g.FillRectangle(Brushes.Blue, (x - Xi), (y + Yi), 3, 3);
                g.FillRectangle(Brushes.Blue, (x - Xi), (y - Yi), 3, 3);
                if (d < 0)
        {
                    s = 2 * d + 2 * Yi - 1;
                    if (s <= 0)
        {
                        Xi += 1;
                        d += 2 * Xi + 1;
        }
                    else
        {
                        Xi += 1;
                        Yi -= 1;
                        d += 2 * Xi - 2 * Yi + 2;
        }
 
        }
                if (d > 0)
        {
                    s = 2 * d - 2 * Xi - 1;
                    if (s <= 0)
        {
                        Xi += 1;
                        Yi -= 1;
                        d += 2 * Xi - 2 * Yi + 2;
 
        }
                    else
        {
                        Yi -= 1;
                        d -= 2 * Yi + 1;
 
        }
 
        }
                if (d == 0)
        {
                    Xi += 1;
                    Yi += 1;
                    d += 2 * Xi - 2 * Yi + 2;
 
        }
 
        }
        }
 
        private void button5_Click(object sender, EventArgs e)
        {
            Graphics g = pictureBox1.CreateGraphics();
            g.Clear(Color.White); 
        }
         
        private void button4_Click(object sender, EventArgs e)
        {
           
        }
    }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.06.2018, 19:18
Ответы с готовыми решениями:

Загрузка изображения попиксельно
Нужно чтобы по нажатию Button1 открывалось окно для выбора файла изображения, а после выбора файла...

Как попиксельно создать изображение?
Я делаю скриншот экрана при помощи Bitmap. Получаю изображение. var image = ImageProp(); Bitmap...

Как быстро, попиксельно, прорисовать .bmp
Доброе время суток! Вот, набрел на такую задачку. Framework 2.0. Есть байтовая матрица 1728 X...

Необходимо попиксельно нарисовать графики ctg и tg в PictireBox
Необходимо попиксельно нарисовать графики ctg и tg.. У меня такой вопрос - как обойти точки...

14
547 / 470 / 314
Регистрация: 24.09.2013
Сообщений: 3,318
Записей в блоге: 1
17.06.2018, 19:25 2
Расшифруйте, как производить окраску?
1
0 / 0 / 0
Регистрация: 17.06.2018
Сообщений: 5
17.06.2018, 19:43  [ТС] 3
Нужно чтобы по клику на button рисовалась окружность и попиксельно через очередь закрашивалась, препод не вдавался в подробности
0
547 / 470 / 314
Регистрация: 24.09.2013
Сообщений: 3,318
Записей в блоге: 1
18.06.2018, 00:07 4
Не поинтересовались, тогда ждите.
0
180 / 143 / 94
Регистрация: 30.07.2013
Сообщений: 575
18.06.2018, 09:55 5
Куаныш1998,

ниже пример с попиксельной отрисовкой в событии onPaint.
Разбирайтесь и переписывайте на кнопку самостоятельно

C#
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
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
 
namespace Куаныш1998
{
    public partial class Form1 : Form
    {
 
        PointF center = new PointF(200, 200);
        float radius = 100;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics graphics = e.Graphics;
            graphics.DrawPolygon(Pens.SlateBlue, GetCirclePoints(center, radius).ToArray());
            PointF Xmirror;
            foreach (PointF point in GetCirclePoints(center, radius))
            {
                try
                {
                    Xmirror = GetCirclePoints(center, radius).Where(x => x.Y == point.Y && x.X != point.X).First();// для каждой точки окружности ищем зеркальную точку
                    for (float x = point.X; x <= Xmirror.X; x++)
                    {
                        graphics.DrawRectangle(Pens.SlateBlue, new Rectangle(new Point((int)x, (int)point.Y), new Size(1, 1))); // заполняем пространство между точкой и зеркальной точкой квадратами размером в 1 пиксель
                    }
                }
                catch { }
            }
        }
 
        /// <summary>
        /// Получение точек, принадлежащих окружности
        /// </summary>
        /// <returns></returns>
        private IEnumerable<PointF> GetCirclePoints(PointF center, float radius)
        {
            for (int fi = 0; fi < 360; fi++)
            {
                yield return new PointF(center.X + radius * (float)Math.Cos(fi * Math.PI / 180), center.Y + radius * (float)Math.Sin(fi * Math.PI / 180));
            }
        }
    }
}
0
547 / 470 / 314
Регистрация: 24.09.2013
Сообщений: 3,318
Записей в блоге: 1
18.06.2018, 10:25 6
Думаю, тут попиксельной окраски нет, принят один цвет.
Кстати, в конструкторе нужно дописать условие, чтобы открылась Form_Paint
1
180 / 143 / 94
Регистрация: 30.07.2013
Сообщений: 575
18.06.2018, 10:40 7
zna926,

Не по теме:

Я художник, я так вижу :p



Поскольку ТС не уточнил что же такое попиксельная окраска, то я предположил что его преподаватель имел в виду, что требуется закрасить не используя Graphics.Fillxxx, а закрашивая каждый пиксель внутри окружности вручную
1
547 / 470 / 314
Регистрация: 24.09.2013
Сообщений: 3,318
Записей в блоге: 1
18.06.2018, 16:17 8
meridbt, я использовал массив цветов (50) и, можно сказать, буквально окрасил окружность
0
0 / 0 / 0
Регистрация: 17.06.2018
Сообщений: 5
18.06.2018, 17:12  [ТС] 9
Спасибо огромное, помогли очень)
0
180 / 143 / 94
Регистрация: 30.07.2013
Сообщений: 575
18.06.2018, 17:16 10
zna926, а была ли задача использовать 50 цветов? И почему именно 50, а не, скажем, 256 млн?
1
0 / 0 / 0
Регистрация: 17.06.2018
Сообщений: 5
18.06.2018, 17:32  [ТС] 11
Через час скину точное описание задачи
0
547 / 470 / 314
Регистрация: 24.09.2013
Сообщений: 3,318
Записей в блоге: 1
18.06.2018, 18:14 12
meridbt,
1. Не знаете элеметарных вещей. Количество цветов - всего15777216 (256^3)
2. Полагаю, что попиксельная окраска(в смысле разнообразия) более подходит, чем монотонная
1
254 / 155 / 20
Регистрация: 01.06.2018
Сообщений: 1,968
19.06.2018, 11:45 13
Цитата Сообщение от zna926 Посмотреть сообщение
Количество цветов - всего15777216 (256^3)
микроисправление 16777216

Добавлено через 5 часов 2 минуты
Гугл+15 минут: (рабочая проверенная версия, алгоритм Брезенхэма)
C#
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
using System;
using System.Drawing;
using System.Windows.Forms;
 
namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public static int R, delta, error, X, Y, x0, y0;
        private void Form1_Click(object sender, EventArgs e)
        {
            Graphics g = CreateGraphics();
            R = (int)(ClientSize.Height / 2);
            x0 = R; y0 = R; X = 0; Y = R;
            delta = 1 - R * 2;
            error = 0;
            while (Y >= 0)
            {
                for (int XX = x0 - X; XX <= x0 + X; XX++)
                {
                    g.FillRectangle(new SolidBrush(Color.FromArgb(255, Color.Black)), XX, y0 + Y, 1, 1);
                    g.FillRectangle(new SolidBrush(Color.FromArgb(255, Color.Black)), XX, y0 - Y, 1, 1);
                }
                error = 2 * (delta + Y) - 1;
                if ((delta < 0) && (error <= 0))
                {
                    delta += 2 * ++X + 1;
                    continue;
                }
                if ((delta > 0) && (error > 0))
                {
                    delta -= 2 * --Y + 1;
                    continue;
                }
                delta += 2 * (++X - Y--);
            }
            g.Dispose();
        }
 
        public Form1()
        {
            InitializeComponent();
            ClientSize = new Size(300, 300);
        }
    }
}
можно чуток оптимизировать, например Brush вынести за цикл и создавать единожды. Вероятно нет смысла делать Dispose.

Добавлено через 8 минут
Кстати в википедии была ошибка, получалась странная фигура ))) потом на других ресурсах увидел где именно ошибка, вики отредактировал, может быть исправления примут.

Добавлено через 38 минут
немного переделал, читаемость стала хуже, имхо, но я люблю так упрессовывать код:
C#
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
using System;
using System.Drawing;
using System.Windows.Forms;
 
namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public static int R, delta, error, X, Y, x0, y0;
        private void Form1_Click(object sender, EventArgs e)
        {
            Graphics g = CreateGraphics();
            Brush aBrush = new SolidBrush(Color.FromArgb(255, Color.Black));
            g.Clear(DefaultBackColor);
            R = (int)(ClientSize.Height / 2);
            x0 = y0 = Y = R;
            delta = 1 - R * 2;
            error = X = 0;
            while (Y >= 0)
            {
                for (int XX = x0 - X; XX <= x0 + X; XX++)
                {
                    g.FillRectangle(aBrush, XX, y0 + Y, 1, 1);
                    g.FillRectangle(aBrush, XX, y0 - Y, 1, 1);
                }
                error = 2 * (delta + Y) - 1;
                if ((delta < 0) && (error <= 0))
                {
                    delta += 2 * ++X + 1;
                    continue;
                }
                delta = ((delta > 0) && (error > 0)) ? delta - 2 * --Y + 1 : delta + 2 * (++X - Y--);
            }
        }
 
        public Form1()
        {
            InitializeComponent();
            ClientSize = new Size(300, 300);
        }
    }
}
Добавлено через 4 минуты
можно еще вот так сделать, но там лишние проверки будут, но смотрится красиво:
C#
1
2
3
4
5
6
7
8
9
10
while (Y >= 0)
{
    for (int XX = x0 - X; XX <= x0 + X; XX++)
    {
        g.FillRectangle(aBrush, XX, y0 + Y, 1, 1);
        g.FillRectangle(aBrush, XX, y0 - Y, 1, 1);
    }
    error = 2 * (delta + Y) - 1;
    delta = ((delta < 0) && (error <= 0)) ? delta + 2 * ++X + 1 : delta = ((delta > 0) && (error > 0)) ? delta - 2 * --Y + 1 : delta + 2 * (++X - Y--);
}
или так:
C#
1
2
3
4
5
            while (Y >= 0) {
                for (int XX = x0 - X; XX <= x0 + X; XX++)
                { g.FillRectangle(aBrush, XX, y0 + Y, 1, 1); g.FillRectangle(aBrush, XX, y0 - Y, 1, 1); }
                error = 2 * (delta + Y) - 1;
                delta = ((delta < 0) && (error <= 0)) ? delta + 2 * ++X + 1 : delta = ((delta > 0) && (error > 0)) ? delta - 2 * --Y + 1 : delta + 2 * (++X - Y--); }
1
0 / 0 / 0
Регистрация: 17.06.2018
Сообщений: 5
19.06.2018, 13:48  [ТС] 14
Все, спасибо за помощь,вопрос закрыт)
0
254 / 155 / 20
Регистрация: 01.06.2018
Сообщений: 1,968
20.06.2018, 05:26 15
Интересно было проверить время отрисовки разными способами, я взял три способа FillRectangle как прямоугольник, его же как линию и DrawLine. Получился вот такой код для каждого из способов:
1) DrawLine = 53 мс
C#
1
2
                g.DrawLine(pen, x0 - X, y0 - Y, x0 + X, y0 - Y);
                g.DrawLine(pen, x0 - X, y0 + Y, x0 + X, y0 + Y);
2) FillRectangle линия = 4 мс
C#
1
2
                g.FillRectangle(aBrush, x0 - X, y0 - Y, (x0 + X) - (x0 - X), 1);
                g.FillRectangle(aBrush, x0 - X, y0 + Y, (x0 + X) - (x0 - X), 1);
3) FilleRectangle прямоугольник = 1 мс
C#
1
                g.FillRectangle(aBrush, x0 - X, y0 - Y, (x0 + X) - (x0 - X), (y0 + Y) - (y0 - Y));
Отсюда вопрос: реализация DrawLine в C# хуже реализации вырожденного прямоугольника в FillRectangle аж в 13 раз? А учитывая сколько раз перерисовывается в третьем варианте одно и то же ради пары пикселей, то странно и за второй способ реализации. Или я где-то ошибся?

Добавлено через 8 минут
Интересно, сделал так:
C#
1
                g.DrawRectangle(pen, x0 - X, y0 - Y, (x0 + X) - (x0 - X), (y0 + Y) - (y0 - Y));
И стало 73 мс. Может дело в аппаратном ускорении?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.06.2018, 05:26

цикл работает неправильно, не получается закрасить окружность попиксельно C#
Добрый день! Помогите пожалуйста с решением проблемы, не пойму, что я делаю не правильно...Вобщем я...

Закрасить окружность
Помогите закрасить таким образом... #include&lt;conio.h&gt; #include&lt;graphics.h&gt; using namespace...

Требуется закрасить окружность
Требуется в задаче приведённой ниже закрасить окружность... Задача состоит из 2 модулей: Файл...

Получить окружность и целиком закрасить цветом часть экрана,покрывающуюся кругами,ограниченными этими окружностями.
получить окружность и целиком закрасить цветом часть экрана,покрывающуюся кругами,ограниченными...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.