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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Считывание из файла с заданной позиции http://www.cyberforum.ru/cpp-beginners/thread1205197.html
#include <stdio.h> #include <Windows.h> #include <iostream> #include <fstream> using namespace std; struct stud {
C++ Как читать с файла каждую строку как структуру вопрос 1) как рассмотреть файл как последовательность битов.. вопрос 2) как читать с фаила каждую строку как структуру, например struct ID { int n; //длинна строки char* str ; //массив символов }; http://www.cyberforum.ru/cpp-beginners/thread1205196.html
Debug Assertion Failed C++
Привет всем. Написал такую программу. #include <stdio.h> int n, m; int i, q, d; void merge(int a, int b, int c, int n, int m){ int A(0), B(0); while((A + B) < (n + m))
Подчеркнуть в строке все вхождения заданного символа, если такие там есть C++
Дана строка и некий символ. Подчеркнуть в строке все вхождения заданного символа, если такие там есть. с++
C++ Поиск последовательности элементов в массиве http://www.cyberforum.ru/cpp-beginners/thread1205169.html
В универе задали создать программу авторизации (иначе не знаю как объяснить). В начале на выбор предлагается два действия - добавить пользователя и авторизация. Все это нужно сделать с хешированием и считыванием/записью в файл. В итоге у меня получился вот такой вот код: #include "stdafx.h" #include <iostream> #include <conio.h> #include <fstream> #include <ctime> using namespace std;...
C++ Разработка параллельных алгоритмов для решения СЛАУ Пишу курсовую на тему "Разработка параллельных алгоритмов для решения СЛАУ" У кого-нибудь есть что либо "работающее" по этой теме ? подробнее

Показать сообщение отдельно
Dimsssss
0 / 0 / 0
Регистрация: 13.06.2013
Сообщений: 20
11.06.2014, 06:22     Рисовалка и алгоритм Брезенхема для отрисовки линии
Есть программа, называется "Рисовалка"
Полный ее код выглядит примерно так:
C++ (Qt)
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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
#include <iostream>
#include <conio.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
 
class Field {
    char ** field; //двумерный массив
    int size; //целочисленная переменная, отвечающая за размеры поля
    char marker; //символьная переменная, от значения которой зависит, чем будет нарисована та или иная фигура
public:
    Field(int size); //конструктор
    ~Field(); //деструктор
    bool is_in_field(int x, int y); //см. в конце кода :D
    void print(); //метод, отрисовывающий поле
    void print_with_axes(); //метод, отрисовывающий поле с координатной сеткой
    void clear_field(); //метод очистки поля
    void draw_circle(int radius, int x, int y); //метод отрисовки круга
    void draw_square(int side, int x, int y); //метод отрисовки квадрата
    void draw_vertical_line(int length, int x, int y); //метод отрисовки вертикальной линии
    void draw_horizontal_line(int length, int x, int y); //и горизонтальной
    void draw_triangle(double height, double width, int x, int y); //метод отрисовки треугольника
    void line_draw(int q, int w, int e, int r); //метод отрисовки линии по двум точкам
    void marker_increment(); //метод инкремента маркера
    int abs(int val); //модуль
};
 
void print_options(); //функция опций
 
using namespace std;
 
int main() {
    std::cout << "Enter draw field size: ";
    int size; //размер поля
    std::cin >> size;
    Field * field = new Field(size); //этот field - указатель на поле, а не двумерный массив
 
    print_options();
 
    int q = 0;
    while (q != -3) { //пока не будет выбрана опция -3 - означает конец работы программы
        q = getch() - 48; //получаем значение с клавиатуры
        switch (q) { //оператор множественного ветвлениия switch-case
            case 1: field->print(); //отобразить поле
                break;
            case 2: field->print_with_axes(); //отобразить поле с координатами
                break;
            case 3: std::cout << "Enter square side length: ";
                int side; //целочисленное значение стороны квадрата
                std::cin >> side;
                std::cout << "Enter coordinate of square's top left corner (x y): ";
                int square_x, square_y; //целочисленные переменные отвечающие за верхний левый угол квадрата x, y соответсвенно
                std::cin >> square_x >> square_y;
                field->draw_square(side, square_x, square_y); //метод отрисовки квадрата
                break;
            case 4: std::cout << "Enter radius: ";
                int radius;
                std::cin >> radius;
                std::cout << "Enter coordinate of circle's centre (x y): ";
                int circle_x, circle_y;
                std::cin >> circle_x >> circle_y;
                field->draw_circle(radius, circle_x, circle_y);
                break;
            case 5: std::cout << "Enter triangle's (height, width): ";
                int height, width;
                std::cin >> height >> width;
                std::cout << "Enter coordinate of triangle's top left corner (x y): ";
                int triangle_x, triangle_y;
                std::cin >> triangle_x >> triangle_y;
                field->draw_triangle(height, width, triangle_x, triangle_y);
                break;
            case 6: std::cout << "vertical line length: ";
                int vertical_line_length;
                std::cin >> vertical_line_length;
                std::cout << "Enter coordinate of vertical line's top (x y): ";
                int vertical_line_x, vertical_line_y;
                std::cin >> vertical_line_x >> vertical_line_y;
                field->draw_vertical_line(vertical_line_length, vertical_line_x, vertical_line_y);
                break;
            case 7: std::cout << "horizontal line length: ";
                int horizontal_line_length;
                std::cin >> horizontal_line_length;
                std::cout << "Enter coordinate of horizontal line's left (x y): ";
                int horizontal_line_x, horizontal_line_y;
                std::cin >> horizontal_line_x >> horizontal_line_y;
                field->draw_horizontal_line(horizontal_line_length, horizontal_line_x, horizontal_line_y);
                break;
            case 8: field->clear_field();
                std::cout << "field cleared" << endl;
                break;
            case 9: delete field;
                std::cout << "Enter draw field size: ";
                int new_size;
                std::cin >> new_size;
                field = new Field(new_size);
                break;
            case -3: break;
            default: print_options();
        }
    }
    delete field;
}
 
int Field::abs(int val) {
    return val < 0 ? -val : val;
}
 
Field::Field(int size) { //конструктор поля
    this->size = size; //присвоить значение величины поля
    field = new char*[size]; //создаем массив указателей на символы согласно величине поля в динамической памяти
    for (int i = 0; i < size; ++i) //пока инкремент меньше значения величины
        field[i] = new char[size];
 
    for (int j = 0; j < size; j++) {
        for (int i = 0; i < size; i++)
            field[i][j] = ' '; //по одному символу
    }
    marker = '0';
 
}
 
Field::~Field() { //деструктор
    for (int i = 0; i < size; ++i)
        delete [] field[i];
    delete [] field;
}
 
void Field::print() { //метод отображения поля
    for (int j = 0; j < size; j++) {
        for (int i = 0; i < size; i++)
            std::cout << field[i][j];
        std::cout << endl; //перенос строки
    }
    std::cout << endl; //перенос строки
}
 
void Field::print_with_axes() { //метод отображения поля с координатами
    std::cout << " ";
    for (int i = 0; i < size; i++)
        std::cout << i % 10; //остаток от деления на 10 нужен чтобы координаты не смещали поле
    std::cout << endl;
    for (int j = 0; j < size; j++) {
        std::cout << j % 10; //остаток от деления на 10 нужен чтобы координаты не смещали поле
        for (int i = 0; i < size; i++)
            std::cout << field[i][j];
        std::cout << endl;
    }
    std::cout << endl;
}
 
void Field::clear_field() { //метод очистки поля
    for (int j = 0; j < size; j++) {
        for (int i = 0; i < size; i++)
            field[i][j] = ' ';
    }
    marker = '0';
}
 
void Field::draw_circle(int radius, int x, int y) { //метод отрисовки круга
    int i, j; //по большому счету это координаты для точек на круге
    for (int a = 0; a < 360; a += 1) { //а - угол; проходим по каждому градусу круга
        i = (int) (x + radius * cos(a)); //формулы для расчета точек окружности
        j = (int) (y + radius * sin(a)); //формулы для расчета точек окружности
        if(is_in_field(i, j)) //пока находимся в пределах поля
            field[i][j] = marker; //каждой точке окружности присваиваем значение символа маркера
    }
    marker_increment();
}
 
void Field::draw_square(int side, int x, int y) { //метод отрисовки квадрата
    //верхняя сторона
    for (int i = 1; i < side; ++i) { //пока i меньше значения стороны
        if(is_in_field(x, y)) //
            field[x][y] = marker;
        x++;
    }
    //правая сторона
    for (int i = 1; i < side; ++i) {
        if(is_in_field(x, y))
            field[x][y] = marker;
        y++;
    }
    //нижняя сторона
    for (int i = 1; i < side; ++i) {
        if(is_in_field(x, y))
            field[x][y] = marker;
        x--;
    }
    //левая сторона
    for (int i = 1; i < side; ++i) {
        if(is_in_field(x, y))
            field[x][y] = marker;
        y--;
    }
    marker_increment();
}
 
void Field::draw_vertical_line(int length, int x, int y) { //отрисовка вертикали
    for (int i = 0; i < length; ++i) {
        if(is_in_field(x, y))
            field[x][y] = marker;
        y++;
    }
    marker_increment();
}
 
void Field::draw_horizontal_line(int length, int x, int y) { //отрисовка горизонтали
    for (int i = 0; i < length; ++i) {
        if(is_in_field(x, y))
            field[x][y] = marker;
        x++;
    }
    marker_increment();
}
void Field::draw_triangle(double height, double width, int x, int y) { //метод отрисовки треугольника
    //y = kx + b
    //k = height / width / 2;
    //b = y - kx
    //x = (y - b) / k
 
    double k = height / width * 2; //коэффициент наклона прямой (тангенс угла)
    double b = y - k * x; // это следует из общего линейного уравнения
    int i, j; //инкременты циклов, а также i - псевдо-x, а j - псевдо-y
    for (j = y; j < y + height; j++) { //по всей высоте
        i = (int) ((j - b) / k); //x = (y - b) / k
        //cout << "i = " << i << " j = " << j << endl;
        if(is_in_field(i, j)) //пока находимся в поле - отрисовываем
            field[i][j] = marker;
    }
    int right_corner_x = i;
    k = -k; //то же самое что и выше, просто знак коэффициента наклона меняется на обратный.
    b = y - k * x;
    for (j = y; j < y + height; j++) {
        i = (int) ((j - b) / k);
        if(is_in_field(i, j))
            field[i][j] = marker;
    }
    int left_corner_x = i; //основание треугольника
    for (int i = left_corner_x, j = (int) (y + height - 1); i <= right_corner_x; ++i) {
        if(is_in_field(i, j))
            field[i][j] = marker;
    }
    marker_increment();
}
 
void print_options() { // функция вывода опций
    std::cout << "1 - print draw field" << endl << "2 - print draw field with axes" << endl
            << "3 - draw square" << endl << "4 - draw circle" << endl
            << "5 - draw triangle" << endl << "6 - draw vertical line"
            << endl << "7 - draw horizontal line" << endl << "8 - clear field" << endl
            << "9 - draw on new field" << endl << "- - exit" << endl;
}
 
void Field::marker_increment() { /* этот метод нужен для того, чтобы разные фигуры рисовались
    разными символами. А это нужно для того, чтобы не требовалось каждый раз проводить очистку поля,
    для того чтобы разобраться, где есть какая фигура */
    if (marker < 57) {
        marker++;
        return;
    }
    if (marker == 57) {
        marker = 97;
        return;
    }
    if (marker < 122 && marker > 96) {
        marker++;
        return;
    }
    if (marker == 122) {
        marker = 65;
        return;
    }
    if (marker > 64 && marker < 90) {
        marker++;
        return;
    }
    marker = 2;
}
 
bool Field::is_in_field(int x, int y) { /*метод, который возвращает TRUE или FALSE, в зависимости от того
    расположена клетка в поле для рисования или нет*/
   return (x >= 0 && y >= 0 && x < size && y < size); //если х и y меньше границ поля и неотрицательны
}
Было бы здорово, если бы, используя алгоритм Брезенхема, вы, форумчане, помогли бы реализовать метод отрисовки линии, назовем его void draw_freeline (int startx, int starty, int endx, int endy). Надеюсь на вас, ребята!!!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 13:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru