Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/40: Рейтинг темы: голосов - 40, средняя оценка - 4.60
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116

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

16.03.2014, 11:44. Показов 8214. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
помогите разобраться с этим алгоритмом, перечитал много сайтов, но че то никак не врублюсь, вот как этот коэфициент отклонения высчитывать? вообще пиксель он же как бы мельчайшая точка и как линия может проходить через пиксель если меньше пикселя ничего нет? о_О

Добавлено через 7 минут
з.ы. например вот что написано об этом в википедии: http://ru.wikipedia.org/wiki/Алгоритм_Брезенхэма
но че то там так все запутано...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.03.2014, 11:44
Ответы с готовыми решениями:

Алгоритм Брезенхема для 3-х координат
есть алгоритм Брезенхема для построения прямой по двум координатам, а я хочу сделать по трём координатам( x y z ) "графическое...

Алгоритм Брезенхема для окружности
Здравствуйте, есть задание - Выполнить отрисовку окружностей радиусов 3*(R+9), 5*(R+9), 10*(R+9) разными цветами относительно центра...

Алгоритм Брезенхема для генерации окружности
Нужно написать программу, которая чертит 100 окружностей со случайно выбранными параметрами, используя алгоритм Брезенхема для генерации...

8
Модератор
Эксперт С++
 Аватар для zss
13781 / 10974 / 6491
Регистрация: 18.12.2011
Сообщений: 29,259
16.03.2014, 12:05
У меня нашлась такая функция
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
void InsertLine(RECT rc)
{
    int x, y, xend, yend, s, dx, dy, d, inc1, inc2;
    int x1,y1,x2,y2;
    x1=rc.left;
    x2=rc.right;
    y1=rc.top;
    y2=rc.bottom;
    dx = abs(x2-x1); 
    dy = abs(y2-y1);
    if (dx > dy) 
    {
              inc1 = 2*dy; 
          inc2 = 2*(dy - dx); 
          d = 2*dy - dx;
              if (x1 < x2)
          {
                    x = x1; y = y1; xend = x2;
                    if (y1 < y2) s = 1;
                    else s = -1;
              }else
          {
                     x = x2; 
             y = y2; 
             xend = x1;
                     if (y1 > y2)s = 1;
                     else s = -1;
              }
          SetPixelColor(x,y,RGB(255,255,255));
              while (x < xend)
         {
                   x++;
                   if (d > 0)
              {
                          y+=s;
                          d+=inc2;
                  }else
                    d+=inc1;
        SetPixel(x,y,cDraw);
            }
        }else
        {
                inc1 = 2*dx; 
        inc2 = 2*(dx - dy); 
        d = 2*dx - dy;
                if (y1 < y2)
        {
                        y = y1; x = x1; yend = y2;
                        if (x1 < x2) s = 1;
                        else s = -1;
                }else
        {
                        y = y2; 
            x = x2; 
            yend = y1;
                        if (x1 > x2)s = 1;
                        else s = -1;
                }
        SetPixel(x,y,RGB(255,255,255));
                while (y < yend)
        {
                      y++;
                      if (d > 0)
              {
                            x+=s;
                            d+=inc2;
                      }
                      else
               d+=inc1;
              SetPixel(x,y,RGB(255,255,255));
               }
    }
}
1
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
16.03.2014, 12:37  [ТС]
zss, хм но насколько я понимаю ваш код генерирует линию только из левого верхнего угла ректа в правый нижний? а как сделать чтобы наоборот? кроме того ошибок конечно куча, начиная с полного отсутствия дескриптора... немного модифицировал ваш код, правда в одном месте все равно не понятно что за... видимо там должен тоже быть какой то цвет, но какой?

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
void InsertLine(HDC hdc, RECT rc)
{
    int x, y, xend, yend, s, dx, dy, d, inc1, inc2;
    int x1,y1,x2,y2;
    x1=rc.left;
    x2=rc.right;
    y1=rc.top;
    y2=rc.bottom;
    dx = abs(x2-x1); 
    dy = abs(y2-y1);
    if (dx > dy) 
    {
        inc1 = 2*dy; 
        inc2 = 2*(dy - dx); 
        d = 2*dy - dx;
        if (x1 < x2)
        {
            x = x1; y = y1; xend = x2;
            if (y1 < y2) s = 1;
            else s = -1;
        }
        else
        {
            x = x2;
            y = y2; 
            xend = x1;
            if (y1 > y2) s = 1;
            else s = -1;
        }
        SetPixel(hdc,x,y,RGB(255,255,255));
        while (x < xend)
        {
            x++;
            if (d > 0)
            {
                y+=s;
                d+=inc2;
            }
            else d+=inc1;
            SetPixel(hdc,x,y,cDraw); //что это???? (cDraw)
        }
    }
    else
    {
        inc1 = 2*dx; 
        inc2 = 2*(dx - dy); 
        d = 2*dx - dy;
        if (y1 < y2)
        {
            y = y1; x = x1; yend = y2;
            if (x1 < x2) s = 1;
            else s = -1;
        }
        else
        {
            y = y2; 
            x = x2; 
            yend = y1;
            if (x1 > x2)s = 1;
            else s = -1;
        }
        SetPixel(hdc,x,y,RGB(255,255,255));
        while (y < yend)
        {
            y++;
            if (d > 0)
            {
                x+=s;
                d+=inc2;
            }
            else d+=inc1;
            SetPixel(hdc,x,y,RGB(255,255,255));
        }
    }
}
з.ы. касательно правильности генерирования и соответствия алгоритму Брезенхема еще не проверял
0
Модератор
Эксперт С++
 Аватар для zss
13781 / 10974 / 6491
Регистрация: 18.12.2011
Сообщений: 29,259
16.03.2014, 13:23
Когда-то я взял этот алгоритм из библиотеки,
протестировал на работоспособность и теперь
пользуюсь.
Цитата Сообщение от GetHelp Посмотреть сообщение
//что это???? (cDraw)
Забыл заменить на RGB(255,255,255) - это белый цвет.
Подставьте нужный Вам.
(x1,y1) - начало линии
(x2,y2) - конец линии
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
16.03.2014, 13:36  [ТС]
не работает просто ничего не рисует... кстати советую проверить еще разок этот код, т.к. там везде белый цвет, а где же он рисует черный то? то бишь где он закрашивает?
0
Модератор
Эксперт С++
 Аватар для zss
13781 / 10974 / 6491
Регистрация: 18.12.2011
Сообщений: 29,259
16.03.2014, 13:54
Поменяйте RGB(255,255,255) на RGB(0,0,0)
Пардон, то самое cDraw и было нужным цветом
Сейчас верну

Добавлено через 4 минуты
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
void InsertLine(HDC hdc, RECT rc)
{
    int x, y, xend, yend, s, dx, dy, d, inc1, inc2;
    int x1,y1,x2,y2;
    x1=rc.left;
    x2=rc.right;
    y1=rc.top;
    y2=rc.bottom;
    dx = abs(x2-x1); 
    dy = abs(y2-y1);
     COLORREF cDraw=RGB(255,0,0);// красный
    if (dx > dy) 
    {
        inc1 = 2*dy; 
        inc2 = 2*(dy - dx); 
        d = 2*dy - dx;
        if (x1 < x2)
        {
            x = x1; y = y1; xend = x2;
            if (y1 < y2) s = 1;
            else s = -1;
        }
        else
        {
            x = x2;
            y = y2; 
            xend = x1;
            if (y1 > y2) s = 1;
            else s = -1;
        }
        SetPixel(hdc,x,y,cDraw);
        while (x < xend)
        {
            x++;
            if (d > 0)
            {
                y+=s;
                d+=inc2;
            }
            else d+=inc1;
            SetPixel(hdc,x,y,cDraw);
        }
    }
    else
    {
        inc1 = 2*dx; 
        inc2 = 2*(dx - dy); 
        d = 2*dx - dy;
        if (y1 < y2)
        {
            y = y1; x = x1; yend = y2;
            if (x1 < x2) s = 1;
            else s = -1;
        }
        else
        {
            y = y2; 
            x = x2; 
            yend = y1;
            if (x1 > x2)s = 1;
            else s = -1;
        }
        SetPixel(hdc,x,y,RGB(255,255,255));
        while (y < yend)
        {
            y++;
            if (d > 0)
            {
                x+=s;
                d+=inc2;
            }
            else d+=inc1;
            SetPixel(hdc,x,y,RGB(255,255,255));
        }
    }
}
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
16.03.2014, 14:11  [ТС]
че та все равно не работает, сделал немного по другому, покрасивше вызываю с параметром RGB(0,0,0)

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
void InsertLine(HDC hdc, RECT rc, COLORREF color)
{
    int x, y, xend, yend, s, dx, dy, d, inc1, inc2;
    int x1,y1,x2,y2;
    x1=rc.left;
    x2=rc.right;
    y1=rc.top;
    y2=rc.bottom;
    dx = abs(x2-x1); 
    dy = abs(y2-y1);
    if (dx > dy) 
    {
        inc1 = 2*dy; 
        inc2 = 2*(dy - dx); 
        d = 2*dy - dx;
        if (x1 < x2)
        {
            x = x1; y = y1; xend = x2;
            if (y1 < y2) s = 1;
            else s = -1;
        }
        else
        {
            x = x2;
            y = y2; 
            xend = x1;
            if (y1 > y2) s = 1;
            else s = -1;
        }
        SetPixel(hdc,x,y,color);
        while (x < xend)
        {
            x++;
            if (d > 0)
            {
                y+=s;
                d+=inc2;
            }
            else d+=inc1;
            SetPixel(hdc,x,y,color);
        }
    }
    else
    {
        inc1 = 2*dx; 
        inc2 = 2*(dx - dy); 
        d = 2*dx - dy;
        if (y1 < y2)
        {
            y = y1; x = x1; yend = y2;
            if (x1 < x2) s = 1;
            else s = -1;
        }
        else
        {
            y = y2; 
            x = x2; 
            yend = y1;
            if (x1 > x2)s = 1;
            else s = -1;
        }
        SetPixel(hdc,x,y,RGB(255,255,255));
        while (y < yend)
        {
            y++;
            if (d > 0)
            {
                x+=s;
                d+=inc2;
            }
            else d+=inc1;
            SetPixel(hdc,x,y,RGB(255,255,255));
        }
    }
}
не рисует
0
Модератор
Эксперт С++
 Аватар для zss
