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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
#1

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

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

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

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

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

Алгоритм Брезенхема построения окружности на С++ - C++
помогите найти или написать программу алгоритм Брезенхема построения окружности на С++ для Borland 3.1 ПЛИЖ):huh::umnik:

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

алгоритм разложения функции - C++
y(x)=Pi*x/((e^3x)-1). Я пробовал делать два раза но препод не принял. Даже не объяснил, что делать. Помогите пожалуйста

Алгоритм вычисления логарифма без использования разложения в ряд Тейлора - C++
Необходим алгоритм вычисления log a b, можем преобразовать как log e b / log e a Задача сводится к вычислению натурального логарифма, но...

Помогите алгоритм для char переделать в алгоритм для float - C++
char* DecToBin(char x, char* str) { int i; for (i = sizeof(x)*8-1; i>=0; i--) { str = (x&1 == 1) ? '1' : '0'; x = x >>...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
zss
Модератор
Эксперт С++
6360 / 5924 / 1921
Регистрация: 18.12.2011
Сообщений: 15,228
Завершенные тесты: 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
-7 / 61 / 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
Модератор
Эксперт С++
6360 / 5924 / 1921
Регистрация: 18.12.2011
Сообщений: 15,228
Завершенные тесты: 1
16.03.2014, 13:23 #4
Когда-то я взял этот алгоритм из библиотеки,
протестировал на работоспособность и теперь
пользуюсь.
Цитата Сообщение от GetHelp Посмотреть сообщение
//что это???? (cDraw)
Забыл заменить на RGB(255,255,255) - это белый цвет.
Подставьте нужный Вам.
(x1,y1) - начало линии
(x2,y2) - конец линии
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
16.03.2014, 13:36  [ТС] #5
не работает просто ничего не рисует... кстати советую проверить еще разок этот код, т.к. там везде белый цвет, а где же он рисует черный то? то бишь где он закрашивает?
zss
Модератор
Эксперт С++
6360 / 5924 / 1921
Регистрация: 18.12.2011
Сообщений: 15,228
Завершенные тесты: 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
-7 / 61 / 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
Модератор
Эксперт С++
6360 / 5924 / 1921
Регистрация: 18.12.2011
Сообщений: 15,228
Завершенные тесты: 1
16.03.2014, 14:26 #8
Замените все RGB(255,255,255) на color.
Проверил. Теперь рисует
GetHelp
-7 / 61 / 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);
        }
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2014, 15:03
Привет! Вот еще темы с ответами:

Дан номер единицы длины и длина отрезка L в этих единицах. Вывести длину данного отрезка в метрах - C++
15 Единицы длины пронумерованы следующим образом: 1 — дециметр, 2 — километр, 3 — метр, 4 — миллиметр, 5 — сантиметр. Дан номер единицы...

Кто может написать программу для разложения числа N на множители? - C++
Необходимо написать программу дла разложения числа N на простые множители на C++. Помогите пожалуйста!

Эквивалентное число для отрезка - C++
Есть два отрезка первый: 0.25 до 1.93 второй 0.9 до 1 начала/концы эквиваленты как бы. 0.25 ~ 0.9 1.93...

Написать программу для вывода на экран таблицы значений функции F (x) и ее разложения в ряд S (x) - C++
Помогите разобраться Написать программу для вывода на экран таблицы значений функции F (x) и ее разложения в ряд S (x) согласно своему...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.03.2014, 15:03
Ответ Создать тему
Опции темы

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