#include <windows.h>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#ifndef KEY_DOWN
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
#endif
#define clean 0x2
#define box 0x4
#define full 0x1
usingnamespacestd;
enumconcol {
black = 0,
dark_blue = 1,
dark_green = 2,
dark_aqua = 3, dark_cyan = 3,
dark_red = 4,
dark_purple = 5, dark_pink = 5, dark_magenta = 5,
dark_yellow = 6,
dark_white = 7,
gray = 8,
blue = 9,
green = 10,
cyan = 11,
red = 12,
purple = 13, pink = 13,
yellow = 14,
white = 15
};
structpixel {
concol color;
};
structPos {
intx, y;
};
structPos3d
{
intx, y, z ;
};
CONSOLE_CURSOR_INFO CursorInfo;
COORD _GoToPos;
HANDLEhOut = GetStdHandle(STD_OUTPUT_HANDLE);
HWNDhwnd = GetForegroundWindow();
intbackcol, textcol;
pixel _LastScreen[1000][1000];
pixel _NewScreen[1000][1000];
int_ScreenSideLength;
intPy3dx = 0, Py3dy = 0 ;
intxzlen = 2, yzlen = 1 ;
intfontsize = 16;
inlinevoidgetmousepos(Pos &p) {
POINT pt;
GetCursorPos(&pt);
ScreenToClient(hwnd, &pt);
p.y = (pt.y / fontsize + 0.5);
p.x = (pt.x / fontsize + 0.5);
}
inlinevoidgt(shortx,shorty) {
--x;
--y;
_GoToPos = {x * xzlen, y * yzlen};
SetConsoleCursorPosition(hOut, _GoToPos);
}
inlinevoidHideCursor()
{
GetConsoleCursorInfo(hOut, &CursorInfo);
CursorInfo.bVisible =false;
SetConsoleCursorInfo(hOut, &CursorInfo);
}
inlinevoidsettextcolor(concol textcolor) {
textcol = textcolor;
unsignedshortwAttributes = ((unsignedint)backcol << 4) | (unsignedint)textcol;
SetConsoleTextAttribute(hOut, wAttributes);
}
inlinevoidsetbackcolor(concol backcolor) {
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
backcol = backcolor;
unsignedshortwAttributes = ((unsignedint)backcol << 4) | (unsignedint)textcol;
SetConsoleTextAttribute(hOut, wAttributes);
}
structButton {
Pos mp;
constchar* name;
intlen, qx, px, py;
voidrename(constchar* ne) {
name = ne;
len =strlen(ne);
}
voidsetpos(intx,inty) {
py = y;
qx = (x - len / 2);
px = (x + len / 2);
gt(qx, y);
printf(name);
}
boolcheck() {
getmousepos(mp);
if(mp.x <= px and mp.x >= qx and mp.y <= py and mp.y >= py - 2) {
gt(qx - 2, py);
printf(">>");
gt(px, py);
printf("<<");
if(KEY_DOWN(MOUSE_MOVED))returntrue;
}else{
gt(qx - 2, py);
printf(" ");
gt(px, py);
printf(" ");
}
returnfalse;
}
};
inlinevoidinit(intx,intfz) {
fontsize = fz;
GetConsoleCursorInfo(hOut, &CursorInfo);
CursorInfo.bVisible =false;
SetConsoleCursorInfo(hOut, &CursorInfo);
_ScreenSideLength = x;
}
inlinevoidupdate() {
for(inti = 1; i <= _ScreenSideLength ; ++i) {
for(intj = 1; j <= _ScreenSideLength ; ++j) {
if(_LastScreen[j][i].color != _NewScreen[j][i].color) {
gt(j, i);
setbackcolor(_NewScreen[j][i].color);
for(inti=1;i<=yzlen;++i)
{
for(intj=1;j<=xzlen;++j)
putchar(' ');
puts("\n");
}
_LastScreen[j][i] = _NewScreen[j][i];
}
}
}
}
voidfill(concol color) {
for(inti = 1; i <= _ScreenSideLength; ++i) {
for(intj = 1; j <= _ScreenSideLength; ++j) {
if(_NewScreen[j][i].color != color) {
_NewScreen[j][i].color = color;
}
}
}
}
voidrect(intsx,intsy,intex,intey, concol color) {
if(ey < sy) swap(ey, sy);
if(ex < sx) swap(ex, sx);
for(inti = sy; i <= ey; ++i) {
for(intj = sx; j <= ex; ++j) {
_NewScreen[j][i].color = color;
}
}
}
voidChangePy(intx,inty)
{
Py3dx = x;
Py3dy = y;
}
inlinevoiddot(intx,inty, concol color) {
_NewScreen[x][y].color = color;
}
inlinevoidline(intsx,intsy,intex,intey, concol color)
{
intxlen = ex - sx ;
intylen = ey - sy ;
intlen =sqrt(pow(xlen, 2) +pow(ylen, 2)) ;
for(doublei=0; i<=len; i += 1)
{
intx = xlen * i / len ;
inty = ylen * i / len ;
_NewScreen[x + sx][y + sy].color = color ;
}
}
inlinePos pos3t2(Pos3d pos)
{
if(pos.z == 0)
{
returnPos {pos.x, pos.y} ;
}
returnPos{pos.x / (log10(pos.z)) + Py3dx, pos.y / (log10(pos.z)) + Py3dy} ;
}
inlinevoidline3d(Pos3d a, Pos3d b, concol color)
{
Pos a2 = pos3t2(a);
Pos b2 = pos3t2(b);
// line(a2.x, b2.y, a2.y, b2.x, color);
line(a2.x, a2.y, b2.x, b2.y, color);
}
inlineintdis3d(Pos3d a, Pos3d b)
{
intx =abs(a.x - b.x);
inty =abs(a.y - b.y);
intz =abs(a.z - b.z);
returnsqrt(pow(x, 2) +pow(y, 2) +pow(z, 2)) ;
}
/*
Q------W
\ /
A--S
*/
inlinevoidrect3d(Pos3d q, Pos3d w, Pos3d a, Pos3d s, concol color)
{
intqlen = dis3d(q, a);
intplen = dis3d(w, s);
intlen = max(qlen, plen);
for(doublei=1;i<=len; i+=0.1)
{
Pos3d qpos = Pos3d {abs(q.x-a.x)*i/len + q.x,abs(q.y-a.y)*i/len + q.y,abs(q.z-a.z)*i/len + q.z} ;
Pos3d ppos = Pos3d {abs(w.x-s.x)*i/len + w.x,abs(w.y-s.y)*i/len + w.y,abs(w.z-s.z)*i/len + w.z} ;
line3d(qpos, ppos, color);
}
}
structcube
{
Pos3d pos ;
intxlen, ylen, zlen ;
voidinit(intxp,intyp,intzp,intxl,intyl,intzl)
{
pos = Pos3d {xp - Py3dx, yp - Py3dy, zp};
xlen = xl;
ylen = yl;
zlen = zl;
}
inlinePos3d getdotpos(intdoti)
{
switch(doti)
{
case8:returnPos3d {pos.x + xlen, pos.y + ylen, pos.z + zlen} ;
case7:returnPos3d {pos.x, pos.y + ylen, pos.z + zlen} ;
case6:returnPos3d {pos.x + xlen, pos.y, pos.z + zlen} ;
case4:returnPos3d {pos.x + xlen, pos.y + ylen, pos.z} ;
case5:returnPos3d {pos.x, pos.y, pos.z + zlen} ;
case3:returnPos3d {pos.x, pos.y + ylen, pos.z} ;
case2:returnPos3d {pos.x + xlen, pos.y, pos.z} ;
case1:returnPos3d {pos.x, pos.y, pos.z} ;
}
return{0, 0, 0};//Else
}
/*
5----------6
/| /|
/ | / |
/ | / |
1----------2 |
| 7------|---8
ylen| / | /
| / | /zlen
|/ xlen |/
3----------4
^
|
O
*/
inlinevoiddraw(concol color,intmode)
{
if(mode & full)
{
rect3d(getdotpos(5), getdotpos(7), getdotpos(6), getdotpos(8), green);
rect3d(getdotpos(1), getdotpos(3), getdotpos(5), getdotpos(7), red);
rect3d(getdotpos(5), getdotpos(1), getdotpos(6), getdotpos(2), blue);
rect3d(getdotpos(7), getdotpos(3), getdotpos(8), getdotpos(4), pink);
rect3d(getdotpos(2), getdotpos(4), getdotpos(6), getdotpos(8), yellow);
rect3d(getdotpos(1), getdotpos(3), getdotpos(2), getdotpos(4), white);
}
if(mode & clean)
{
line3d(getdotpos(1), getdotpos(2), color) ;
line3d(getdotpos(1), getdotpos(3), color) ;
line3d(getdotpos(1), getdotpos(5), color) ;
line3d(getdotpos(2), getdotpos(6), color) ;
line3d(getdotpos(2), getdotpos(4), color) ;
line3d(getdotpos(3), getdotpos(4), color) ;
line3d(getdotpos(3), getdotpos(7), color) ;
line3d(getdotpos(4), getdotpos(8), color) ;
line3d(getdotpos(5), getdotpos(6), color) ;
line3d(getdotpos(5), getdotpos(7), color) ;
line3d(getdotpos(6), getdotpos(8), color) ;
line3d(getdotpos(7), getdotpos(8), color) ;
}
if(mode & box)
{
line3d(getdotpos(1), getdotpos(4), color) ;
line3d(getdotpos(1), getdotpos(7), color) ;
line3d(getdotpos(2), getdotpos(3), color) ;
line3d(getdotpos(2), getdotpos(8), color) ;
line3d(getdotpos(3), getdotpos(5), color) ;
line3d(getdotpos(3), getdotpos(8), color) ;
line3d(getdotpos(4), getdotpos(7), color) ;
line3d(getdotpos(4), getdotpos(6), color) ;
line3d(getdotpos(5), getdotpos(2), color) ;
line3d(getdotpos(5), getdotpos(8), color) ;
line3d(getdotpos(6), getdotpos(1), color) ;
line3d(getdotpos(6), getdotpos(7), color) ;
}
}
};
|