Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
1

Простая графическая система

27.03.2013, 12:27. Показов 1648. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здарова!
Решаю задачку:
Реализуйте простую графическую систему, используя доступные на вашем компьютере графические средства (если их нет — используйте ASCII представление, где пиксел, это знакоместо): Window(n,m) создает на экране область размером nxm. Координаты декартовы. Окно w типа Window имеет координаты w.current(). Начальные координаты равны Point(0,0). Координаты можно задать с помощью w.current(p), где p имеет тип Point. Тип Point задается парой координат: Point(x,y). Тип Line специфицируется парой точек: Line(w.current(),p2); класс Shape является общим интерфейсом для Dot, Line, Rectangle, Circle и других фигур. Point не является Shape. Dot(p) представляет точку p на экране. Shape на экране не наблюдается до вызова draw(). Например: w.draw(Circle(w.current(),10)). Каждый Shape имеет девять контактных точек: e (east), w (west), n (north), s (south), ne, nw, se, sw и с (center). Например: Line(x.c(), y.nw()) создает линию из центра x в левый верхний угол y. После вызова draw() для Shape его текуцие координаты равны se(). Rectangle верхней левой и правой нижней вершинами: Rectangle(w.current(),Point(10,10)). В качестве простого теста изобразите простой детский рисунок «дом с крышей, два окна и дверь».

мб кто чо поможет или решение есть готовое?
А то я в ооп стиле никода не писал.

Добавлено через 4 минуты
Например от "Окно w типа Window имеет координаты w.current()." как это понимать? Оно, что должно напечатать или вернуть массив с размером окна? Головняк.

Добавлено через 2 минуты
Давайте господа подключайтесь решаем вместе. Задачка эта для начинающих из Страуструпа. Как раз я ее щас решаю подключаемся. Кто со мной тот герой.
Давайте кто первый решит , на скорость, тот и молодец
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.03.2013, 12:27
Ответы с готовыми решениями:

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

Простая графическая библиотека
Доброго времени суток! Мне нужно подключить графическую библиотеку к игре крестики нолики. Всё на...

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

Графическая оболочка
Здравствуйте) у меня возникла проблемка, у меня есть скомпелированная игра "Змейка", но проблема в...

16
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
27.03.2013, 12:28 2
Цитата Сообщение от ninja2 Посмотреть сообщение
А то я в ооп стиле никода не писал.
от чего бы не начать?
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
27.03.2013, 12:33  [ТС] 3
Цитата Сообщение от Jupiter Посмотреть сообщение
от чего бы не начать?
да придется мучить я ток хо побыстрее еще 12 задач про наследование нужно решить, главное первую вымучить, а остальные уже легко пойдут без вопросов.

Добавлено через 40 секунд
не люблю пропускать задачи, совесть потом мучает, лучше кое как сделать спустя рукава сделать чем пропустить.

Добавлено через 1 минуту
Да и задачка впринципе не сложная по порядку идеш создаешь классы да разбираться лень.

Добавлено через 27 секунд
лучше если б кто то готовое решение дал, а потом готовое решение разобрать.

Добавлено через 24 секунды
обучение быстрее пойдет, а то самому разбирать я времени много затрачу.

Добавлено через 49 секунд
Это ж известная задачка небось. Неужели никто не решал?
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
27.03.2013, 12:36 4
Цитата Сообщение от ninja2 Посмотреть сообщение
не люблю пропускать задачи, совесть потом мучает
а чужие решения брать не мучает?
Цитата Сообщение от ninja2 Посмотреть сообщение
главное первую вымучить
зачем вообще тогда решать если это мука?
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
27.03.2013, 12:41  [ТС] 5
Цитата Сообщение от Jupiter Посмотреть сообщение
а чужие решения брать не мучает?
Нет потому, что я потом заново перерешаю уже без подглядывания по чужому решению. Скорость обучения растет в разы. Самому разбирать много времени тратится.

Цитата Сообщение от Jupiter Посмотреть сообщение
зачем вообще тогда решать если это мука?
Скил набивать, потом уже будет легко не мука. . Яж говорю первую тяжело если не кода не делал, а затем уже легко идет. Как говорится второй раз не первый раз .
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
27.03.2013, 12:47 7
Цитата Сообщение от ninja2 Посмотреть сообщение
Нет потому, что я потом заново перерешаю уже без подглядывания по чужому решению. Скорость обучения растет в разы.
для тренировки памяти есть более эффективные способы

Цитата Сообщение от ninja2 Посмотреть сообщение
Скил набивать, потом уже будет легко не мука.
ну дык набивай - пиши код сам, а сюда приходи с нароботками и вопросами
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
27.03.2013, 12:52  [ТС] 8
Не мне без ВИНАПИ я его еще не учил.

Добавлено через 1 минуту
Цитата Сообщение от Jupiter Посмотреть сообщение
для тренировки памяти есть более эффективные способы


ну дык набивай - пиши код сам, а сюда приходи с нароботками и вопросами
Ок. Я значит буду задавать конкретные вопросы мелкие по теме.

Добавлено через 1 минуту
Все продолжаю делать возникнуть вопросы сюда кину.
0
-=ЮрА=-
27.03.2013, 12:55
  #9

Не по теме:

Цитата Сообщение от ninja2 Посмотреть сообщение
Скил набивать, потом уже будет легко не мука
- ну так как ты тогда набъёшь тэлэнт если простого кода испугался? Там не АПА а обычная консолька с функциями GDI, единственная функция АПИ в проекте
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
HWND hWnd = GetForegroundWindow();
, которая получает дескрптор окна консоли, и всё.
Цитата Сообщение от ninja2 Посмотреть сообщение
Не мне без ВИНАПИ я его еще не учил.
- поищи тогда примеры с устаревшим graphics.h

1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
27.03.2013, 16:30  [ТС] 10
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение

Не по теме:

- ну так как ты тогда набъёшь тэлэнт если простого кода испугался? Там не АПА а обычная консолька с функциями GDI, единственная функция АПИ в проекте , которая получает дескрптор окна консоли, и всё.
- поищи тогда примеры с устаревшим graphics.h

Нет я уже сам сделаю свою программу без примеров по условию в задаче.
Все не помогаем либо готовое решение, что касается задачи конкретно по описанию в условии, либо не флудим.

Добавлено через 3 часа 25 минут
Я от все немогу никак придумать как же его реализовать?
От допустим я создаю класс Window, это как бы окно класс Shape это производный абстрактный класс от Window, а от Shape уже производные все остальные классы.
Я представил класс Window как двумерный массив mass, размером двести на двести.
В начале мы просто инициализируем окно вызовом Window w(40, 40) например 40 на 40 размером. все есть.
Дальше я создал класс Line : public Shape ( Shape : public Window). Естественно в Window мы создаем public двумерный массив mass, чтобы мы могли его редактировать из остальных классов. Потом уже в конце при вызове Window:: print() вызвать картину на экран.

Так от у меня возникли вопросы по поводу конструирования классов. От допустим возьмем функцию Line::draw(). Она имеет доступ к массиву Window::mass (двумерному, это как бы окно).
Но если я в программе вначале инициализирую Window w(40,40), то функция Line::draw() не видит этот объект инициализированный, она как бы обращается к пустому классу, либо к новому классу хз.
Так от интересно как же быть?
мб создать массив mass статическим и размеры его? Чтобы они были видны с любого экземпляра класса?
Или мб я сразу не правильно создаю? хз.

От если б был бы mass статический, то мы б легко его могли заполнять вызовом разных draw() из разных классов либо через указатель на базовый класс. А затем уже вконце вывести само окно на печать.

Наверно принцип программы сводится к заполнению массива который есть как бы окно? Правильно ж я понял?

Добавлено через 6 минут
Jupiter, Помоги с алгоритмом тыж опытный!
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
27.03.2013, 16:31 11
Цитата Сообщение от ninja2 Посмотреть сообщение
От допустим я создаю класс Window, это как бы окно класс Shape это производный абстрактный класс от Window, а от Shape уже производные все остальные классы.
почему Shape является окном? обоснуй это.
если следовать этой логике, то спички являются спичечным коробком
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
27.03.2013, 16:42  [ТС] 12
Цитата Сообщение от Jupiter Посмотреть сообщение
почему Shape является окном? обоснуй это.
Это я описался Shape это производный класс от Window

Добавлено через 3 минуты
Window -> Shape , от Shape идут все остальные классы Dot, Line, Rectangle, public наследование, чтобы можно иметь доступ к Window::mass это как бы представление окна Window. Но мне не понятно правильно ли я делаю. И вообще от кажется сам Window::mass нужно сделать static, чтобы можно было его редактировать из классво разных фигур Dot::draw(), Line::draw(), Rectangle::draw(), потому что они обращаются как бы к новому экземпляру Window

Добавлено через 5 минут
Jupiter, Не ну ты хоть понял как я имею введу сделать? От имеется массив Window::mass[200][200].
При инициализиции мы задаем границы Window::n, Window::m.
А дальше просто Shapе наследует Window Line наследует Shape и в Line мы имеем доступ к n, m и mass, и меняем значение его, как бы в линию. Также и другую фигуру. А потом просто Window:: print() и вывилось окно в консоле, то есть массив mass.
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
27.03.2013, 16:45 13
Цитата Сообщение от ninja2 Посмотреть сообщение
Это я описался Shape это производный класс от Window
вот я и спрашиваю, почему ты так сделал?

фигура не является окном:
1) включи голову и ещё раз подумай;
2) прочитай задачу ещё раз (ну нет там и слова про Window -> Shape);
3) прочитай главу про наследование ещё раз, сконцентрировав внимание не на синтаксисе, а на том когда применяется наследование и для чего.

окно должно агрегировать фигуры
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
27.03.2013, 16:56  [ТС] 14
Цитата Сообщение от Jupiter Посмотреть сообщение
вот я и спрашиваю, почему ты так сделал?

фигура не является окном:
1) включи голову и ещё раз подумай;
2) прочитай задачу ещё раз (ну нет там и слова про Window -> Shape);
3) прочитай главу про наследование ещё раз, сконцентрировав внимание не на синтаксисе, а на том когда применяется наследование и для чего.

окно должно агрегировать фигуры
Мне нужно иметь доступ к окну или хз, поэтому я сделал наследование Shape : public Window.? Или нужно было сделать в Window friend class Shape; ?

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

От примерно по такому коду:
C++
1
2
3
4
5
6
Window w(30,30) //создает размер окна
Point a(3,4);
Point b(5,6);
Line (a,b);//заполняет static Window::mass (рисует в нем линию)
Rectangle(тоже передаем чото) //тоже заполняет
w.print();//вывод mass на экран, как бы окна
Добавлено через 2 минуты
А ну я понял что ты имееш в виду нужно в каждом классе хранить указатель на объект Window. Правильно ж?

Добавлено через 1 минуту
Да впринципе правильно создаем объект Window w(40, 40) и при инициализации фигур передаем указатель на объект и все нам не нужно наследовать Window и делать статические элементы?

Добавлено через 57 секунд
Jupiter, Да ты прав. Впринципе так как то проще.
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
27.03.2013, 17:02 15
Цитата Сообщение от ninja2 Посмотреть сообщение
Мне нужно иметь доступ к окну или хз, поэтому я сделал наследование Shape : public Window.?
наследование тут не нужно, передавай окно параметром в метод draw каждой фигуры т.е. примерно так
C++
1
2
3
4
void Window::draw(const Shape& shape)
{
    shape.draw(*this);
}
в окно добавь метод drawDot который рисует одну точку и далее
C++
1
2
3
4
void Dot::draw(Window& wnd)
{
    wnd.drawDot(mX, mY);
}
1
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
28.03.2013, 13:14  [ТС] 16
Цитата Сообщение от Jupiter Посмотреть сообщение
наследование тут не нужно, передавай окно параметром в метод draw каждой фигуры т.е. примерно так
C++
1
2
3
4
void Window::draw(const Shape& shape)
{
    shape.draw(*this);
}
в окно добавь метод drawDot который рисует одну точку и далее
C++
1
2
3
4
void Dot::draw(Window& wnd)
{
    wnd.drawDot(mX, mY);
}
Да вринципе я смотрю тут одного варианта не существует уже три варианта вижу, так как я с наследованием тоже можно было по идее сделать и работало б.
Спс буду дальше разбирать до готовой версии.

Добавлено через 19 часов 36 минут
Здарова!
От код кое как сделал, фиг его знает, что попало, пока токо для одного класса Line рабочий:

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
#include <iostream>
using std::cout;
using std::endl;
 
struct Point
{
    int x;
    int y;
    //konctryktor po ymolchaniyu
    Point():x(0),y(0){}
    //konctryktor preobrazovani9
    Point(int x, int y):x(x),y(y){}
    //konctryktor kopii
    Point(const Point& a):x(a.x),y(a.y){}
    //zadanie koordinat
    void set(int x, int y){x=x;y=y;}
};
 
class Window;
 
class Shape
{
    Point e;//east(vocxod)
    Point w;//west(zaxod)
    Point n;//north(cever)
    Point s;//south(yug)
    
    Point ne;
    Point nw;
    Point se;
    Point sw;
    Point c;//center
public:
    virtual void draw(Window*){};
    //konctryktor   
};
 
class Window
{
public:
    int mass[200][200];//massiv picselov
    int m;
    int n;
    Point* p;//nach koordinatu
 
    //konctryktor po ymolchaniyu
    Window()
    :m(0),n(0)
    {
        p=new Point;//cozdaem ykazatel6 na ob6ekt
    }
    
    //konctryktor preobrazovani9
    Window(int m, int n)
    :m(m),n(n)
    {
        p=new Point;//cozdaem ykazatel6 na ob6ekt
    }
    
