1.1 版本

需要连接 -lgdi32

需要 -std=c++11

需要把这个文件命名为 CPP2DD.h

如果以上条件做好了且报错了,不用管,直接去看教程

#define _WIN32_WINNT 0x0500
#include "windows.h"
#include<bits/stdc++.h>
#include<conio.h>
#define KEYDOWN(name) ((GetAsyncKeyState(name) & 0x8000)?1:0)
using namespace std;
HWND myconsole=GetConsoleWindow();//窗口绑定 
HDC mydc=GetDC(myconsole);
const int N=1200;
const int M=600;
struct xyab//几何 
{
	int x,y,a,b;
};
struct xy//点 
{
	int x,y;
};
struct jhc//几何点 
{
	int x,y,a,b;
	int R,G,B;
};
struct xyc//点 
{
	int x,y;
	int R,G,B;
};
void init();
bool qj(xy,xyab);
int dpp[N+1][M+1];
class Model;
map<string,Model>MDL;
class Model
{
	public:
		vector<jhc>jhp;//几何阵
		vector<xyc>mdp;//点阵
		int deep;//深度 
		xy mxy;//主坐标
		xyab mxyab;//范围 
		
		Model(){}//空预设 
		Model(int d){this->deep=d;}//预设深度
		Model(xy p){this->mxy=p;}//预设主坐标
		Model(xy p,int d){this->mxy=p,this->deep=d;}//双重预设
		
		vector<jhc> addjh(jhc j)//添加几何 
		{
			this->jhp.push_back(j);
			return jhp;
		}
		
		vector<xyc> addmd(xyc p)//添加点 
		{
			this->mdp.push_back(p);
			return mdp;
		}
		
		void setmxyab()//检测设置模型范围
		{
			for(int i=0;i<jhp.size();i++)
			{
				this->mxyab.x=min(this->mxyab.x,this->jhp[i].x);
				this->mxyab.y=min(this->mxyab.y,this->jhp[i].y);
				this->mxyab.a=max(this->mxyab.a,this->jhp[i].a);
				this->mxyab.b=max(this->mxyab.b,this->jhp[i].b);
			}
			for(int i=0;i<mdp.size();i++)
			{
				this->mxyab.x=min(this->mxyab.x,this->mdp[i].x);
				this->mxyab.y=min(this->mxyab.y,this->mdp[i].y);
				this->mxyab.a=max(this->mxyab.a,this->mdp[i].x);
				this->mxyab.b=max(this->mxyab.b,this->mdp[i].y);
			}
		}
		
		void om(string file)//生成model文件 
		{
			ofstream of(file+".model");
			of<<this->deep<<"\n";
			of<<this->jhp.size()<<"\n";
			for(int i=0;i<this->jhp.size();i++)
			{
				of<<this->jhp[i].x<<" "<<this->jhp[i].y<<" "<<this->jhp[i].a<<" "<<this->jhp[i].b<<" "<<this->jhp[i].R<<" "<<this->jhp[i].G<<" "<<this->jhp[i].B<<"\n";
			}
			of<<this->mdp.size()<<"\n";
			for(int i=0;i<this->mdp.size();i++)
			{
				of<<this->mdp[i].x<<" "<<this->mdp[i].y<<" "<<this->mdp[i].R<<" "<<this->mdp[i].G<<" "<<this->mdp[i].B<<"\n";
			}
			of.close();
		}
		void omc(string class_name)//生成model代码导入代码 
		{
			string cn=class_name;
			ofstream of(cn+".modelc");
			of<<cn<<".deep="<<this->deep<<";\n";
			for(int i=0;i<this->jhp.size();i++)
			{
				of<<cn<<".addjh({"<<this->jhp[i].x<<","<<this->jhp[i].y<<","<<this->jhp[i].a<<","<<this->jhp[i].b<<","<<this->jhp[i].R<<","<<this->jhp[i].G<<","<<this->jhp[i].B<<"});\n";
			}
			for(int i=0;i<this->mdp.size();i++)
			{
				of<<cn<<".addmd({"<<this->mdp[i].x<<","<<this->mdp[i].y<<","<<this->mdp[i].R<<","<<this->mdp[i].G<<","<<this->mdp[i].B<<"});\n";
			}
			of<<cn<<".setmxyab();\n";
			of.close();
		}
		void rm(string file)//读入model文件 
		{
			this->mdp.clear();
			this->jhp.clear();
			ifstream ifs(file+".model");
			int jhl,mdl,x,y,a,b,R,G,B;
			ifs>>this->deep>>jhl;
			for(int i=0;i<jhl;i++)
			{
				ifs>>x>>y>>a>>b>>R>>G>>B;
				this->jhp.push_back({x,y,a,b,R,G,B});
			}
			ifs>>mdl;
			for(int i=0;i<mdl;i++)
			{
				ifs>>x>>y>>R>>G>>B;
				this->mdp.push_back({x,y,R,G,B});
			}
			this->setmxyab();
			ifs.close();
		}
		
		void cleanp(xyab f)//清理缓存 
		{
			for(int i=f.x;i<=f.a;i++)
			{
				for(int j=f.y;j<=f.b;j++)
				{
					if(i>=0 && i<=N && j>=0 && j<=M)
					{
						SetPixel(mydc,i,j,RGB(0,0,0));
						dpp[i][j]=0;
					}
				}
			}
		}
		
