Windows控制台下绘制简单图形

最近接触到一个很有意思的问题,如何在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);
for (i = 0; i < NUMBER; i++)
{
LineTo(hdc,point[i].x,point[i].y);
}
_getch();
return 0;
}

  但是这个程序存在一个问题,就是如果控制台被其它窗口遮住后,已经绘制的线条不会重绘,也就意味着那部分线条看不见了,只能重新运行程序,这个问题怎么解决呢?我也不知道,不过可以将整个函数包含一个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)
{
if (fabs(sqrt(pow2(point.x - center->x) + pow2(point.y - center->y)) - radius) <= 1)
{
DrawPoint(hdc,&point);
}
//是否到达行末
if (point.x == xmax)
{
if (point.y == ymax)
{
break;
}
else
{
point.x = xmin;
point.y++;
continue;
}
}
point.x++;
}
}

  绘制的圆如下图:

  

时间: 2024-10-26 05:48:12

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

[Qt教程] 第11篇 2D绘图(一)绘制简单图形

[Qt教程] 第11篇 2D绘图(一)绘制简单图形 楼主  发表于 2013-4-23 12:52:35 | 查看: 1398| 回复: 5 绘制简单图形 版权声明 该文章原创于Qter开源社区,作者yafeilinux,转载请注明出处! 导语 Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice和QPaintEngine这三个类.其中QPainter用来执行绘图操作:QPaintDevice提供绘图设备,它是一个二

python opencv 绘制简单图形

09-python opencv 绘制简单图形 09-python opencv 绘制简单图形 概述 实现过程 引用与创建空图 绘制直线 绘制矩形 绘制圆 绘制椭圆 添加文字 显示图像 源代码 运行结果 参考 概述 本节实现的是使用OpenCV里自带的函数,绘制直线.长方形.圆形和椭圆. 绘制直线 绘制长方形 绘制圆形 绘制椭圆 添加文字 实现过程 引用与创建空图 不再赘述,代码如下. import cv2 import numpy # empty image img = np.zeros((5

[OBJECT-C语言随笔之四]创建视图并绘制简单图形

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-object/401.html 这段时间N忙,没办法,创业公司,当然抽时间也仍然再自学ios-OK,基础的语言基础,我就不多说了,从今天开始直接写游戏开发部分了: 声明一点:iOS游戏开发系列没有我写的Android游戏开发系列有权威性,因为我也是在学习中,只是拿出来给大家分享,希望大家不要较真,现在咱们都是一年级新生,咳咳,好

控制台下星号密码输入的实现

最近频繁需要实现在windows控制台下输入星号密码的功能,Unix/Linux那种没有任何屏显的实现总感觉对用户不太友好.今天在自己的Linux代码库中发现了自己去年写图书馆管理系统的时候写的一个密码输入函数.索性拿来修改了接口并且重新优化了处理逻辑后移植到了windows下(其实也就是加上几句条件编译罢了).代码如下: #ifndef _WIN32 // 如果不是WIN32环境,则要自定义getch()函数 #include <termio.h> int getch(void) { str

Linux操作系统中控制台下的截图攻略

Linux越来越受到人们的关注,使用的人也越来越多.Linux用户可以通过网络交流使用经验.介绍好的软件.在交流中,人们经常互相在网上贴张屏幕截图,使得相互之间的交流变得更加直接.容易.这里我介绍一些Linux下的抓图软件和使用方法,希望能让大家更灵活地应用Linux. 控制台下的截图 1.在控制台(Console)下如果只想要获得文字的输出,例如命令的帮助信息,可以直接使用管道命令,将输出内容保存到指定的文件当中. 2.可以用setterm程序来获得控制台下的屏幕截图.命令格式为:setter

控制台下的图表库 tcharts.js

我们开发使用的很多工具都是 cli 工具,比如 babel,eslint,webpack,jest 等等.控制台因为其特殊性,它的信息表现力仅在于一个一个单纯的字符. 控制台的字符图表可以有效提高数据可视化能力,提高信息接收的效率,也更加美观. /** * 柱形图 * * ^ * | A:70 * | +---+ * | | | * | | | C:50 * | | | +---+ * | | | | | * | | | B:30 | | * | | | +---+ | | * | | | |

《HTML5 Canvas游戏开发实战》——2.1 绘制基本图形

2.1 绘制基本图形 所谓基本图形,就是指线.矩形.圆等最简单的图形,任何复杂的图形都是由这些简单的图形组合而成的.我们首先来了解一下这些简单图形的绘制方法.2.1.1 画线你可能是第一次接触Canvas绘图.首先,我们通过绘制一个简单的直线来学习Canvas的功能.其代码如代码清单2-1所示.代码清单 2-1 <!DOCTYPE HTML> <html> <body> <canvas id="myCanvas" width="200

《Python语言程序设计》——3.7 绘制各种图形

3.7 绘制各种图形 关键点:Python的Turtle模块里包含移动笔.设置笔的大小.举起和放下笔的方法.第1章介绍如何使用Turtle绘画.一个Turtle实际上是一个对象,在导入Turtle模块时,就创建了对象.然后,可以调用Turtle对象的各种方法完成不同的操作.本节将介绍Turtle对象更多的方法.当创建一个Turtle对象时,它的位置被设定在(0,0)处--窗口的中心,而且它的方向被设置为向右.Turtle模块用笔来绘制图形.默认情况下,笔是向下的(就像真实的笔尖触碰着一张纸).如

Direct2D教程II——绘制基本图形和线型(StrokeStyle)的设置详解

目前,在博客园上,相对写得比较好的两个关于Direct2D的教程系列,分别是万一的Direct2D系列和zdd的Direct2D系列.有兴趣的网友可以去看看.本系列也是介绍Direct2D的教程,是基于Windows API Code Pack 1.1的Direct2D的教程,如果要调试文中的代码的话,还得参考前文 Direct2D教程I--简介及首个例子 下载导入Windows API Code Pack 1.1的动态库   在前文 Direct2D教程I--简介及首个例子 简单介绍了Dire