13781 / 10974 / 6491
Регистрация: 18.12.2011
Сообщений: 29,259
16.03.2014, 14:26
Замените все RGB(255,255,255) на color.
Проверил. Теперь рисует
1
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
16.03.2014, 15:03  [ТС]
да спасибо вроде рисует, осталось разобраться как оно рисует

вот короче если что последняя модификация

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
void BresenhamLine(HDC hdc, POINT from, POINT to, COLORREF color)
{
    int x, y, xend, yend, s, dx, dy, d, inc1, inc2;
    int x1, y1, x2, y2;
    x1 = from.x;
    x2 = to.x;
    y1 = from.y;
    y2 = to.y;
    dx = abs(x2-x1); 
    dy = abs(y2-y1);
    if (dx > dy) 
    {
        inc1 = 2*dy; 
        inc2 = 2*(dy - dx); 
        d = 2*dy - dx;
        if (x1 < x2)
        {
            x = x1; y = y1; xend = x2;
            (y1 < y2) ? s = 1 : s = -1;
        }
        else
        {
            x = x2;
            y = y2; 
            xend = x1;
            (y1 > y2) ? s = 1 : s = -1;
        }
        SetPixel(hdc,x,y,color);
        while (x < xend)
        {
            x++;
            if (d > 0)
            {
                y += s;
                d += inc2;
            }
            else d += inc1;
            SetPixel(hdc,x,y,color);
        }
    }
    else
    {
        inc1 = 2*dx; 
        inc2 = 2*(dx - dy); 
        d = 2*dx - dy;
        if (y1 < y2)
        {
            y = y1; x = x1; yend = y2;
            (x1 < x2) ? s = 1 : s = -1;
        }
        else
        {
            y = y2; 
            x = x2; 
            yend = y1;
            (x1 > x2) ? s = 1 : s = -1;
        }
        SetPixel(hdc,x,y,color);
        while (y < yend)
        {
            y++;
            if (d > 0)
            {
                x += s;
                d += inc2;
            }
            else d += inc1;
            SetPixel(hdc,x,y,color);
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.03.2014, 15:03
Помогаю со студенческими работами здесь

Алгоритм Брезенхема для генерации окружности
Очень срочно, пожалуйста Нужно для матлаба

Алгоритм Брезенхема для генерации окружности
Что-то не получается, кто может помочь? (Данный алгоритм также является целочисленным. В соответствии с ним полагается, что генерируется...

Алгоритм Брезенхема для генерации окружности C# OpenGl
Всем доброго времени суток. Возник очень важный вопрос. Как нарисовать круг по алгоритму Брезенхема (связность пикселей - 4) с...

[Code review] Алгоритм Брезенхема для линии
/* * Created by SharpDevelop. * User: 26-60-911 * Date: 13.08.2017 * Time: 20:58 * * To change this template use Tools |...

Реализовать алгоритм Брезенхема, для дуг окружности и дуг эллипса
Надо реализоавать алгоритм Брезенхема, для дуг окружности и дуг эллипса. Для окружности и самого эллипса я сделал. Вот он: unit Unit1; ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru