最近接触到一个很有意思的问题,如何在Windows控制台下画图,翻遍了C的头文件也没找到画图的函数,好吧,那就用Windows提供的API函数吧,看来想移植是没戏了。先画一个简单的图,类似心电图那种吧,假设得到的数据是纵坐标的值,横坐标默认从0开始,每隔512uS(微秒的那个符号不会打)得到一个纵坐标值,要求将所有纵坐标值连起来,就以这个简单的程序为例吧。

  既然有了需求,实现起来就简单了,首先我们应该有一个控制台窗口的上下文(device context)句柄,然后使用MoveToExLineTo函数连线就行了。代码如下:

  

#include <windows.h> #include <stdio.h> #include <conio.h> #include "data.h"  //声明了名为point的二维数组,以及记录数组元素个数的NUMBER常量 // //下列X-Y坐标平面的值取决于控制台的尺寸,需要根据实际情况进行调整 // //起始X坐标 #define X_START 10 //结束X坐标 #define X_END 650 //每个值的X坐标增量,相当于512uS #define X_INC 10 //Y坐标 #define Y 250 int main() { HWND hwnd; HDC hdc; int i; //获取console的设备上下文句柄 hwnd = GetConsoleWindow(); hdc = GetDC(hwnd); //调整一下console背景颜色,否则看不清线条 system("color 3D"); //起始位置,Windows中窗口的坐标系相当于直角坐标系第一象限翻转到第四象限 MoveToEx(hdc,X_START,Y,NULL); //画基准坐标线 LineTo(hdc,X_END,Y); //开始绘图 MoveToEx(hdc,X_START,Y,NULL); ; i < NUMBER; i++) { LineTo(hdc,point[i].x,point[i].y); } _getch(); ; }

  但是这个程序存在一个问题,就是如果控制台被其它窗口遮住后,已经绘制的线条不会重绘,也就意味着那部分线条看不见了,只能重新运行程序,这个问题怎么解决呢?我也不知道,不过可以将整个函数包含一个while循环里,如果自己是顶层窗口就重新绘制,只是这样似乎代价太大了,呵呵。

  来看一下这个程序绘制的图形吧。

  

  既然能绘制出线条自然就可以会绘制出柱形图之类的图形,稍微修改一下就可以了,代码就不贴了,效果如下图。

  

  上面这些都比较好画,那么如果画圆呢?

  我想到两种方法,第一种方法是计算,首先分别计算出最大和最小的X、Y值(xmin,xmax,ymin,ymax),然后根据X^2+Y^2=R^2,在for (x = xmin; x <= xmax; x++)内部计算Y值,最后画点就是了;这个应该是比较简单的。

  第二种方法是扫描,左上角(xmin,ymin)、右上角(xmax,ymin)、左下角(xmin,ymax)和右下角(xmax,ymax)这四个点确定一个正方形,对正方形内部对每个点进行运算,也是根据X^2+Y^2=R2,只是现在根据X和Y算出R0,然后跟R对比而已,而且比第一种方法多了一个判断——是否到达行末,若到达行末则跳到下一行,若已经到了最后一行的最后一列,那就跳出循环。不过这个方法显然比较奢侈,如果半径增大n倍的话,计算量增大了n^2倍。就贴这种方法的代码吧。

  

void circle(POINT *center,int radius) { HWND hwnd; HDC hdc; int xmin = center->x - radius; int xmax = center->x + radius; int ymin = center->y - radius; int ymax = center->y + radius; POINT point; hwnd = GetConsoleWindow(); hdc = GetDC(hwnd); point.x = xmin; point.y = ymin; MoveToEx(hdc,center->x,center->y - radius,NULL); while (TRUE) { ) { DrawPoint(hdc,&point); } //是否到达行末 if (point.x == xmax) { if (point.y == ymax) { break; } else { point.x = xmin; point.y++; continue; } } point.x++; } }

  绘制的圆如下图:

  

Windows控制台下绘制简单图形的更多相关文章

  1. 学习笔记:HTML5 Canvas绘制简单图形

    HTML5 Canvas绘制简单图形 1.添加Canvas标签,添加id供js操作. <canvas id="mycanvas" height="700" ...

  2. 网络基础 Windows控制台下Ftp使用简介

    Windows控制台下Ftp使用简介 by:授客 QQ:1033553122 测试环境: ftp服务器所在主机ip:172.25.75.2 ftp用户目录:F:\ftp   C:\Users\laif ...

  3. Java入门:绘制简单图形

    在上一节,我们学习了如何使用swing和awt工具创建一个空的窗口,本节学习如何绘制简单图形. 基本绘图介绍 Java中绘制基本图形,可以使用Java类库中的Graphics类,此类位于java.aw ...

  4. QT在Windows控制台下输出

    原地址:http://blog.csdn.net/fjb2080/article/details/9013047 在windows的控制台下输出,需要在pro文件中加入: CONFIG += cons ...

  5. CSS绘制简单图形

    究竟该用字体图标.图片图标.还是CSS画一个图标?我也不知道.各有千秋吧.本文将介绍如何用css绘制简单的图形,所有测试在chrome58.0完成,如果你不能得到正确结果请到caniuse查一查看看是 ...

  6. shape-自绘制简单图形

    shape 可以绘制简单的图形,颜色等.它主要就是应用于selector 的一些状态. 本文内容参考自http://www.cnblogs.com/cyanfei/archive/2012/07/27 ...

  7. 利用 turtle库绘制简单图形

    turtle库是python的基础绘图库,这个库被介绍为一个最常用的用来介绍编程知识的方法库,其主要是用于程序设计入门,是标准库之一,利用turtle可以制作很多复杂的绘图. turtle名称含义为“ ...

  8. 在高德地图上用svg.js绘制简单图形

    这段时间做的一个项目,需要在地图上绘制简单的图形.在学习高德地图JS API的过程中,发现高德地图提供的点.线等API并不能满足我的需求,还好它开放了自定义图层CustomLayer,官方说自定义图层 ...

  9. Quartz 2D绘制简单图形

    在Quartz 2D中,绘图是通过图形上下文进行绘制的,以下绘制几个简单的图形 首先先创建一个QuartzView.swift文件继承自UIView,然后实现drawRect方法: import UI ...

随机推荐

  1. ABP官方文档翻译 3.7 领域事件(事件总线)

    领域事件(事件总线) 事件总线 注入IEventBus 获取默认实例 定义事件 预定义事件 处理异常 实体更改 触发事件 处理事件 处理基础事件 处理者异常 处理多个事件 注册处理者 自动 手动 取消 ...

  2. python中的各种转化

    1.数之间的转化 #浮点型to整型 >>> int(5.6) 5 #整型to浮点型 >>> float(5) 5.0 2.数与字符串 #字符串to整型 >&g ...

  3. bzoj 1930: [Shoi2003]pacman 吃豆豆 [费用流]

    1930: [Shoi2003]pacman 吃豆豆 题意:两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会吃掉它.PACMAN行走的 ...

  4. 夏令营讲课内容整理Day 0.

    今年没有发纸质讲义是最气的.还好我留了点课件. 第一次用这个估计也不怎么会用,但尝试一下新事物总是好的. 前四天gty哥哥讲的内容和去年差不多,后三天zhn大佬讲的内容有点难,努力去理解吧. 毕竟知识 ...

  5. 【STL】c++ priority_queue的使用方法

    最开始在项目文档看到priority_queue这个模板时,还以为是自己定义的呢,后来查了一下,原来这是STL中存在的一种优先队列. 1.最简单的使用方法 std::priority_queue< ...

  6. 发生Windows无法访问远程共享的解决办法

    发现问题 今天在访问远程时发生一个很郁闷的网络错误,如下图所示 问题修复步骤 这个问题可以采用以下步骤来修复 Step1.添加网络映射盘 添加网络映射时选择使用其他凭据登陆,这样就有机会让Window ...

  7. SpringMVC之HelloWorld实例

    1.1 Helloworld实例的操作步骤  1. 加入jar包 2. 配置dispatcherServlet 3. 加入Spring配置文件 4. 编写请求处理器 并表示为处理器 5. 编写视图 1 ...

  8. 企业Nginx+Keepalived双主架构案例实战

    通过上一次课程的学习,我们知道Nginx+keepalived主从配置,始终有一台服务器处于空余状态,那如何更好的利用起来呢,我们需要借助Nginx+keepalived双主架构来实现,如下图通过改装 ...

  9. Redis Sentinel安装与部署,实现redis的高可用

    前言 对于生产环境,高可用是避免不了要面对的问题,无论什么环境.服务,只要用于生产,就需要满足高可用:此文针对的是redis的高可用. 接下来会有系列文章,该系列是对spring-session实现分 ...

  10. ios开发常用RGB色值

    iOS中RGB常用的色值,同时可将对颜色的设置定义成宏,方便开发应用,如: // RGB颜色转换(16进制->10进制) #define UIColorFromRGB(rgbValue) [UI ...