Предыдущий пост -

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

Рубрика: C++, Дата: 26 March, 2013, Автор:
Tags:

Реализуйте простую графическую систему, используя доступные на вашем компьютере графические средства (если их нет – используйте 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)). В качестве простого теста изобразите простой детский рисунок “дом с крышей, два окна и дверь”.

Да это от задачка большое условие.

По ходу дела задачи пришлось поднять две темы:

  1. Наследование классво в С++, ну там типы как бы наследования. http://www.kselax.ru/2013/03/nasledovanie-klasov-v-s/
  2. Да и трудности были с инициализацией базового класса, пришлось также создать пост. http://www.kselax.ru/2013/03/inicializaciya-bazovogo-klassa-v-s/

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

Как я делал? Для начала создал класс Window в котором метод Window::draw(), которые принимает объект типа Shape то есть как бы указатель полиморфно. вызывает функции каждого Shape::draw(), от примерно так:

Window::draw(Shape& Shape)
{
  Shape::draw(&*this);//передаем указатель.
}

Что еще сказать сделал я как попало. Вот код:

Класс Window.h:

//klacc Window cozdaet oblact6 nxm
#ifndef WINDOW_H
#define WINDOW_H

#include "Point.h"
#include "Shape.h"

//prednamerennoe ob69vlenie
class Shape;

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
	}
};

#endif

класс Point.h:

//klacc Point
#ifndef POINT_H
#define POINT_H

struct Point
{
	int x;
	int y;
	//konctryktor po ymolchaniyu
	Point():x(0),y(0){}
	//konctryktor preobrazovani9
	Point(int a, int b):x(a),y(b){}
	//konctryktor kopii
	Point(const Point& a):x(a.x),y(a.y){}
	//zadanie koordinat
	void set(int a, int b){x=a;y=b;}
};

#endif

класс Shape.h:

//bazovui klacc dl9 figyr
#ifndef SHAPE_H
#define SHAPE_H

class Window;
#include "Point.h"
#include "Window.h"

#include <cstdlib>
using std::exit;

class Shape
{
public:
	Point e;//east(vocxod)
	Point w;//west(zaxod)
	Point n;//north(cever)
	Point s;//south(yug)
	
	Point ne;//levui verxnii
	Point nw;//pravui verxnii
	Point se;//levui nijnii
	Point sw;//levui nijnii
	Point c;//center

	virtual void draw(Window*){};
	//konctryktor
	//Shape(){}
	Shape(const Point& a, const Point& b)
	{
		cout <<"k Shape"<<endl;
		//cout <<a.x<<' '<<a.y<<endl;
		//cout <<b.x<<' '<<b.y<<endl;
		nw=a;
		se=b;
		//cout <<se.x<<' '<<se.y<<endl;
		//cout <<nw.x<<' '<<nw.y<<endl;
		//cout <<se.x<<' '<<se.y<<endl;
		ne.x=b.x;
		ne.y=a.y;
		//cout <<ne.x<<' '<<ne.y<<endl;
		sw.x=a.x;
		sw.y=b.y;
		//cout <<sw.x<<' '<<sw.y<<endl;
		n.x=b.x/2;
		n.y=a.y/2;
		//cout <<n.x<<' '<<n.y<<endl;
		w.x=a.x/2;
		w.y=b.y/2;
		//cout <<w.x<<' '<<w.y<<endl;
		s.x=b.x/2;
		s.y=b.y;
		//cout <<s.x<<' '<<s.y<<endl;
		e.x=b.x;
		e.y=b.y/2;
		//cout <<e.x<<' '<<e.y<<endl;
		c.x=b.x/2;
		c.y=b.y/2;
		//cout <<c.x<<' '<<c.y<<endl;
		//exit(1);
	}
};

#endif

класс Dot.h:

//ob69vlenie Dot predctavl9et tochky na ekrane
#ifndef DOT_H
#define DOT_H

#include "Shape.h"
#include "Point.h"

class Dot : public Shape
{
	Point* p;
public:
	//konctryktor po ymolchaniyu
	Dot(Point p)
	:Shape(p,p),p(&p)
	{
	}
	
	void draw(Window* w)
	{
		cout <<"drow Point"<<endl;
		
		//cout <<a->mass[2][3]<<endl;
		w->mass[p->y][p->x]=7;
		//yctanovka v se tekychix koordinat
		w->current(se);
		//exit(1);
	}
	void set(Point& a)
	{
		p=&a;
	}
};

#endif

Класс Line.h:

//ob69vlenie klacca Line
#ifndef LINE_H
#define LINE_H
#include <cstdlib>
using std::exit;

#include "Shape.h"
#include "Point.h"

class Line : public Shape
{
	Point* a;
	Point* b;
public:
	//konctryktor
	//inicializaci9 camogo shape 9 tochek po diagonali
	Line(Point c, Point d)
	:Shape(c,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;
	cout <<"x= "<<x<<" y= "<<y<<" x1= "<<x1<<" y1= "<<y1<<endl;
		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)//0,20 10,10
		{
			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;
			}
		}
		if(x==x1&&y<y1)//0,0 0,10
		{
			//cout <<"mu tyt"<<endl;
			x2=x+1;
			y2=y;
			w->mass[x][y]=1;
			//mass[x1][y1]=1;
			//naxodim tochki pr9moi
			cout <<x2<<' '<<y2<<endl;
			while(y1>x2)
			{
				w->mass[x2][y2]=1;
				x2=x2+1;
				y2=y2;
				//cout <<x2<<' '<<y2<<endl;
			}
		}
	
		if(y==y1&&x<x1)//0,0 10,0
		{
			cout <<"mu tyt"<<endl;
			x2=x+1;
			y2=y;
			w->mass[y][x]=8;
			//mass[x1][y1]=1;
			//naxodim tochki pr9moi
			cout <<x2<<' '<<y2<<endl;
			//exit(1);
			while(x1>x2)
			{
				w->mass[y][x2]=1;
				x2=x2+1;
				y2=y2;
				//cout <<x2<<' '<<y2<<endl;
			}
		}
		
		//yctanovka v se tekychix koordinat
		
		w->current(se);
		//exit(1);
	}
};

#endif

Класс Rectangle.h:

//klacc Rectangle (pr9moygol6nik)
#ifndef RECTANGLE_H
#define RECTANGLE_H

#include "Shape.h"
#include "Point.h"

class Rectangle : public Shape
{
	Point* a;
	Point* b;
public:
	//konctryktor
	//inicializaci9 camogo shape 9 tochek po diagonali
	Rectangle(Point c, Point d)
	:Shape(c,d)
	{
		a=new Point;
		a=&c;
		b=new Point;
		b=&d;
	}
	
	void draw(Window* w)
	{
		cout <<"drow Rectangle"<<endl;
		//exit(1);
		//cout <<a->mass[2][3]<<endl;
		int x=a->x;
		int y=a->y;
		int x1=b->y;
		int y1=b->x;
	/*//cout <<"x= "<<x<<" y= "<<y<<" x1= "<<x1<<" y1= "<<y1<<endl;
		int x2;
		int y2;

		int x=0;//2
		int y=0;//1
		int x1=4;//4
		int y1=5;//5*/
		cout <<"x= "<<x<<" y= "<<y<<" x1= "<<x1<<" y1= "<<y1<<endl;
		int x2;
		int y2;
		x2=x;
		y2=y;
		//cout <<"ddddd= ";
		//w->current();
		//mass[0][1]=1;
		//mass[1][0]=1;
		//mass[2][1]=1;
		w->mass[x][y]=1;
		w->mass[x1][y1]=1;
		x2=x;
		for(int i=x;i<=x1;i++)
		{
			w->mass[x2][y]=1;
			x2++;
		}
		x2=x;
		for(int i=x;i<=x1;i++)
		{
			w->mass[x2][y1]=1;
			x2++;
		}
		x2=y;
		for(int i=y;i<=y1;i++)
		{
			w->mass[x1][x2]=1;
			x2++;
		}
		x2=y;
		for(int i=y;i<=y1;i++)
		{
			//cout <<x1<<' '<<x2<<endl;
			w->mass[x][x2]=1;
			x2++;
		}
		//yctanovka v se tekychix koordinat
		
		w->current(se);
		//exit(1);
	}
};

#endif

Класс Circle.h:

//klacc Circle
#ifndef CIRCLE_H
#define CIRCLE_H

#include "Shape.h"
#include "Point.h"

class Circle : public Shape
{
	void draw();
};

#endif

и сама main.cpp:

//Ricyem domik i dva okna
#include <iostream>
using std::cout;
using std::endl;

#include "Point.h"
#include "Window.h"
#include "Shape.h"
#include "Dot.h"
#include "Line.h"
#include "Rectangle.h"
#include "Circle.h"

int main()
{
	Window w(60,30);
	w.print();//vuvod pyctogo macciva
	
	//ricyem pr9moygol6nik
	Point p1(10,10);
	Point p2(50,20);
	Rectangle R(p1,p2);
	w.draw(R);
	
	
	//ricyem kruwy
	p2.set(0,20);
	Line L(p2,p1);
	w.draw(L);
	
	p2.set(20,0);
	p1.set(40,0);
	Line L1(p2,p1);
	w.draw(L1);
	w.print();
	
	Dot D(p2);
	for(int a=9,b=49; a>=0;a--)
	{
		p2.set(b,a);
		D.set(p2);
		w.draw(D);
		b--;
		cout <<"ee"<<endl;
	}
	w.print();
	
	//ricyem okna
	p1.set(12,12);
	p2.set(16,16);
	Rectangle R2(p1,p2);
	w.draw(R2);
	
	p1.set(12,18);
	p2.set(22,16);
	Rectangle R3(p1,p2);
	w.draw(R3);
	
	//ricyem dveri
	p1.set(12,30);
	p2.set(35,19);
	Rectangle R4(p1,p2);
	w.draw(R4);

	w.print();
	
	return 0;
}

И от что получается после работы этой программки щас я вам скрин покажу.

От результат работы программки:

Снимок экрана от 2013-03-29 17:00:08

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

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

Что сказать гамно задача.

Короче задача сводится к заполнению массива Window::mass. А затем уже вывод его на экран после токо как он заполнился.

Хз мб это аналогия с реальными графическими системами так сказать с не простыми, которые по пикселам заполняются, а затем выводятся на экран, как бы вывод кадра. Ну вринципе да другого принципа не может быть.  Все ну ее нафиг нихо я над ней мучится до ума доводить фиг с ней какая есть такая есть ну ее нафиг. 🙂 .

По другому как гамнокод это наверно не назовеш.

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

rss