Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
GetHelp
61 / 62 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
1

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

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

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

Добавлено через 7 минут
з.ы. например вот что написано об этом в википедии: http://ru.wikipedia.org/wiki/Алгоритм_Брезенхэма
но че то там так все запутано...
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2014, 11:44
Ответы с готовыми решениями:

Алгоритм Брезенхема
Есть такой цикл и это кусок кода из этой статьи for (int x = x0; x <= x1; x++) { ...

алгоритм Брезенхема
Построить график функции y=x^3. График строится с помощью отрезков. Для построения отрезков...

Алгоритм Брезенхема построения окружности на С++
помогите найти или написать программу алгоритм Брезенхема построения окружности на С++ для Borland...

Алгоритм Брезенхема. Проверьте корректность перевода (C++ -> Delphi)
пытаюсь уже не первый день написать Брезенхейма для 3D линии. п.с. если у кого то есть примеры...

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

8
zss
Модератор
Эксперт С++
8784 / 7676 / 4745
Регистрация: 18.12.2011
Сообщений: 20,431
Завершенные тесты: 1
16.03.2014, 12:05 2
У меня нашлась такая функция
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
GetHelp
61 / 62 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
16.03.2014, 12:37  [ТС] 3
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
Модератор
Эксперт С++
8784 / 7676 / 4745
Регистрация: 18.12.2011
Сообщений: 20,431
Завершенные тесты: 1
16.03.2014, 13:23 4
Когда-то я взял этот алгоритм из библиотеки,
протестировал на работоспособность и теперь
пользуюсь.
Цитата Сообщение от GetHelp Посмотреть сообщение
//что это???? (cDraw)
Забыл заменить на RGB(255,255,255) - это белый цвет.
Подставьте нужный Вам.
(x1,y1) - начало линии
(x2,y2) - конец линии
0
16.03.2014, 13:23
GetHelp
61 / 62 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
16.03.2014, 13:36  [ТС] 5
не работает просто ничего не рисует... кстати советую проверить еще разок этот код, т.к. там везде белый цвет, а где же он рисует черный то? то бишь где он закрашивает?
0
zss
Модератор
Эксперт С++
8784 / 7676 / 4745
Регистрация: 18.12.2011
Сообщений: 20,431
Завершенные тесты: 1
16.03.2014, 13:54 6
Поменяйте 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
GetHelp
61 / 62 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
16.03.2014, 14:11  [ТС] 7
че та все равно не работает, сделал немного по другому, покрасивше вызываю с параметром 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
Модератор
Эксперт С++
8784 / 7676 / 4745
Регистрация: 18.12.2011
Сообщений: 20,431
Завершенные тесты: 1
16.03.2014, 14:26 8
Замените все RGB(255,255,255) на color.
Проверил. Теперь рисует
1
GetHelp
61 / 62 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
16.03.2014, 15:03  [ТС] 9
да спасибо вроде рисует, осталось разобраться как оно рисует

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

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
16.03.2014, 15:03
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2014, 15:03

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

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

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


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

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

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