0 / 0 / 0
Регистрация: 07.08.2016
Сообщений: 28
1

Не получается воспроизвести пример из книги по графике на С

19.11.2016, 09:03. Показов 1674. Ответов 8
Метки си (Все метки)

Author24 — интернет-сервис помощи студентам
// draw move initgr как неопознанные, можно как-нибудь запустить данный код?
Пользуюсь Visual Studio проект Win 32
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
main()
{
    float xA, yA, xB, yB, xC, yC, xD, yD, xxA, yyA, xxB, yyB, xxC, yyC, xxD, yyD, p, q;
    int i;
    p = 0.95;
    q = 1.0 - p;
    xA = 2.0;
    xB = 8.0;
    xC = 8.0;
    xD = 2.0;
    yA = 0.5;
    yB = 0.5;
    yC = 6.5;
    yD = 6.5;
    initgr();
    for (i = 0; i < 50; i++)
    {
        move(xA, yA);
        draw(xB, yB);
        draw(xC, yC);
        draw(xD, yD);
        draw(xA, yA);
        xxA = p * xA + q * xB;
        yyA = p * yA + q * yB;
        xxB = p * xB + q * xC;
        yyB = p * yB + q * yC;
        xxC = p * xC + q * xD;
        yyC = p * yC + q * yD;
        xxD = p * xD + q * xA;
        yyD = p * yD + q * yA;
        xA = xxA;
        xB = xxB;
        xC == xxC;
        xD = xxD;
        yA = yyA;
        yB = yyB;
        yC = yyC;
        yD = yyD;
    }
    endgr();
}
Пример взят из:
http://sci.sernam.ru/book_graph.php?id=3
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.11.2016, 09:03
Ответы с готовыми решениями:

Не получается воспроизвести пример с сайта
Доброго времени суток. Подскажите, пожалуйста новичку - что я делаю не так ? Нашел пример в...

Не получается вывести Bitmap (пример из книги)
Доброго времени суток. Учу ВинАПИ по книге &quot;Азбука программирования в Вин32 АПИ&quot; П.В. Румянцев ...

Не получается воссоздать пример из книги Б.Керниган Д.Ритчи
Не могу разобраться, почему код приведённый из книги в примере выполняется бесконечно и при этом не...

Можно пожалуйста воспроизвести данный пример
Двухмерные массивы По матрице A(10,10) построить массив B(10) следующим образом: B(J) присвоить...

8
53 / 43 / 22
Регистрация: 29.05.2016
Сообщений: 214
19.11.2016, 09:06 2
свой код покажи целиком
0
34 / 33 / 21
Регистрация: 14.11.2016
Сообщений: 141
19.11.2016, 10:13 3
Цитата из книги:
"Здесь объясняется, как программисты могут использовать плоттеры и другие графические устройства, без анализа подробностей их работы и без учета конкретных особенностей доступных устройств. Надеюсь, что читатель одобрит подобный приборно-независимый подход. В любом случае так можно избежать недоразумений, которые могут появиться при изучении конкретных программ и аппаратных реализаций."

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

p.s.
Книга как динозавр, если не древнее.
А так, всегда читайте предисловие.
0
53 / 43 / 22
Регистрация: 29.05.2016
Сообщений: 214
19.11.2016, 12:42 4
newgraf.h
C
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef __NEWGRAF_H_
#define __NEWGRAF_H_
 
void initgr();
void move(float x, float y);
void draw(float x, float y);
void endgr();
 
extern float curr_x;
extern float curr_y;
 
#endif
newgraf.c
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#include "newgraf.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
 
float curr_x;
float curr_y;
 
int width;
int height;
 
char * buff; // buffer for image
int coeff = 100; // coeff to multiply x and y
int bpp = 3; // bytes per pixel
 
void pixel(float x, float y) {
    int coor = (y * width + x) * bpp;
    switch (bpp) {
        case 1:
            buff[coor] = 0x0;
            break;
        case 3:
            buff[coor] = 0x0;
            buff[coor+1] = 0x0;
            buff[coor+2] = 0x0;
            break;
        case 4:
            buff[coor] = 0x0;
            buff[coor+1] = 0x0;
            buff[coor+2] = 0x0;
            buff[coor+3] = 0x0;
            break;  
        default:
            break;
    }
}
 
void initgr() {
    curr_x = 0;
    curr_y = 0;
    width = 9*coeff;
    height = 7*coeff;
    int size = width*height*bpp;
    buff = (char*) malloc(size);
    memset(buff, 0xFF, size);
}
 
void move(float x, float y) {
    curr_y = x;
    curr_y = y;
 
}
 
#define roundf(x) floor(x + 0.5f)
 
#define max(a,b) \
   ({ __typeof__ (a) _a = (a); \
       __typeof__ (b) _b = (b); \
     _a > _b ? _a : _b; })
 