		void draw(bool f=0)
		{
			if(f)this->cleanp(this->mxyab);
			for(int ji=0;ji<this->jhp.size();ji++)
			{
				for(int i=this->jhp[ji].x;i<=this->jhp[ji].a;i++)
				{
					for(int j=this->jhp[ji].y;j<=this->jhp[ji].b;j++)
					{
						if(dpp[i][j]<=this->deep)
						{
							SetPixel(mydc,i,j,RGB(this->jhp[ji].R,this->jhp[ji].G,this->jhp[ji].B));
							dpp[i][j]=this->deep;
						}
					}
				}	
			}
			for(int mi=0;mi<this->mdp.size();mi++)
			{
				if(dpp[this->mdp[mi].x][this->mdp[mi].y]<=this->deep)
				{
					SetPixel(mydc,this->mdp[mi].x,this->mdp[mi].y,RGB(this->mdp[mi].R,this->mdp[mi].G,this->mdp[mi].B));
					dpp[this->mdp[mi].x][this->mdp[mi].y]=this->deep;
				}
			}
		}
		
		void move(int xp,int yp,bool f=1)//移动 
		{
			if(f)this->cleanp(this->mxyab);
			for(int i=0;i<this->jhp.size();i++)
			{
				this->jhp[i].x+=xp;
				this->jhp[i].y+=yp;
				this->jhp[i].a+=xp;
				this->jhp[i].b+=yp;
				this->mxyab.x=min(this->mxyab.x,this->jhp[i].x);
				this->mxyab.y=min(this->mxyab.y,this->jhp[i].y);
				this->mxyab.a=max(this->mxyab.a,this->jhp[i].a);
				this->mxyab.b=max(this->mxyab.b,this->jhp[i].b);
			}
			for(int i=0;i<this->mdp.size();i++)
			{
				this->mdp[i].x+=xp;
				this->mdp[i].y+=yp;
				this->mxyab.x=min(this->mxyab.x,this->mdp[i].x);
				this->mxyab.y=min(this->mxyab.y,this->mdp[i].y);
				this->mxyab.a=max(this->mxyab.a,this->mdp[i].x);
				this->mxyab.b=max(this->mxyab.b,this->mdp[i].y);
			}
			this->mxy.x+=xp;
			this->mxy.y+=yp;
			this->mxyab.x+=xp;
			this->mxyab.y+=yp;
			this->mxyab.a+=xp;
			this->mxyab.b+=yp;
		}
		void moved(int xp,int yp)
		{
			xyab save1=this->mxyab;
			this->move(-mxyab.x,-mxyab.y,0);
			xyab save2=this->mxyab;
			this->move(xp,yp,0);
			this->cleanp(save1);
			this->cleanp(save2);
		}
		void movek(int speed,int times=0)
		{
			if(KEYDOWN('D'))
			{
				this->move(speed,0);
			}
			if(KEYDOWN('A'))
			{
				this->move(-speed,0);
			}
			if(KEYDOWN('W'))
			{
				this->move(0,-speed);
			}
			if(KEYDOWN('S'))
			{
				this->move(0,speed);
			}
		}
		
};
void clearp(int time=0)
{
	Sleep(time);
	memset(dpp,0,sizeof dpp);
	system("cls");
}
void drawMDL(xyab f)//绘制图画 
{
	clearp();
	for(int i=f.x;i<=f.a;i++)
	{
		for(int j=f.y;j<=f.b;j++)
		{
			for(auto k:MDL)
			{
				for(int ji=0;ji<k.second.jhp.size();ji++)
				{
					if(dpp[i][j]<=k.second.deep && qj({i,j},{k.second.jhp[ji].x,k.second.jhp[ji].y,k.second.jhp[ji].a,k.second.jhp[ji].b}))
					{
						SetPixel(mydc,i,j,RGB(k.second.jhp[ji].R,k.second.jhp[ji].G,k.second.jhp[ji].B));
						dpp[i][j]=k.second.deep;
					}
				}
				for(int mi=0;mi<k.second.mdp.size();mi++)
				{
					if(dpp[i][j]<=k.second.deep && i==k.second.mdp[mi].x && j==k.second.mdp[mi].y)
					{
						SetPixel(mydc,i,j,RGB(k.second.mdp[mi].R,k.second.mdp[mi].G,k.second.mdp[mi].B));
						dpp[i][j]=k.second.deep;
					}
				}
			}
		}
	}
}
void init()//初始化 
{
	//取消控制 
	CONSOLE_CURSOR_INFO cciCursor;
	HANDLE hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);
	if(GetConsoleCursorInfo(hStdOut,&cciCursor))
	{
		cciCursor.bVisible=FALSE;
		SetConsoleCursorInfo(hStdOut,&cciCursor);
	}
	HANDLE hStdin=GetStdHandle(STD_INPUT_HANDLE);
	DWORD mode;
	GetConsoleMode(hStdin,&mode);
	mode&=~ENABLE_QUICK_EDIT_MODE;
	SetConsoleMode(hStdin,mode);
	for(int i=0;i<=N;i++)
		for(int j=0;j<=M;j++)
			SetPixel(mydc,i,j,RGB(0,0,0));
}
bool qj(xy f,xyab n){return (f.x>=n.x&&f.x<=n.a && f.y>=n.y&&f.y<=n.b);}//判断是否在区间