Тип Text.

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

Добавьте тип Text к вашей графической системе http://www.kselax.ru/2013/03/prostaya-graficheskaya-sistema/ . Text это прямоугольный Shape, внутри которого выводятся символы. По умолчанию каждый символ занимает одну позицию по вертикали и горизонтали.

Да эта задачка куда не шло сделаем не в общем а обособленно. Никаких проверок я естественно делать не буду, там маленький прямоугольник, а большой текст не вмещается и т.д. и т.п. Просто одну рабочую версию. Все погнали.

Все как бы сделал токо не обособленно. Переделал класс Window для char как бы окно стало из символов char.

Файл 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:
	char mass[200][200];//massiv picselov
	int m;
	int n;
	Point* p;//nach koordinatu

	//konctryktor po ymolchaniyu
	Window()
	:m(0),n(0)
	{
		for(int i=0;i<200;i++)
		{
			for(int j=0;j<200;j++)
				mass[i][j]=' ';
		}
		p=new Point;//cozdaem ykazatel6 na ob6ekt
	}
	
	//konctryktor preobrazovani9
	Window(int m, int n)
	:m(m),n(n)
	{
		for(int i=0;i<200;i++)
		{
			for(int j=0;j<200;j++)
				mass[i][j]=' ';
		}
		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

#include <string>
using std::string;

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
	int tol;
	string solid;
	
	void thickness(int a)
	{
		tol=a;
	}
	
	void outline(string s)
	{
		solid=s;
	}
	
	virtual void draw(Window*){};
	//konctryktor
	//Shape(){}
	Shape(const Point& a, const Point& b)
	:tol(2),solid("solid")
	{
		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

И файл Text.h:

//ob69vlenie klacca Text
#ifndef TEXT_H
#define TEXT_H

#include <string>
using std::string;

class Text : public Shape
{
	Point* a;
	Point* b;
	string tex;
public:
	//konctryktor
	//inicializaci9 camogo shape 9 tochek po diagonali
	Text(Point c, Point d,string e)
	:Shape(c,d),tex(e)
	{
		a=new Point;
		a=&c;
		b=new Point;
		b=&d;
	}
	
	void draw(Window* w)
	{
		cout <<"mu cdec6 "<<tex<<endl;
		//exit(1);
		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;
		x2=x;
		w->mass[x][1]=1;
		w->mass[x1][y1]=1;
		
		for(int i=0;i<=x1;i++)
		{
			w->mass[x][x2]='1';
			x2++;
		}
		x2=x;
		for(int i=0;i<=x1;i++)
		{
			w->mass[x2][x]='1';
			x2++;
		}
		x2=x;
		for(int i=0;i<=x1;i++)
		{
			w->mass[x1][x2]='1';
			x2++;
		}
		x2=x;
		for(int i=0;i<=x1;i++)
		{
			w->mass[x2][x1]='1';
			x2++;
		}
		
		x2=x+1;
		//w->mass[1][1]=8;
		int count=0;
		for(int i=x+1;i<tex.length();i++)
		{
			w->mass[x+1][x2]=tex[count++];
			x2++;
			//cout <<"x+1= "<<x+1<<" x2= "<<x2<<endl;
		}
	}
};

#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 "Text.h"

int main()
{
	Window w(60,30);
	
	Point p1(0,0);
	Point p2(15,15);
	Text T(p1,p2,"Hellow world");
	w.draw(T);
	
	w.print();
	
	return 0;
}

и то что у нас получилось на экране в результате работы программы:

Снимок экрана от 2013-03-30 12:12:13

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

rss