Толщина линий для класса Shape.

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

Изображение Shape на экране компьютера выполняется в виде множества линейных сегментов. Реализуйте операции варьирующие внешний вид этих сегментов: s.thickness(n) устанавливает толщину линии в 0,1,2 или 3 единицы. Где 2 соответствует умолчательному значению, а 0 невидимой линии. Кроме того сегменты могут быть solid (сплошная линия), dashed (пунктирная) и dotted (из точек), что устанавливается функцией Shape::outline().

Гаспада как мы видим эту задачку так же как и первую из этой серии вот ее ссылка http://www.kselax.ru/2013/03/prostaya-graficheskaya-sistema/ нужно решать зная кокое нибуть АПИ графическое, потому, что вручную очень тяжело строить линии либо прямоугольники, а круг вообще хз как его построить из пикселов в один символ 🙂 . Поэтому так как я новичок и не знаю доступные на моем компьютере графические средства, а использую символ как пиксель, то я просто эту задачку сделаю для одного класса Line, для линии так сказать. Просто как пример аналогично она делается и для всех остальных классов. Ну что ж поехали.

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

Файл 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

Файл 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

Файл 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

Файл 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)
	{
	
		if(solid=="solid")
		{
			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;
			//cout <<"tol= "<<tol<<endl;exit(1);

			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;
				}
			}
		
			if(tol==3)
			{
				cout <<"tol= "<<tol<<endl;
				cout <<"drow Line"<<endl;
		
				//cout <<a->mass[2][3]<<endl;
				int x=a->x;
				int y=a->y+1;
				int x1=b->x;
				int y1=b->y+1;
			cout <<"x= "<<x<<" y= "<<y<<" x1= "<<x1<<" y1= "<<y1<<endl;
				int x2;
				int y2;
				//cout <<"tol= "<<tol<<endl;exit(1);

				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;
					}
				}
				//exit(1);
			}
			//yctanovka v se tekychix koordinat
		
			w->current(se);
			//exit(1);
		}
		else if(solid=="dotted")
		{
			cout <<"dotted"<<endl;
			exit(1);
		}
		else if(solid=="dashed")
		{
			cout <<"dashed"<<endl;
			exit(1);
		}
	}
};

#endif

И сам файл main.cpp:

//
#include <iostream>
using std::cout;
using std::endl;

#include "Point.h"
#include "Window.h"
#include "Shape.h"
#include "Line.h"

int main()
{
	Window w(60,30);
	
	Point p1(0,10);
	Point p2(0,20);
	Line L(p1,p2);
	L.thickness(3);
	//L.outline("dashed"); //octanovitc9 i vuvedet dashed.
	w.draw(L);
	
	w.print();
	
	return 0;
}

Ну и все. Это как пример работы. Здесь ничего нет такого необычного. Просто если использовать символ как пиксель, то трудно задать толщину линии, Ну толщину не трудно, та даже и пунктирную линию нарисовать. Толщину, то я задал на одном примере. Полно херни писать опишу как я делал.

Я добавил в базовый класс два метода Shape::thickness() и Shape::outline()  и все они устанавливают значения толщины линии и форму самой линии. Так что так. Решаем следующую.

rss