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

Нарисовать квадрат заданного размера - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Не могу понять почему http://www.cyberforum.ru/cpp-beginners/thread896611.html
Есть кода программы(код взят разобраться): #include<iostream> using namespace std; class coord { protected: public: int x,y; //значения координат coord (){x=0;y=0;} coord (int i,int j){x=i ;y=j;}
C++ Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора Ребята, помогите пожалуйста решить. Я в этом деле новичок, и сам никак не справлюсь. 3. Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора, на интервале от Хнач до Хкон с шагом dx с точностью ε. Таблицу снабдить заголовком и шапкой. Каждоя строка таблицы должна содержать значение аргумента, значение функции и количество просуммированных членов ряда. http://www.cyberforum.ru/cpp-beginners/thread896595.html
C++ Описать структуру с именем STUDENT
Ребята, помогите пожалуйста решить. Я в этом деле новичок, и сам никак не справлюсь. 2. Описать структуру с именем STUDENT, содержащую следующие поля: фамилия и инициалы; номер группы; успеваемость (массив из пяти элементов). Написать программу, выполняющую следующие действия: ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT; записи должны быть упорядочены по...
C++ синтаксическая ошибка
#include <iostream> #include <stdio.h> #include <io.h> #include <ctime> using namespace std; #define MEN 2 #define ORIGINAL_MAZE 0 #define MAZE_WITH_PATH 1
C++ Вычислить множество значений функции y http://www.cyberforum.ru/cpp-beginners/thread896575.html
Вычислить множество значений функции y=a*a*x+b*x/x+1 на отрезке с шагом 0,1 где a=0,3 b=0,9 (если получится, можно что-нибудь простенькое)
C++ Список (найти ошибку в коде) Почему компилируется программа? Вот эта функция: List::node* seach(T el) { for(node* p = head->next; p != NULL; p = p->next) if(p->item == el) return p; return NULL; } #include <iostream> подробнее

Показать сообщение отдельно
DrOffset
6416 / 3790 / 876
Регистрация: 30.01.2014
Сообщений: 6,575
13.08.2014, 21:31     Нарисовать квадрат заданного размера
gru74ik, SatanaXIII, раз уж вы тут выкладываете всякие варианты, давайте и я выложу
Вот вариант с использованием Bresenham's line algorithm для рисования линий.
Кликните здесь для просмотра всего текста
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
#include <cmath>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <iostream>
 
struct Point
{
    int x;
    int y;
};
 
//Bresenham's line algorithm
void line(char * screen, size_t xMax, Point p0, Point p1)
{
    bool steep = std::abs(p1.y - p0.y) > std::abs(p1.x - p0.x);
    if(steep)
    {
        std::swap(p0.x, p0.y);
        std::swap(p1.x, p1.y);
    }
    if(p0.x > p1.x)
    {
        std::swap(p0.x, p1.x);
        std::swap(p0.y, p1.y);
    }
    int dx = p1.x - p0.x;
    int dy = std::abs(p1.y - p0.y);
    int error = dx / 2;
    int ystep = (p0.y < p1.y) ? 1 : -1;
    int y = p0.y;
    for(int x = p0.x; x <= p1.x; ++x)
    {
        screen[steep ? y + x * xMax : x + y * xMax] = '*';
        error -= dy;
        if(error < 0)
        {
            y += ystep;
            error += dx;
        }
    }
}
 
template <size_t (*next)(size_t, size_t), size_t M>
void paintFigure(char (&screen)[M], size_t xMax, Point * points, size_t size)
{
    for(size_t idx = 0; idx < size; ++idx)
    {
        line(screen, xMax, points[idx], points[next(idx, size)]);
    }
    std::fwrite(screen, sizeof(char), M / sizeof(char), stdout);
}
 
size_t nextPoint(size_t idx, size_t limit)
{
    return (idx += 1) >= limit ? idx - limit : idx;
}
 
int main()
{
    enum
    {
        Chars = 20
      , Lines = 20
    };
 
    char screen[(Chars + 1) * Lines];
    std::memset(screen, ' ', sizeof(screen));
 
    for(size_t lines = 0; lines < Lines; ++lines)
    {
        screen[Chars + lines * (Chars + 1)] = '\n';
    }
    Point center = {Chars / 2, Lines / 2};
 
    int side;
    std::cout << "Enter side: ";
    std::cin >> side;
    if(side <= Lines && side <= Chars && side > 0)
    {
        const size_t numPoints = 4;
        const bool a = side % 2 == 0;
        side /= 2;
        Point points[numPoints] =
        {
            {center.x + (side - a), center.y + (side - a)}
           ,{center.x - side, center.y + (side - a)}
           ,{center.x - side, center.y - side}
           ,{center.x + (side - a), center.y - side}
        };
        paintFigure<&nextPoint>(screen, Chars + 1, points, numPoints);
    }
    else
    {
        std::cerr << "Side is not in [1:20]\n";
    }
}

Тест: http://codepad.org/9iihYe3T
Ну конечно это все затевалось не ради несчастного квадрата, а для того, чтобы рисовать произвольные фигуры (поменял только main и функцию шага координат, остальной код тот же):
Кликните здесь для просмотра всего текста
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
size_t nextPoint(size_t idx, size_t limit)
{
    return (idx += 2) >= limit ? idx - limit : idx;
}
 
int main()
{
    enum
    {
        Chars = 20
      , Lines = 20
    };
 
    char screen[(Chars + 1) * Lines];
    std::memset(screen, ' ', sizeof(screen));
 
    for(size_t lines = 0; lines < Lines; ++lines)
    {
        screen[Chars + lines * (Chars + 1)] = '\n';
    }
    Point center = {Chars / 2, Lines / 2};
 
    int side;
    std::cout << "Enter side: ";
    std::cin  >> side;
 
    const double pi = M_PI;
    // углы
    const double alpha = 120 * pi / 180;
    const double beta  = 30  * pi / 180;
    const double radius = side * std::sin(alpha) / std::sin(beta);
 
    const int d = int(radius * 2);
    if(d < Lines && d < Chars && d > 0)
    {
        const size_t numPoints = 6;
        const double angle = 2 * pi / numPoints;
 
        Point points[numPoints];
        for(size_t i = 0; i < numPoints; ++i)
        {
            points[i].x = int(center.x + radius * std::sin(i * angle));
            points[i].y = int(center.y + radius * std::cos(i * angle));
        }
        paintFigure<&nextPoint>(screen, Chars + 1, points, numPoints);
    }
    else
    {
        std::cerr << "Figure size is not in [1:20]\n";
    }
}

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