void draw(float x, float y) {
    // [url]http://compgraphics.info/2D/DDA_line.php[/url] , немного адаптированно
    // (1) Целочисленные значения координат начала и конца отрезка, 
    // округленные до ближайшего целого
    int iX1 = roundf(x*coeff);
    int iY1 = roundf(y*coeff);
    int iX2 = roundf(curr_x*coeff);
    int iY2 = roundf(curr_y*coeff);
 
    // (2) Длина и высота линии
    int deltaX = abs(iX1 - iX2);
    int deltaY = abs(iY1 - iY2);
 
    // (3) Считаем минимальное количество итераций, необходимое
    // для отрисовки отрезка. Выбирая максимум из длины и высоты
    // линии, обеспечиваем связность линии
    int length = max(deltaX, deltaY);
// особый случай, на экране закрашивается ровно один пиксел
    if (length == 0)
    {
        pixel(iX1, iY1);
        return;
    }
 
      // (4) Вычисляем приращения на каждом шаге по осям абсцисс и ординат
      double dX = (x - curr_x) * coeff / length;
      double dY = (y - curr_y) * coeff / length;
 
      // (5) Начальные значения
      double xx = curr_x * coeff;
      double yy = curr_y * coeff;
 
      // Основной цикл
      length++;
      while (length--)
      {
            xx += dX;
            yy += dY;
            pixel(roundf(xx), roundf(yy));
      }
 
    curr_x = x;
    curr_y = y;
}
 
void endgr() {
    FILE *f;
    int i;
    unsigned char file[14] = {
        'B','M', // magic
        0,0,0,0, // size in bytes
        0,0, // app data
        0,0, // app data
        40+14,0,0,0 // start of data offset
    };
    unsigned char info[40] = {
        40,0,0,0, // info hd size
        0,0,0,0, // width
        0,0,0,0, // heigth
        1,0, // number color planes
        24,0, // bits per pixel
        0,0,0,0, // compression is none
        0,0,0,0, // image bits size
        0x13,0x0B,0,0, // horz resoluition in pixel / m
        0x13,0x0B,0,0, // vert resolutions (0x03C3 = 96 dpi, 0x0B13 = 72 dpi)
        0,0,0,0, // #colors in pallete
        0,0,0,0, // #important colors
        };
 
    int w=width;
    int h=height;
 
    int padSize  = (4-(w*bpp)%4)%4;
    int sizeData = w*h*bpp + h*padSize;
    int sizeAll  = sizeData + sizeof(file) + sizeof(info);
 
    file[ 2] = (unsigned char)( sizeAll    );
    file[ 3] = (unsigned char)( sizeAll>> 8);
    file[ 4] = (unsigned char)( sizeAll>>16);
    file[ 5] = (unsigned char)( sizeAll>>24);
 
    info[ 4] = (unsigned char)( w   );
    info[ 5] = (unsigned char)( w>> 8);
    info[ 6] = (unsigned char)( w>>16);
    info[ 7] = (unsigned char)( w>>24);
 
    info[ 8] = (unsigned char)( h    );
    info[ 9] = (unsigned char)( h>> 8);
    info[10] = (unsigned char)( h>>16);
    info[11] = (unsigned char)( h>>24);
 
    info[20] = (unsigned char)( sizeData    );
    info[21] = (unsigned char)( sizeData>> 8);
    info[22] = (unsigned char)( sizeData>>16);
    info[23] = (unsigned char)( sizeData>>24);
 
    f = fopen("img.bmp","wb");
    fwrite(file,1,sizeof(file),f);
    fwrite(info,1,sizeof(info),f);
 
 
    unsigned char bmppad[3] = {0,0,0};
 
    for(i=0; i<h; i++)
    {
        fwrite(buff+(w*(h-i-1)*bpp),bpp,w,f);
        fwrite(bmppad,1,(4-(w*bpp)%4)%4,f);
    }
    fclose(f);
 
    free(buff);
}
Добавлено через 3 минуты
погуглить побробуй initgr
0
sourcerer
19.11.2016, 12:43
  #5
 Комментарий модератора 
matveev1512, пожалуйста, прочитайте правила форума.
Особое внимание обратите на пункт 4.9 (порядок оформления кода).
0
0 / 0 / 0
Регистрация: 07.08.2016
Сообщений: 28
19.11.2016, 16:49  [ТС] 6
Ошибка в вашем коде
Миниатюры
Не получается воспроизвести пример из книги по графике на С  
0
34 / 33 / 21
Регистрация: 14.11.2016
Сообщений: 141
19.11.2016, 19:42 7
Перепиши тело max. В чем проблема.
0
0 / 0 / 0
Регистрация: 07.08.2016
Сообщений: 28
24.11.2016, 12:33  [ТС] 8
Каким образом переписать?
0
Форумчанин
Эксперт CЭксперт С++
8216 / 5046 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
24.11.2016, 14:12 9
C
1
int length = (deltaX < deltaY ? deltaY : deltaX);
Я также хочу отметить, что вы пробуете скомпилировать программу как С++. Смените расширение файла на .c
0
24.11.2016, 14:12
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.11.2016, 14:12
Помогаю со студенческими работами здесь

Книги по компьютерной графике
Порекомендуйте книгу на русском в которой описываются векторы матрицы кватернионы,описывается как...

Windows phone: не получается воспроизвести GIF
Всем привет. Недавно начал делать приложение под Windows phone 8.1,но столкнулся с серьезной...

Не получается воспроизвести wav файл из ресурсов
В player.SoundLocation указывал путь к файлу на диске c. Работало. Добавил файл test.wav в...

Посоветуйте книги по примитивной графике
Может кто встречал книги или лучше электронные статьи или учебники, где подробно описаны техники...

MediaPlayer: не получается воспроизвести музыкальный файл из списка
Не получается воспроизвести музыкальный файл из списка. Алгоритм такой: записал все media файлы на...

Книги, статьи, сайты по ООП графике
Доброго времени суток, форумчане! Посоветуйте, пожалуйста, сайт или книгу, на русском языке, где...


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

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

Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru