基于easyX和vs使用c++绘制坐标系以及实时显示
由于现在在windows下用c语言写一些算法,c语言并没有自己的图形界面库,所以在调试的时候很不方便。相信很多使用c语言开发的朋友都会为此而苦恼。所以最近我基于easyX写了一个实时绘制数据的程序,希望可以给大家一些帮助。
easyX是一个c++的图形库,只能在windows上使用,而且一般只能在vs或者vc上面使用(我用的vs),限制条件比较多,如果大家想用,还是老老实实安装软件吧,先装vs,然后安装easyX。easyX安装起来很简单。
先给大家看一下效果:
静态显示(不带网格):
静态显示(带网格,这里网格线将刻度值的负号遮盖了,理解万岁):
动态绘制(无网格):
动态绘制(有网格):
动态绘制时,使用了一个循环队列,然后每一次重新绘制队列中的所有元素
接下来是代码:
先是循环队列的代码:
queue.h
#ifndef _QUEUE_H
#define _QUEUE_H//循环队列的大小
#define MAXSIZE 1000 typedef struct queueint {int data[MAXSIZE];int front, rear;
}QueueInt;typedef struct queueintfloat {float data[MAXSIZE];int front, rear;
}QueueFloat;void queueInitFloat(QueueFloat* queue);int insertFloat(QueueFloat* queue,float a);int deleteFloat(QueueFloat* queue);int getSizeFloat(QueueFloat* queue);void queueInitInt(QueueInt* queue);int insertInt(QueueInt* queue, int a);int deleteInt(QueueInt* queue);int getSizeInt(QueueInt* queue);#endif
queue.cpp
#include "queue.h"void queueInitFloat(QueueFloat* queue) {queue->front = 0;queue->rear = 0;for (int i = 0; i < MAXSIZE; i++)queue->data[i] = 0;
}int insertFloat(QueueFloat* queue, float a) {if ((queue->rear + 1)%MAXSIZE==queue->front) {return 1;}queue->data[queue->rear++] = a;return 0;
}int deleteFloat(QueueFloat* queue) {if (queue->front == queue->rear) {return 1;}queue->front++;return 0;
}int getSizeFloat(QueueFloat* queue) {int res = queue->rear - queue->front;if (res < 0) {res += MAXSIZE;}return res;
}void queueInitInt(QueueInt* queue) {queue->front = 0;queue->rear = 0;for (int i = 0; i < MAXSIZE; i++)queue->data[i] = 0;
}int insertInt(QueueInt* queue, int a) {if ((queue->rear + 1) % MAXSIZE == queue->front) {return 1;}queue->data[queue->rear++] = a;queue->rear %= MAXSIZE;return 0;
}int deleteInt(QueueInt* queue) {if (queue->front == queue->rear) {return 1;}queue->front++;queue->front %= MAXSIZE;return 0;
}int getSizeInt(QueueInt* queue) {int res = queue->rear - queue->front;if (res < 0) {res += MAXSIZE;}return res;
}
然后是坐标系的绘制,以及绘图代码
drawCoordinateSystem.h
#pragma once
#ifndef DrawCoordinateSystem
#define DrawCoordinateSystem
#include "queue.h"
/*
这是绘制坐标系的函数
1、轴
2、刻度
3、原点
4、网格
5、图幅
6、箭头
*///轴结构体
struct Axis {int xlow, xhigh;int ylow, yhigh;int centerx,centery;float ax, ay; //压缩int color;
};//刻度结构体
struct Scale {int openflag; //是否开启int scalex; //刻度大小int scaley;int color;
};
struct Grid{int openflag;int color;
};typedef struct coordinatesystem {struct Axis axis;struct Scale scale;int zerox, zeroy; //坐标系原点struct Grid grid;int length, width; //图幅长宽int color; //背景颜色int borderx, brodery; //边界空出的范围
}CoordinateSystem;void coordinateSystemInit(CoordinateSystem* cs);void createCS(CoordinateSystem* cs);void plotInt(CoordinateSystem* cs, int* data, int len, int color);void plotFloat(CoordinateSystem* cs, float* data, int len, int color);void dynamicPlotInt(CoordinateSystem* cs,QueueInt* queue,int color);void addInt(QueueInt* queue,int a);#endif // !DrawCoordinateSystem
drawCoordinateSystem.cpp
#include "drawCoordinateSystem.h"
#include <easyx.h> // 引用图形库头文件
#include <Windows.h>
#include <math.h>
#include <stdio.h>
#include "queue.h"void coordinateSystemInit(CoordinateSystem* cs) {//图幅初始化cs->length = 1280;cs->width = 780;//坐标轴初始化cs->axis.xhigh = 100;cs->axis.xlow = -100;cs->axis.yhigh = 100;cs->axis.ylow = 0;cs->axis.centerx = (cs->axis.xhigh + cs->axis.xlow) / 2;cs->axis.centery = (cs->axis.yhigh + cs->axis.ylow) / 2;int len1 = cs->axis.xhigh - cs->axis.xlow;int len2 = cs->axis.yhigh - cs->axis.ylow;cs->axis.ax = cs->length*1.0 / len1;cs->axis.ay = cs->width*1.0 / len2;cs->axis.color = BLACK;//坐标原点初始化cs->zerox = 0;cs->zeroy = 50;//刻度初始化cs->scale.openflag = 1;cs->scale.scalex = 10;cs->scale.scaley = 10;cs->scale.color = BLACK;//网格初始化cs->grid.openflag = 1;cs->grid.color = BLACK;//边界空出范围cs->borderx = 10;cs->brodery = 10;cs->color = WHITE;//创建窗口HWND hwnd = initgraph(cs->length + cs->borderx, cs->width + cs->brodery, EW_SHOWCONSOLE);setrop2(R2_MASKPEN); //加一个光栅更好看
}int transX(CoordinateSystem* cs, float x) {x -= cs->axis.centerx;x *= cs->axis.ax;int k = x;if (x - k > 0.5)k++;return k;
}
int transY(CoordinateSystem* cs, float y) {y -= cs->axis.centery;y *= cs->axis.ay;int k = y;if (y - k > 0.5)k++;return k;
}void createCS(CoordinateSystem* cs) {//设置原点int avex = (cs->length + cs->borderx) / 2;int avey = (cs->width + cs->brodery) / 2;setorigin(avex, avey);//设置缩放与坐标轴方向setaspectratio(1,-1); //将y轴翻转为 向上为正//设置背景色setbkcolor(cs->color);cleardevice();//绘制坐标轴setlinecolor(cs->axis.color); //设置颜色setlinestyle(PS_SOLID,3); //线的样式:实线,宽度line(-cs->length/2,0,cs->length/2,0);line(transX(cs,cs->zerox),cs->width/2, transX(cs, cs->zerox),-cs->width/2);//绘制箭头float angle = 15/180.0*3.14159; //箭头角度float len3 =20;float x11 = cs->zerox*1.0;float x12 = cs->zerox*1.0 + len3 * tan(angle)/cs->axis.ax;float x13 = cs->zerox*1.0 - len3 * tan(angle) / cs->axis.ax;float y11 = cs->axis.yhigh*1.0;float y12 = cs->axis.yhigh*1.0 - len3 / cs->axis.ay;float y13 = cs->axis.yhigh*1.0 - len3/cs->axis.ay;line(transX(cs,x11),cs->width/2,transX(cs, x12 ),cs->width/2-len3);line(transX(cs, x11), cs->width / 2, transX(cs, x13), cs->width / 2 - len3);float x21 = cs->axis.xhigh;float x22 = cs->axis.xhigh - len3 / cs->axis.ax;float x23 = cs->axis.xhigh - len3 / cs->axis.ax;float y21 = cs->zeroy;float y22 = cs->zeroy+len3* tan(angle) / cs->axis.ay;float y23 = cs->zeroy - len3 * tan(angle) / cs->axis.ay;line(transX(cs, x21), transY(cs, y21), transX(cs, x22), transY(cs, y22));line(transX(cs, x21), transY(cs, y21), transX(cs, x23), transY(cs, y23));// 绘制刻度if (cs->scale.openflag) {int len4 = 5; //刻度的高度float rlen = 50 / cs->axis.ax, rwid = 30 / cs->axis.ay; //刻度值长宽int bias = 2; //刻度值离坐标轴的距离char s[10];int i = 0;setaspectratio(1, 1); //将y轴翻转为 向上为负settextcolor(cs->scale.color); //设置文字颜色setbkmode(TRANSPARENT); //背景透明while (cs->zerox - i * cs->scale.scalex > cs->axis.xlow) {setlinecolor(cs->axis.color); //设置刻度颜色setlinestyle(PS_SOLID, 3); //线的样式:实线,宽度line(transX(cs, cs->zerox - i * cs->scale.scalex), transY(cs, cs->zeroy), transX(cs, cs->zerox - i * cs->scale.scalex), transY(cs, cs->zeroy) - len4);RECT r = { transX(cs, cs->zerox - i * cs->scale.scalex - rlen / 2), transY(cs, cs->zeroy) + bias,transX(cs, cs->zerox - i * cs->scale.scalex + rlen / 2),transY(cs, cs->zeroy + rwid) + bias };sprintf(s, "%d", cs->zerox - i * cs->scale.scalex);// printf("%s\n", s);drawtext(s, &r, DT_CENTER | DT_TOP | DT_SINGLELINE);//绘制网格if (cs->grid.openflag&&i!=0) {setlinecolor(cs->grid.color); //设置网格颜色setlinestyle(PS_DASH, 1); //线的样式:虚线,宽度line(transX(cs, cs->zerox - i * cs->scale.scalex), transY(cs, cs->axis.ylow), transX(cs, cs->zerox - i * cs->scale.scalex), transY(cs, cs->axis.yhigh));}i++;}i = 1;while (cs->zerox + i * cs->scale.scalex < cs->axis.xhigh) {setlinecolor(cs->axis.color); //设置刻度颜色setlinestyle(PS_SOLID, 3); //线的样式:实线,宽度line(transX(cs, cs->zerox + i * cs->scale.scalex), transY(cs, cs->zeroy), transX(cs, cs->zerox + i * cs->scale.scalex), transY(cs, cs->zeroy) - len4);RECT r = { transX(cs, cs->zerox + i * cs->scale.scalex - rlen / 2), transY(cs, cs->zeroy) + bias,transX(cs, cs->zerox + i * cs->scale.scalex + rlen / 2),transY(cs, cs->zeroy + rwid) + bias };sprintf(s, "%d", cs->zerox + i * cs->scale.scalex);
// printf("%s\n", s);drawtext(s, &r, DT_CENTER | DT_TOP | DT_SINGLELINE);//绘制网格if (cs->grid.openflag&&i != 0) {setlinecolor(cs->grid.color); //设置网格颜色setlinestyle(PS_DASH, 1); //线的样式:虚线,宽度line(transX(cs, cs->zerox + i * cs->scale.scalex), transY(cs, cs->axis.ylow), transX(cs, cs->zerox + i * cs->scale.scalex), transY(cs, cs->axis.yhigh));}i++;}i = 0;while (cs->zeroy - i * cs->scale.scaley > cs->axis.ylow) {setlinecolor(cs->axis.color); //设置刻度颜色setlinestyle(PS_SOLID, 3); //线的样式:实线,宽度line(transX(cs, cs->zerox), transY(cs, cs->zeroy + i * cs->scale.scaley), transX(cs, cs->zerox) + len4, transY(cs, cs->zeroy + i * cs->scale.scaley));RECT r = { transX(cs, cs->zerox - rlen) - bias, transY(cs,cs->zeroy + i * cs->scale.scaley - rwid / 2),transX(cs, cs->zerox) - bias, transY(cs,cs->zeroy + i * cs->scale.scaley + rwid / 2) };sprintf(s, "%d", cs->zeroy - i * cs->scale.scaley);
// printf("%s\n", s);drawtext(s, &r, DT_RIGHT | DT_VCENTER | DT_SINGLELINE);//绘制网格if (cs->grid.openflag&&i != 0) {setlinecolor(cs->grid.color); //设置网格颜色setlinestyle(PS_DASH, 1); //线的样式:虚线,宽度line(transX(cs, cs->axis.xlow), transY(cs, cs->zeroy + i * cs->scale.scaley), transX(cs, cs->axis.xhigh), transY(cs, cs->zeroy + i * cs->scale.scaley));}i++;}i = 1;while (cs->zeroy + i * cs->scale.scaley < cs->axis.yhigh) {setlinecolor(cs->axis.color); //设置刻度颜色setlinestyle(PS_SOLID, 3); //线的样式:实线,宽度line(transX(cs, cs->zerox), transY(cs, cs->zeroy - i * cs->scale.scaley), transX(cs, cs->zerox) + len4, transY(cs, cs->zeroy - i * cs->scale.scaley));RECT r = { transX(cs, cs->zerox - rlen) - bias, transY(cs,cs->zeroy - i * cs->scale.scaley - rwid / 2),transX(cs, cs->zerox) - bias, transY(cs,cs->zeroy - i * cs->scale.scaley + rwid / 2) };sprintf(s, "%d", cs->zeroy + i * cs->scale.scaley);
// printf("%s\n", s);drawtext(s, &r, DT_RIGHT | DT_VCENTER | DT_SINGLELINE);//绘制网格if (cs->grid.openflag&&i != 0) {setlinecolor(cs->grid.color); //设置网格颜色setlinestyle(PS_DASH, 1); //线的样式:虚线,宽度line(transX(cs, cs->axis.xlow), transY(cs, cs->zeroy - i * cs->scale.scaley), transX(cs, cs->axis.xhigh), transY(cs, cs->zeroy - i * cs->scale.scaley));}i++;}}
}void setRange(CoordinateSystem*cs, int xlow, int xhigh, int ylow, int yhigh) {cs->axis.ylow = ylow;cs->axis.yhigh = yhigh;cs->axis.xlow = xlow;cs->axis.xhigh = xhigh;cs->axis.centerx = (cs->axis.xlow + cs->axis.xhigh) / 2;cs->axis.centery = (cs->axis.ylow + cs->axis.yhigh) / 2;int len1 = cs->axis.xhigh - cs->axis.xlow;int len2 = cs->axis.yhigh - cs->axis.ylow;cs->axis.ax = cs->length*1.0 / len1;cs->axis.ay = cs->width*1.0 / len2;cs->scale.scalex =(int) (100 / cs->axis.ax)/10*10;cs->scale.scaley = (int)(100 / cs->axis.ay) / 10*10;if (cs->scale.scalex <= 0)cs->scale.scalex=(int)(100 / cs->axis.ax);if (cs->scale.scaley <= 0)cs->scale.scaley=(int)(100 / cs->axis.ay);if (cs->scale.scalex <= 0)cs->scale.scalex = 1;if (cs->scale.scaley <= 0)cs->scale.scaley = 1;cs->zerox = 0;cs->zeroy = cs->axis.centery;
}//直接给一组数据,将数据绘制出来
void plotInt(CoordinateSystem* cs, int* data, int len, int color) {//找出最大最小值int min = data[0];int max = data[0];for (int i = 1; i < len; i++) {if (data[i] > max) {max = data[i];}if (data[i] < min) {min = data[i];}}int range = max - min;coordinateSystemInit(cs);setRange(cs, 0-len*0.1, len*1.1, min-range*0.1, max+range*0.1);createCS(cs);setlinecolor(color);setaspectratio(1, -1);setlinestyle(PS_SOLID, 2);for (int i = 0; i < len - 1; i++) {line(transX(cs,i + 1),transY(cs, data[i]),transX(cs, i + 2),transY(cs, data[i + 1]));}for (int i = 0; i < len; i++) {putpixel(transX(cs,i + 1),transY(cs, data[i]),color);}
}//直接给一组数据,将数据绘制出来
void plotFloat(CoordinateSystem* cs, float* data, int len, int color) {//找出最大最小值float min = data[0];float max = data[0];for (int i = 1; i < len; i++) {if (data[i] > max) {max = data[i];}if (data[i] < min) {min = data[i];}}float range = max - min;coordinateSystemInit(cs);setRange(cs, 0 - len * 0.1, len*1.1, min - range * 0.1, max + range * 0.1);createCS(cs);setlinecolor(color);setaspectratio(1, -1);setlinestyle(PS_SOLID, 2);for (int i = 0; i < len - 1; i++) {line(transX(cs, i + 1), transY(cs, data[i]), transX(cs, i + 2), transY(cs, data[i + 1]));}for (int i = 0; i < len; i++) {putpixel(transX(cs, i + 1), transY(cs, data[i]), color);}//
}void dynamicPlotInt(CoordinateSystem* cs, QueueInt* queue, int color) {int len = getSizeInt(queue);int min, max;if (len == 0) {min = 0;max = 100;}else if (len==1) {min = queue->data[queue->front] - 10;max = queue->data[queue->front] + 10;}else {int p = (queue->front+1)%MAXSIZE;min = queue->data[queue->front];max = queue->data[queue->front];while (p% MAXSIZE != queue->rear) {if (queue->data[p ]>max) {max = queue->data[p ];}if (queue->data[p ] < min) {min = queue->data[p ];}p++;p %= MAXSIZE;}}if (min == max) {min = min - 10;max = max + 10;}float range = max - min;// coordinateSystemInit(cs);if (len <= 10) {setRange(cs, -10, 10, min - range * 0.1, max + range * 0.1);}else {setRange(cs, 0 - len * 0.1, len*1.1, min - range * 0.1, max + range * 0.1);}BeginBatchDraw();//开始批量画图createCS(cs);if (len == 0) {EndBatchDraw();return;}setlinecolor(color);setaspectratio(1, -1);setlinestyle(PS_SOLID, 2);int i = 0;int k = 0;for (int p = queue->front; (p+1)%MAXSIZE != queue->rear;p++,p%=MAXSIZE,i++) {line(transX(cs, i + 1), transY(cs,queue->data[p]), transX(cs, i + 2), transY(cs, queue->data[(p+1)%MAXSIZE]));k++;if (k == 10) {
// FlushBatchDraw();k = 0;}}EndBatchDraw();
// i = 0;
// for (int p = queue->front; p%MAXSIZE != queue->rear; p++, p %= MAXSIZE, i++) {
// putpixel(transX(cs, i + 1), transY(cs, queue->data[p]), color);
// }
// for (int i = 0; i < len; i++) {
// putpixel(transX(cs, i + 1), transY(cs, data[i]), color);
// }
}void addInt(QueueInt* queue, int a) {if (insertInt(queue, a)) {deleteInt(queue);insertInt(queue, a);}
}
最后是绘制代码
绘制静态数据代码:
#include <math.h>
#include <windows.h>
#include <stdio.h>
#include <easyx.h> // 引用图形库头文件
#include <conio.h>
#include "drawCoordinateSystem.h"
#include "queue.h"int main() {CoordinateSystem cs;coordinateSystemInit(&cs);float a[1001];int j = 0;for (float i = 0; i < 2 * 3.14; i += 3.14 / 500) {a[j++] = 10 * sin(i);}plotFloat(&cs, a, 1000, RED);getchar();return 0;
}
绘制动态数据代码:
#include <math.h>
#include <windows.h>
#include <process.h>
#include <stdio.h>
#include <easyx.h> // 引用图形库头文件
#include <conio.h>
#include "drawCoordinateSystem.h"
#include "queue.h"void fun(void* p) {CoordinateSystem cs;coordinateSystemInit(&cs);while (1) {dynamicPlotInt(&cs,&queue,RED);Sleep(20);}_endthread();
}int main(){queueInitInt(&queue);_beginthread(fun, 0, NULL);float t = 0;getchar();while (1) {if (int(t+1) % 500 == 0) {addInt(&queue, 100 * sin(t / 100));}elseaddInt(&queue,100*sin(t/100));Sleep(10);t++;printf("%d\n",getSizeInt(&queue));}return 0;
}
这里动态绘制只写了绘制int类型的代码,float类型的其实也基本一样,复制一下就好,如果各位有需求,可以自己动手或评论或者私信,我来加上。
基于easyX和vs使用c++绘制坐标系以及实时显示相关推荐
- 基于STM32的脉搏心率检测仪(OLED可以实时显示脉冲波形)
-设计完整,功能可全部实现,有完整报告文档说明.程序以及pcb文件- 可作为:课程设计,STM32实践学习,电子制作等 **禁止转载,以及用于其他商业用途.*** B站对应讲解心率传感器项目链接 设计 ...
- 基于EasyX的五子棋游戏
基于EasyX的五子棋游戏 一.预备知识 二.游戏逻辑 1.五子棋元素 2.五子棋规则 三.游戏设计 1.地图设计 2.点击设计 3.结束设计 4.整体设计 一.预备知识 1.使用EasyX必须要知道 ...
- 用easyx画电子钟_基于EasyX图形库的多线程绘图应用
本文<基于EasyX图形库的多线程绘图应用>由手机部落整理,仅供参考.如果觉得很不错,欢迎点评和分享-感谢你的阅读与支持! 张煜昕 摘要:EasyX 是C++语言进行图形化编程和游戏编程的 ...
- 基于EasyX的贪吃蛇游戏
基于EasyX的贪吃蛇游戏 一.预备知识 二.游戏逻辑 1.贪吃蛇元素 2.贪吃蛇规则 三.游戏设计 1.地图设计 2.移动设计 3.速度设计 4.整体设计 一.预备知识 1.使用EasyX必须要知道 ...
- 基于easyx库的GUI扫雷项目
基于easyx库的GUI扫雷项目 文章目录 基于easyx库的GUI扫雷项目 0.观前提醒 1.扫雷游戏项目效果展示 2.扫雷游戏项目基本信息 3.扫雷游戏项目设计思路 4.扫雷游戏实现原理 4.1 ...
- 基于EasyX的扫雷游戏
基于EasyX的扫雷游戏 一.预备知识 二.游戏逻辑 1.扫雷元素 2.扫雷规则 三.游戏设计 1.地图设计 2.点击设计 3.结束设计 4.整体设计 一.预备知识 1.使用EasyX必须要知道的一些 ...
- C/C++基于easyX库实现三星环绕小项目(C/C++)
1,项目描述 功能1:使用图形化的方式描述地球围绕着太阳转动,月球围绕着地球转动 功能2:在转动的过程中当用户按下1,2,3,4,5,6,7时它可以变换出7种不同的颜色,当用户按下8时它可以变换从1- ...
- 使用VC++绘制坐标系
首先打开VC++,新建一个单文档应用程序: 按下图,为View类添加消息处理函数,变更单文档窗体背景色为黑色: 在菜单中添加如下菜单: 为菜单添加消息处理函数:添加在View类中: 在View类头文件 ...
- 【精选】基于EasyX的贪吃蛇小游戏
文章目录 前言 一.项目环境 1.Visual Studio 2019 2.EasyX 20200902 二.运行效果展示 0.加载游戏 1.主菜单 2.游戏设置 3.游戏说明 4.生存模式 5.无尽 ...
最新文章
- cordova环境部署
- mybatisplus 结果_springboot整合mybatisPlus 乐观锁的实现
- js中加入php读取文件名,js获取文件里面的所有文件名(实例)
- BAPI FOR MD61,MD62,MD63
- BZOJ 2754 [SCOI2012]喵星球上的点名 (AC自动机、树状数组)
- 中查询一个文件夹下文件数量_如何在 Bash 中使用循环 | Linux 中国
- MySQL数据库之互联网常用架构方案(全)
- Eclipse开发工具组合键介绍
- 鼠标悬停在图片上出现蒙层的方法
- 几大经典算法c语言cnds,浮点数据有损压缩算法 附完整C代码
- [ArcPy百科]第一节:何为arcpy
- 微软在上海有哪些办公地点?上下班来回三小时?不止闵大荒!
- 阻焊机器人系统_可处理最大PCB面板干膜和阻焊激光直接成像的X3000(LDI)系统
- 广义相对论-学习记录1-第一章-历史回顾
- android 平板z97,高清配置 翰智Z97-W通话版平板评测
- 计算机的操作系统的功能有哪些,操作系统的主要功能是主要有哪些类型
- java怎么把数据传入数组_怎么把数据放入数组中
- 全球人造丝卫生棉条行业调研及趋势分析报告
- 【Python-数据结构】——线性结构
- Freemarker静态页面使用方法详解+指令
热门文章
- 合同诈骗与普通诈骗有什么区别
- 海思3518EV300 liteos sdk编译
- Linux 驱动USB键盘驱动入门demo
- 利用aircrack-ng破解WIFI密码
- 5.4节呈献:HP-Socket v5.3.1 发布 — 支持 Android NDK
- 云计算如何智慧升级我们的生活?
- 计算机窗口移动不了怎么办,电脑鼠标拖不动文件怎么办 电脑鼠标拖动不灵敏如何解决...
- 职场PPT达人装酷的13条秘诀
- VIRTUALBOX 虚拟机安装 OS X 10.9 MAVERICKS
- WIN7+MySQL+ActivePerl+bugzilla+Apache安装配置