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

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

Войти
Регистрация
Восстановить пароль
 
Настасья_12
0 / 0 / 0
Регистрация: 25.11.2015
Сообщений: 4
#1

Структурировать программу, разбив её на отдельные процедуры - C++

18.01.2016, 17:13. Просмотров 161. Ответов 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
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
//Точка внутри контура - Затравочная точка
//подключаем стандартные библиотеки для работы
#include "stdafx.h"
#include <fstream>
#include <string.h>
#include <iostream>
#include "conio.h"
#include <Windows.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
 
using namespace std;
 
void Create(int R, int G, int B)
{
    int x = -1, y = -1, x0, y0;
 
    HDC hDC = GetDC(GetConsoleWindow()); 
    HPEN Pen = CreatePen(PS_SOLID, 1, RGB(R, G, B));//ручка;  r, g, b - красная, зеленая и синяя составляющие цвета
    SelectObject(hDC, Pen); //Выбиpает логический объект для DC. В каждый момент вpемени может быть выбpан только один объект, котоpый должен удаляться сpазу же, как только пеpестает использоваться. DC: Идентификатоp контекста устpойства. hObject: Каpта бит, кисть, шpифт, пеpо или область.
 
    MoveToEx(hDC, 98, 0, NULL); //Функция MoveToEx обновляет текущую позицию в заданной точке и, возможно, возвращает предыдущую позицию
    LineTo(hDC, 98, 400); //Рисует линию, используя выбpанное пеpо, с текущей позиции до указанной конечной точки
    // HDC - дескриптор контекста устройства
 
    cout << "x0:";  cin >> x0; //ввод x0
    cout << "y0:";  cin >> y0; //ввод y0
 
    MoveToEx(hDC, x0 + 100, y0, NULL); // с заданными значениями x0 и y0
 
    int i;
    for (i = 1; (x != x0) || (y != y0); i++)
    {
        cout << 'x' << i << ": ";  cin >> x;
        cout << 'y' << i << ": ";  cin >> y;
        cout << endl;
        LineTo(hDC, x + 100, y);
    }
}
 
