Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
16.03.2014, 11:44     Алгоритм Брезенхема для разложения отрезка в растр #1
помогите разобраться с этим алгоритмом, перечитал много сайтов, но че то никак не врублюсь, вот как этот коэфициент отклонения высчитывать? вообще пиксель он же как бы мельчайшая точка и как линия может проходить через пиксель если меньше пикселя ничего нет? о_О

Добавлено через 7 минут
з.ы. например вот что написано об этом в википедии: http://ru.wikipedia.org/wiki/Алгоритм_Брезенхэма
но че то там так все запутано...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 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));
               }
    }
}
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
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));
        }
    }
}
з.ы. касательно правильности генерирования и соответствия алгоритму Брезенхема еще не проверял
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
16.03.2014, 13:23     Алгоритм Брезенхема для разложения отрезка в растр #4
Когда-то я взял этот алгоритм из библиотеки,
протестировал на работоспособность и теперь
пользуюсь.
Цитата Сообщение от GetHelp Посмотреть сообщение
//что это???? (cDraw)
Забыл заменить на RGB(255,255,255) - это белый цвет.
Подставьте нужный Вам.
(x1,y1) - начало линии
(x2,y2) - конец линии
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
16.03.2014, 13:36  [ТС]     Алгоритм Брезенхема для разложения отрезка в растр #5
не работает просто ничего не рисует... кстати советую проверить еще разок этот код, т.к. там везде белый цвет, а где же он рисует черный то? то бишь где он закрашивает?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 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));
        }
    }
}
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
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));
        }
    }
}
не рисует
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
16.03.2014, 14:26     Алгоритм Брезенхема для разложения отрезка в растр #8
Замените все RGB(255,255,255) на color.
Проверил. Теперь рисует
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2014, 15:03     Алгоритм Брезенхема для разложения отрезка в растр
Еще ссылки по теме:

Не могу понять суть эпсилон (точности) для разложения в ряд Тейлора, как её описать? C++
Дан номер единицы длины и длина отрезка L в этих единицах. Вывести длину данного отрезка в метрах C++
C++ Алгоритм Брезенхема. Проверьте корректность перевода (C++ -> Delphi)

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

Или воспользуйтесь поиском по форуму:
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
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);
        }
    }
}
Yandex
Объявления
16.03.2014, 15:03     Алгоритм Брезенхема для разложения отрезка в растр
Ответ Создать тему
Опции темы

Текущее время: 03:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru