- C23panweiming's blog
CPP2DD头文件
- 2024-10-10 13:01:25 @
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);}//判断是否在区间