void Rectangle(int R, int G, int B) //треугольник
{
    HDC hDC = GetDC(GetConsoleWindow());
    HPEN Pen = CreatePen(PS_SOLID, 3, RGB(R, G, B));
    SelectObject(hDC, Pen);
    int qq, ww, ee, aa;
    cout << "qq:";  cin >> qq;// границы треугольника
    cout << "ww:";  cin >> ww;
    cout << "ee:";  cin >> ee;
    cout << "aa:";  cin >> aa;
    MoveToEx(hDC, ee, aa, NULL);
 
    LineTo(hDC, qq, qq);
    LineTo(hDC, ww, qq);
    LineTo(hDC, ee, aa);
}
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
 
    int c;
    HDC hDC = GetDC(GetConsoleWindow());
 
    int R, G, B;
    cout << "Border color:" << endl; //Цвет границы
    cout << "R:";  cin >> R;
    cout << "G:";  cin >> G;
    cout << "B:";  cin >> B;
    Rectangle(R, G, B);
    int RGB = ((B * 256 * 256 + G * 256 + R));
 
    cout << endl << "Fill color:" << endl; // Цвет заливки
    cout << "R:";  cin >> R;
    cout << "G:";  cin >> G;
    cout << "B:";  cin >> B;
 
 
    int STEKX[3000]; //координаты затравочных точек
    int STEKY[3000];
    int STEKP[3000]; //координата х правого конца строки затравочной точки
 
    int x0, y0, x, y;
    int b1, b2, bb1, bb2;
    cout << endl;
    cout << "X0:";  cin >> x0;
    cout << "Y0:";  cin >> y0;
 
    STEKX[0] = x0 + 100; int beg = 0; int end = 1;
    STEKY[0] = y0;
    STEKP[0] = x0;
    int lw = 0, pw = 0, pixv, pixn;
 
    while (beg != end)
    {
 
        x = STEKX[beg];
        y = STEKY[beg];
        pw = STEKP[beg];
 
        while (RGB != GetPixel(hDC, x, y))  x--; //идем влево, пока не встретим границу
 
        if (RGB == GetPixel(hDC, x, y)) x++; //если это граница, то делаем шаг вправо
        lw = x; //запомнили левую границу, клетка, которую нужно закрасить
 
        b1 = b2 = bb1 = bb2 = 1;
        while (x <= pw) //пока х меньше правой границы из пред шага
        {
            pixv = GetPixel(hDC, x, y - 1); //пиксель на строчку выше
            pixn = GetPixel(hDC, x, y + 1); //на строчку ниже
            if (pixv == RGB) b1 = 1; //если в пикселе на строчку выше мы нашли границу
            if (pixn == RGB) b2 = 1;
 
            if (bb1 == 1 && bb2 == 1 && (RGB != GetPixel(hDC, x, y)))
            {
                SetPixel(hDC, x, y, RGB(R, G, B));
                if (b1 && (0 == pixv)) //закрасить пиксель на верхней строчке, если б1=1
                {
                    //если встретили точку, которою нужно закрасить выйдя из границы, добавляем в список затравочных
                    STEKX[end] = x;  STEKY[end] = y - 1; end++; b1 = 0;
                }
                if (b2 && (0 == pixn)) //закрасить пиксель на верхней строчке, если б=1
                {
                    STEKX[end] = x;  STEKY[end] = y + 1; end++; b2 = 0;
                }
            }
 
            x++;
        }
 
        if (x == pw + 1) x--;
 
        if (RGB == GetPixel(hDC, x, y)) //если на границе, то шаг влево до первой точки, которую нужно закрасить
        {
            while (RGB == GetPixel(hDC, x, y)) x--;
            pw = x; //обозначаем ее ка правую точку в след шаге
        }
 
        while (RGB != GetPixel(hDC, x, y)) //идем от крайней правой точки предыдущего шага до правого края
        {
            pixv = GetPixel(hDC, x, y - 1);
            pixn = GetPixel(hDC, x, y + 1);
            if (pixv == RGB) b1 = 1;
            if (pixn == RGB) b2 = 1;
 
            SetPixel(hDC, x, y, RGB(R, G, B)); x++; //Рисует элемент изображения в указанной точке
            if (b1 && (0 == pixv))
            {
                STEKX[end] = x;  STEKY[end] = y - 1; end++; b1 = 0;
            }
            if (b2 && (0 == pixn))
            {
                STEKX[end] = x;  STEKY[end] = y + 1; end++; b2 = 0;
            }
        }
        pw = x - 1; //запоминаем правую крайнюю точку
 
        if ((b1 + b2) == 0) { STEKP[end - 1] = pw; STEKP[end - 2] = pw; } //нашли 2 затравочных точки
        if ((b2 + b1) == 1)  STEKP[end - 1] = pw; //нашли только либо сверху, либо снизу
 
 
        beg++; //  прошли одну строку и начало стека сместилось
    }
 
    cin >> c;
 
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.01.2016, 17:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Структурировать программу, разбив её на отдельные процедуры (C++):

Разбить программу на отдельные файлы - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main() { ifstream...

Как разбить программу на отдельные модули в количестве 3 штук? - C++
#include &lt;iostream&gt; using namespace std; int main() { int n; int i = 0; int s = 0; int z; cout &lt;&lt; &quot;Entered number...

Определение классов, их реализацию, демонстрационную программу поместить в отдельные файлы. - C++
Работаю в консольном приложении CLR в vs 2010, в задании сказано: &quot;Определение классов, их реализацию, демонстрационную программу поместить...

Как правильно структурировать проэкт с++ ? - C++
Столкнулся с такой проблемкой, касающейся подключения заголовочных файлов в с++: Если посмотреть заголовочные файлы, к примеру пусть...

Как структурировать в редакторе куски кода в отдельные блоки - C#
Такой вопрос, больше не по C#, а по самому Visual Studio Когда создаёшь обработчик события, ну к примеру: + private void...

Написать программу с вводом выводом вектора через отдельные процедуры - C (СИ)
Написать прогу с вводом выводом вектора через отдельные процедуры.Вектор объявить глобально ( действует на все функции) а размерность...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2016, 17:13
Привет! Вот еще темы с ответами:

Как правильно структурировать программу - Visual Basic
У меня есть повторяющаяся процедура (или функция) Как правильно структурировать программу. Наверное, эту повторяющуюся процедуру выделить...

Разбить строку, состоящую из строк кода на отдельные блоки (main, процедуры) - Java SE
Дан вот такой код в строке: using System; using System.Collections.Generic; using System.Collections.ObjectModel; using...

Составить программу, обращающую отдельные слова в предложение - Turbo Pascal
Дано предложение. Составить программу, обращающую отдельные слова в предложение ,но сохраняющая порядок слов.

Составить программу, обращающую отдельные слова в предложении, но сохраняющую порядок слов - Turbo Pascal
Помогите плз с задачкой Дано предложение. Составить программу, обращающую отдельные слова в предложении, но сохраняющую порядок...


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

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

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