C++实现简单绘图(类)

C++实现简单绘图(用类实现)

#include <fstream>
#include <iostream>
#include <math.h>
#include <vector>
using namespace std;
using std::vector;
class Figure
{
public:
	virtual void outprint(std::ostream &out) = 0;
	virtual void input_data(std::istream &is) = 0;
	virtual void draw(BlackBoard &board) = 0;
	//virtual Figure *create() = 0;
};
class Line:public Figure
{
	double _x1,_y1,_x2,_y2;
public:
	Line():_x1(0),_y1(0),_x2(0),_y2(0){}
	//virtual Figure *create(){return new Line;}
	void input_data(std::istream &is)
	{
		//std::cout<<"Point1_X: ";
		is>>_x1;
		//std::cout<<"Point1_Y: ";
		is>>_y1;
		//std::cout<<"Point2_X: ";
		is>>_x2;
		//std::cout<<"Point2_Y: ";
		is>>_y2;

	}
	virtual void draw(BlackBoard &board)
	{
		board.DrawLine(_x1,_y1,_x2,_y2);
	}
	virtual void outprint(std::ostream &out)
	{
		std::cout<<"Line{"
			<<"point1_X: "<<_x1<<", "
			<<"point1_Y: "<<_y1<<", "
			<<"point2_X: "<<_x2<<", "
			<<"point2_Y: "<<_y2<<"}"
			<<std::endl;
	}
};

class Rectangle:public Figure
{
	double _left,_top,_right,_bottom;
public:
	//virtual Figure *create(){return new Rectangle;}
	void input_data(std::istream &is)
	{
		//std::cout<<"Left: ";
		is>>_left;
		//std::cout<<"Top: ";
		is>>_top;
		//std::cout<<"Right: ";
		is>>_right;
		//std::cout<<"Bottom: ";
		is>>_bottom;
	}
	virtual void draw(BlackBoard &board)
	{
		board.DrawLine(_left,_top,_right,_top);
		board.DrawLine(_right,_top,_right,_bottom);
		board.DrawLine(_left,_bottom,_right,_bottom);
		board.DrawLine(_left,_top,_left,_bottom);
	}
	virtual void outprint(std::ostream &out)
	{
		std::cout<<"Rectangle{"
			<<"left: "<<_left<<", "
			<<"top: "<<_top<<", "
			<<"right: "<<_right<<", "
			<<"bottom: "<<_bottom<<"}"
			<<std::endl;
	}
};

class Circle:public Figure
{
	double _x,_y,_r;
public:
	//virtual Figure *create(){return new Circle;}
	void input_data(std::istream &is)
	{
		//std::cout<<"Center X: ";
		is>>_x;
		//std::cout<<"Center Y: ";
		is>>_y;
		//std::cout<<"Radius: ";
		is>>_r;
	}
	virtual void draw(BlackBoard &board)
	{
		board.DrawCircle(_x,_y,_r);
	}
	virtual void outprint(std::ostream &out)
	{
		std::cout<<"Circle{"
			<<"center_X: "<<_x<<", "
			<<"center_Y: "<<_y<<", "
			<<"radius: "<<_r<<"}"
			<<std::endl;
	}
};

class FigureManager
{
public:
    static FigureManager &handle()
    {
        static FigureManager manager;
        return manager;
    }
    // FigureManager类析构函数
    virtual ~FigureManager() {}
    // FigureManager类接口.
	vector<Figure *> _figures;
public:
    void input(std::istream &in);
    void display(BlackBoard &board);
    void print(std::ostream &out);
}; // class FigureManager类定义结束.


void FigureManager::input(std::istream &in)
{
	int count=0;
	for(count=0;count<100;count++)
	{
		int shape;
		do{
			//cout<<"请输入图形的种类(1:圆, 2:线(段), 3:矩形, 0:退出): ";
			in>>shape;
		}while(shape<0 && shape>3);
		if(shape==0) break;
		Figure *figure;
		switch(shape)
		{
		case 2:
			figure = new Line;
			break;
		case 3:
			figure = new Rectangle;
			break;
		case 1:
			figure = new Circle;
			break;
		}
		figure->input_data(in);
		_figures.push_back(figure);
	}
}

void FigureManager::display(BlackBoard &board)
{
	vector<Figure *>::iterator k;
	for(k=_figures.begin();k!=_figures.end();++k)
	{
		(*k)->draw(board);
	}
}

void FigureManager::print(std::ostream &out)
{
	vector<Figure *>::iterator k;
	for(k=_figures.begin();k!=_figures.end();++k)
	{
		(*k)->outprint(out);
	}
}
// 如果你的实现需要一些必要的初始化,可放在这个函数中,main函数会调用
// 如果没有,则忽略
void InitiateFigureManager()
{
}
  • 6
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要使用 C++ 和 Qt 实现一个绘图程序,可以按照以下步骤进行: 1. 安装 Qt 开发环境,并创建一个新的 Qt 项目。 2. 在 Qt 项目中创建一个绘图区域,可以使用 QWidget 或 QGraphicsView。 3. 实现鼠标事件处理函数,响应鼠标的点击、移动和释放事件,记录鼠标在绘图区域中的位置。 4. 实现绘制函数,根据鼠标位置和状态绘制图形,可以使用 QPainter 实现绘制操作。 5. 添加菜单或工具栏等界面元素,用于选择绘制的图形型和颜色等属性。 6. 完成绘图程序的其他功能,如保存和加载绘图文件、撤销和重做操作等。 示例代码: ```cpp #include <QtWidgets> class DrawWidget : public QWidget { public: DrawWidget(QWidget *parent = nullptr) : QWidget(parent) { setFixedSize(400, 400); setWindowTitle("Draw Widget"); } protected: void mousePressEvent(QMouseEvent *event) override { if (event->button() == Qt::LeftButton) { lastPoint = event->pos(); drawing = true; } } void mouseMoveEvent(QMouseEvent *event) override { if ((event->buttons() & Qt::LeftButton) && drawing) { QPoint endPoint = event->pos(); QPainter painter(this); painter.drawLine(lastPoint, endPoint); lastPoint = endPoint; } } void mouseReleaseEvent(QMouseEvent *event) override { if (event->button() == Qt::LeftButton && drawing) { drawing = false; } } private: bool drawing = false; QPoint lastPoint; }; int main(int argc, char *argv[]) { QApplication app(argc, argv); DrawWidget drawWidget; drawWidget.show(); return app.exec(); } ``` 这个示例代码实现了一个简单绘图程序,可以在绘图区域中使用鼠标左键绘制直线。你可以根据需要修改代码,实现更多的绘图功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值