    //vuzuvaetc9 dl9 zadani9 koordinat
    Point current(Point a)
    {
        p->x=a.x;
        p->y=a.y;
        return *p;
    }
    
    //vuzuvaetc9 dl9 pechati koordinat
    Point current()
    {
        //cout <<p->x<<' '<<p->y<<endl;
        return *p;
    }
    
    //vuvod oblacti
    void print()
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                cout <<mass[i][j];
            }
            cout <<endl;
        }
    }
    
    void draw(Shape& a)
    {
        a.draw(&*this);//peredaem ykazatel6
    }
};
 
class Line : public Shape
{
    Point* a;
    Point* b;
public:
    //konctryktor
    Line(Point c, Point d)
    {
        a=new Point;
        a=&c;
        b=new Point;
        b=&d;
    }
    
    void draw(Window* w)
    {
        cout <<"drow Line"<<endl;
        
        //cout <<a->mass[2][3]<<endl;
        int x=a->x;
        int y=a->y;
        int x1=b->x;
        int y1=b->y;
    
        int x2;
        int y2;
    
        if(x<x1&&y<y1) //0,0 10,10
        {
            x2=x1-1;
            y2=x1-1;
            w->mass[x][y]=1;
            w->mass[x1][y1]=1;
            //naxodim tochki pr9moi
    
            while(x2>x&&y2>y)
            {
                w->mass[x2][y2]=1;
                x2=x2-1;
                y2=y2-1;
                //cout <<x2<<' '<<y2<<endl;
            }
        }
        if(x<x1&&y>y1)
        {
            x2=x+1;
            y2=y-1;
            w->mass[x][y]=1;
            w->mass[x1][y1]=1;
            //naxodim tochki pr9moi
        //  cout <<x2<<' '<<y2<<endl;
            while(x2<x1&&y2>y1)
            {
                w->mass[x2][y2]=1;
                x2=x2+1;
                y2=y2-1;
                //cout <<x2<<' '<<y2<<endl;
            }
        }
    }
};
 
int main()
{
    Window w(40,30);
    w.print();//vuvod pyctogo macciva
    
    Point p2(10,10);
    Line L(w.current(),p2);
    w.draw(L);//ricyet pervyyu liniyu (0,0 10,10)
    
    w.current(Point(0,20));
    Line L1(w.current(),p2);
    w.draw( L1 );//ricyet vtoryyu liniyu (0,20 10,10)
    
    w.print();//vuvod na ekran
    
    return 0;
}
Но явно что то я не так делаю, например в классе Shape я никак не использую 9 переменных? хз как их применить?
Я так могу для каждого класса передать например w.current() и вторую точку и тупо нарисовать фигуру. А как же эти переменные использовать?
Да и вообще шото не то походу.

Добавлено через 53 секунды
Да и линии токо по диагонали рисуются.

Добавлено через 3 минуты
там наверно они должны быть статические раз после вызова Shape:draw w current() устанавливается в значение переменной se то есть в правый нижний угол. ?????

Добавлено через 1 минуту
Господа помогайте я уже замучился с ней, а еще под эту задачку дальше штук 5 упражнений ее дорабатывать.

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

Добавлено через 16 минут
Можно конечно придумать, что при инициализации например Line(Point1, Point2) можно считать это как бы верх низ и из них можно определить все остальные 9 точек. хз. как бы предположить, что мы квадрат передаем, только для Rectangle уже прямоугольник. А для круга линии и точки квадрат. Хз. Да мб не заморачиватся бахнуть как попало да и все оно мб мне и нафиг не пригодиться. Скорее всего.

Добавлено через 1 минуту
Satanаx 8 помогай! Чо смотриш?

Добавлено через 5 минут
Меня утета строчка в условии задачи непонятна "Line(x.c(),y.nw()) создает линию из центра x в левый верхний угол y" Это как понимать то? Шо это за х и шо это за у? Ну видимо объекты типа Point. Ну токо еще он какие, то функции им добавил. Да запутано все.
0
979 / 196 / 33
Регистрация: 26.09.2012
Сообщений: 2,041
29.03.2013, 19:15  [ТС] 17
Все как бы доделал http://www.kselax.ru/2013/03/p... /#more-497
0
29.03.2013, 19:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.03.2013, 19:15
Помогаю со студенческими работами здесь

Графическая заставка С++
Здравствуйте,прошу помочь, есть программа графической заставки, в процессе выполнения которой по...

Графическая библиотека C++
Помогите пожалуйста. Есть ли какая-нибудь простая, но мощная графическая библиотека C++??? Дайте...

Графическая заставка на С
кто может поделиться кодом заставки на С с динамическими объектами.

Графическая библиотека
Здравствуйте ! Нужна простая графическая библиотека для построения графиков. Со встроенными осями...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru