目录简介函数介绍1、init(int x, int fz)2、fill(concol color)3、update()4、getmousepos(pos & p)5
这个头文件是用来在c++控制台绘图的,借鉴了 pygame 的一些思想,提供了一些函数用来绘图,可以有效的避免多次绘制重复图像时屏闪等问题。
初始化屏幕, 将屏幕大小设定为 x , 字体大小为 fz 。
用来将整个屏幕填充为一定的颜色。
注意!绘画完后的图像并不会立刻出现在控制台上,使用这个函数来更新。
获取鼠标坐标并存到 p 中
将控制台光标移到(x,y)的位置,x,y 从1开始
隐藏控制台光标
设置文字颜色
设置背景颜色
以(sx, sy)为左上端点、(ex, ey)为右下端点,绘制颜色为color的矩形。
绘制一条从(sx, sy)到(ex, ey)的线。
在(x,y)的位置画一个点
先介绍到这里
里面更多的功能、函数会在以后的文章后详细解释。
我这里将头文件命名为 Drawer.h ,如果用了别的名字保存头文件,这里也要改过来。
功能是从(1,1)到鼠标的位置画线。
#include "Drawer.h"
using namespace std;
Pos mp; // Mouse_Pos
void game()
{
while(1)
{
getmousepos(mp); // Get Mouse Pos
fill(black); // Let Screen be black
line(1, 1, mp.x, mp.y, green); // from (1, 1) to (mp.x, mp.y) draw Line
// ^
// |
// You can change this to red, blue, white or more
update(); // Update Screen
}
}
int main(){
system("mode con cols=102 lines=52");
init(50, 16);// 50x50 Screen and font size is 16
game();
}
截屏截不到鼠标。。。
#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
using namespace std;
enum concol {
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
};
struct pixel {
concol color;
};
struct Pos {
int x, y;
};
struct Pos3D
{
int x, y, z ;
};
CONSOLE_CURSOR_INFO CursorInfo;
COORD _GoToPos;
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
HWND hwnd = GetForegroundWindow();
int backcol, textcol;
pixel _LastScreen[1000][1000];
pixel _NewScreen[1000][1000];
int _ScreenSideLength;
int Py3dx = 0, Py3dy = 0 ;
int xzlen = 2, yzlen = 1 ;
int fontsize = 16;
inline void getmousepos(Pos &p) {
POINT pt;
GetCursorPos(&pt);
ScreenToClient(hwnd, &pt);
p.y = (pt.y / fontsize + 0.5);
p.x = (pt.x / fontsize + 0.5);
}
inline void gt(short x, short y) {
--x;
--y;
_GoToPos = {x * xzlen, y * yzlen};
SetConsoleCursorPosition(hOut, _GoToPos);
}
inline void HideCursor()
{
GetConsoleCursorInfo(hOut, &CursorInfo);
CursorInfo.bVisible = false;
SetConsoleCursorInfo(hOut, &CursorInfo);
}
inline void settextcolor(concol textcolor) {
textcol = textcolor;
unsigned short wAttributes = ((unsigned int)backcol << 4) | (unsigned int)textcol;
SetConsoleTextAttribute(hOut, wAttributes);
}
inline void setbackcolor(concol backcolor) {
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
backcol = backcolor;
unsigned short wAttributes = ((unsigned int)backcol << 4) | (unsigned int)textcol;
SetConsoleTextAttribute(hOut, wAttributes);
}
struct Button {
Pos mp;
const char* name;
int len, qx, px, py;
void rename(const char* ne) {
name = ne;
len = strlen(ne);
}
void setpos(int x, int y) {
py = y;
qx = (x - len / 2);
px = (x + len / 2);
gt(qx, y);
printf(name);
}
bool check() {
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)) return true;
} else {
gt(qx - 2, py);
printf(" ");
gt(px, py);
printf(" ");
}
return false;
}
};
inline void init(int x, int fz) {
fontsize = fz;
GetConsoleCursorInfo(hOut, &CursorInfo);
CursorInfo.bVisible = false;
SetConsoleCursorInfo(hOut, &CursorInfo);
_ScreenSideLength = x;
}
inline void update() {
for (int i = 1; i <= _ScreenSideLength ; ++i) {
for (int j = 1; j <= _ScreenSideLength ; ++j) {
if (_LastScreen[j][i].color != _NewScreen[j][i].color) {
gt(j, i);
setbackcolor(_NewScreen[j][i].color);
for(int i=1;i<=yzlen;++i)
{
for(int j=1;j<=xzlen;++j)
putchar(' ');
puts("\n");
}
_LastScreen[j][i] = _NewScreen[j][i];
}
}
}
}
void fill(concol color) {
for (int i = 1; i <= _ScreenSideLength; ++i) {
for (int j = 1; j <= _ScreenSideLength; ++j) {
if (_NewScreen[j][i].color != color) {
_NewScreen[j][i].color = color;
}
}
}
}
void rect(int sx, int sy, int ex, int ey, concol color) {
if (ey < sy) swap(ey, sy);
if (ex < sx) swap(ex, sx);
for (int i = sy; i <= ey; ++i) {
for (int j = sx; j <= ex; ++j) {
_NewScreen[j][i].color = color;
}
}
}
void ChangePy(int x, int y)
{
Py3dx = x;
Py3dy = y;
}
inline void dot(int x, int y, concol color) {
_NewScreen[x][y].color = color;
}
inline void line(int sx, int sy, int ex, int ey, concol color)
{
int xlen = ex - sx ;
int ylen = ey - sy ;
int len = sqrt(pow(xlen, 2) + pow(ylen, 2)) ;
for(double i=0; i<=len; i += 1)
{
int x = xlen * i / len ;
int y = ylen * i / len ;
_NewScreen[x + sx][y + sy].color = color ;
}
}
inline Pos pos3t2(Pos3d pos)
{
if(pos.z == 0)
{
return Pos {pos.x, pos.y} ;
}
return Pos{pos.x / (log10(pos.z)) + Py3dx, pos.y / (log10(pos.z)) + Py3dy} ;
}
inline void line3d(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);
}
inline int dis3d(Pos3d a, Pos3d b)
{
int x = abs(a.x - b.x);
int y = abs(a.y - b.y);
int z = abs(a.z - b.z);
return sqrt(pow(x, 2) + pow(y, 2) + pow(z, 2)) ;
}
inline void rect3d(Pos3d q, Pos3d w, Pos3d a, Pos3d s, concol color)
{
int qlen = dis3d(q, a);
int plen = dis3d(w, s);
int len = max(qlen, plen);
for(double i=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);
}
}
struct cube
{
Pos3d pos ;
int xlen, ylen, zlen ;
void init(int xp, int yp, int zp, int xl, int yl, int zl)
{
pos = Pos3d {xp - Py3dx, yp - Py3dy, zp};
xlen = xl;
ylen = yl;
zlen = zl;
}
inline Pos3d getdotpos(int doti)
{
switch(doti)
{
case 8: return Pos3d {pos.x + xlen, pos.y + ylen, pos.z + zlen} ;
case 7: return Pos3d {pos.x, pos.y + ylen, pos.z + zlen} ;
case 6: return Pos3d {pos.x + xlen, pos.y, pos.z + zlen} ;
case 4: return Pos3d {pos.x + xlen, pos.y + ylen, pos.z} ;
case 5: return Pos3d {pos.x, pos.y, pos.z + zlen} ;
case 3: return Pos3d {pos.x, pos.y + ylen, pos.z} ;
case 2: return Pos3d {pos.x + xlen, pos.y, pos.z} ;
case 1: return Pos3d {pos.x, pos.y, pos.z} ;
}
return {0, 0, 0}; //Else
}
inline void draw(concol color, int mode)
{
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) ;
}
}
};
到此这篇关于C++控制台绘图头文件的文章就介绍到这了,更多相关C++控制台绘图头文件内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: C++控制台绘图头文件实例代码
本文链接: https://www.lsjlt.com/news/178339.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0