这一节中,我们讨论文档中的图形绘制相关函数。
本节中的所有代码窗体大小均为800 * 600。坐标系原点在窗体中心,X轴正方向向右,Y轴正方向向上。
1.点
putpixel
这个函数用于画点。
void putpixel(
int x,
int y,
COLORREF color
);
参数 | 类型 | 意义 |
---|---|---|
x | int | 点的 x 坐标 |
y | int | 点的 y 坐标 |
color | COLORREF | 点的颜色 |
返回值 无
putpixel
函数的前两个参数为点的坐标,第三个参数为点的颜色。目前,我们并不想展开讨论怎样选取颜色,大家可以先使用EasyX中符号常量中的颜色。
符号常量 | 颜色 |
---|---|
BLACK | 黑 |
BLUE | 蓝 |
GREEN | 绿 |
CYAN | 青 |
RED | 红 |
MAGENTA | 紫 |
BROWN | 棕 |
LIGHTGRAY | 浅灰 |
DARKGRAY | 深灰 |
LIGHTBLUE | 亮蓝 |
LIGHTGREEN | 亮绿 |
LIGHTCYAN | 亮青 |
LIGHTRED | 亮红 |
LIGHTMAGENTA | 亮紫 |
YELLOW | 黄 |
WHITE | 白 |
例如,在原点处画一个红色的点,第三个参数可以填上表中的RED
。
putpixel(0, 0 , RED);
现在,我们在下图的坐标处,分别画上几个颜色不一样的点。
#include <easyx.h>
#include <stdio.h>
int main()
{
initgraph(800, 600);
setorigin(400, 300);
setaspectratio(1, -1);
// 画点
putpixel(0, 0, RED); // (0, 0) 红色
putpixel(200, 200, YELLOW); // (200, 200) 黄色
putpixel(200, -200, CYAN); // (200, -200) 青色
putpixel(-200, -200, GREEN); // (-200, -200) 绿色
putpixel(-200, 200, WHITE); // (-200, 200) 白色
getchar();
closegraph();
return 0;
}
这些点仅占一个像素,所以很难看清。我们不如在平面内随机画点。为了不让点跑到平面外,那么,x、y的取值范围如下:
-400 <= x <= 400 -300 <= y <= 300
写成C语言代码如下:
x = rand() % (800 + 1) - 400;
y = rand() % (600 + 1) - 300;
表达式rand() % (800 + 1)
的值最小为0, 最大为800。其后,减去400后,区间为[-400,400]。
表达式rand() % (600 + 1)
的值最小为0, 最大为600。其后,减去300后,区间为[-300,300]。
随机在屏幕中绘制1000个点。
#include <easyx.h>
#include <stdio.h>
int main()
{
initgraph(800, 600);
setorigin(400, 300);
setaspectratio(1, -1);
int x, y;
// 随机画点
for (int i = 0; i < 1000; i++)
{
x = rand() % (800 + 1) - 400;
y = rand() % (600 + 1) - 300;
putpixel(x, y, WHITE);
}
getchar();
closegraph();
return 0;
}
2.线
line
这个函数用于画直线。
void line(int x1, int y1, int x2, int y2);
参数 | 类型 | 意义 |
---|---|---|
x1 | int | 直线的起始点的 x 坐标 |
y1 | int | 直线的起始点的 y 坐标 |
x2 | int | 直线的终止点的 x 坐标 |
y2 | int | 直线的终止点的 y 坐标 |
返回值 无
我们使用line
函数来画两条直线。
- 从点(-200, 200)到(200, -200)
- 从点(-200, -200)到(200, 200)
代码如下:
line(-200, 200, 200, -200);
line(-200, -200, 200, 200);
3.圆
circle
这个函数用于画圆。
void circle(
int x,
int y,
int radius
);
参数 | 类型 | 意义 |
---|---|---|
x | int | 圆心 x 坐标 |
y | int | 圆心 y 坐标 |
radius | int | 半径 |
返回值 无
让我们用circie
函数在原点(0 , 0)处,画一个半径为200的圆形。
circle(0, 0, 200);
接着多画几个圆,用circie
函数在原点(0 , 0)处,从半径10开始,绘制同心圆。半径每次递增10,直到半径大于300为止。
#include <easyx.h>
#include <stdio.h>
int main()
{
initgraph(800, 600);
setorigin(400, 300);
setaspectratio(1, -1);
// 画同心圆
for (int r = 10; r <= 300; r += 10)
{
circle(0 , 0 , r);
}
getchar();
closegraph();
return 0;
}
4.矩形
rectangle
这个函数用于画矩形。
void rectangle(
int left,
int top,
int right,
int bottom
);
参数 | 类型 | 意义 |
---|---|---|
left | int | 矩形左上角 x 坐标 |
top | int | 矩形左上角 y 坐标 |
right | int | 矩形右下角 x 坐标 |
bottom | int | 矩形右下角 y 坐标 |
返回值 无
由矩形的左上角与右下角顶点即可确定一个矩形。
让我们使用左上角(-200, 100),右下角(200, -100)绘制一个矩形。
#include <easyx.h>
#include <stdio.h>
int main()
{
initgraph(800, 600);
setorigin(400, 300);
setaspectratio(1, -1);
// 矩形
rectangle(-200, 100, 200, -100);
getchar();
closegraph();
return 0;
}
5.椭圆
ellipse
这个函数用于画椭圆。
void ellipse(
int left,
int top,
int right,
int bottom
);
参数 | 类型 | 意义 |
---|---|---|
left | int | 椭圆外切矩形的左上角 x 坐标 |
top | int | 椭圆外切矩形的左上角 y 坐标 |
right | int | 椭圆外切矩形的右下角 x 坐标 |
bottom | int | 椭圆外切矩形的右下角 y 坐标 |
返回值 无
由矩形的左上角与右下角顶点可确定一个矩形,ellipse
函数在该矩形内做内切椭圆。
让我们使用左上角(-200, 100),右下角(200, -100)确定一个矩形,接着绘制这个矩形的内切椭圆。
#include <easyx.h>
#include <stdio.h>
int main()
{
initgraph(800, 600);
setorigin(400, 300);
setaspectratio(1, -1);
// 椭圆
ellipse(-200, 100, 200, -100);
getchar();
closegraph();
return 0;
}
6.圆角矩形
roundrect
这个函数用于画圆角矩形。
void roundrect(
int left,
int top,
int right,
int bottom,
int ellipsewidth,
int ellipseheight
);
参数 | 类型 | 意义 |
---|---|---|
left | int | 圆角矩形左上角 x 坐标 |
top | int | 圆角矩形左上角 y 坐标 |
right | int | 圆角矩形右下角 x 坐标 |
bottom | int | 圆角矩形右下角 y 坐标 |
ellipsewidth | int | 构成圆角矩形的圆角的椭圆的宽度 |
ellipseheight | int | 构成圆角矩形的圆角的椭圆的高度 |
返回值 无
圆角矩形与矩形类似。只不过,它的四个角被椭圆的一段弧形替代。roundrect
函数前四个参数为矩形左上角与右下角顶点的坐标,后两个参数为椭圆的宽与高。
让我们使用左上角(-200, 100),右下角(200, -100)确定一个矩形,再使用宽度为200,高度为100的椭圆的一段弧形替代矩形的四个角。
#include <easyx.h>
#include <stdio.h>
int main()
{
initgraph(800, 600);
setorigin(400, 300);
setaspectratio(1, -1);
// 圆角矩形
roundrect(-200, 100, 200, -100, 200, 100);
getchar();
closegraph();
return 0;
}
7.扇形
pie
这个函数用于画扇形。
void pie(
int left,
int top,
int right,
int bottom,
double stangle,
double endangle
);
参数 | 类型 | 意义 |
---|---|---|
left | int | 扇形所在椭圆的外切矩形的左上角 x 坐标 |
top | int | 扇形所在椭圆的外切矩形的左上角 y 坐标 |
right | int | 扇形所在椭圆的外切矩形的右下角 x 坐标 |
bottom | int | 扇形所在椭圆的外切矩形的右下角 y 坐标 |
stangle | int | 扇形的起始角的弧度 |
endangle | int | 扇形的终止角的弧度 |
返回值 无
扇形pie
函数前四个参数与椭圆函数ellipse
一致,为椭圆外切矩形的左上角坐标与右下角坐标。确定椭圆之后,再根据后两个参数,起始弧度与终止弧度确定扇形的圆心角大小。圆心角从X轴正方向开始,顺时针旋转,单位为弧度。
若不翻转Y坐标轴,圆心角从X轴正方向开始,逆时针旋转。
让我们根据外切矩形左上角(-200, 100)、右下角(200, -100)确定椭圆。接着,圆心角选取从0弧度开始,到π / 4弧度的区间。
#include <easyx.h>
#include <stdio.h>
#define PI 3.14
int main()
{
initgraph(800, 600);
setorigin(400, 300);
setaspectratio(1, -1);
// 画扇形
pie(-200, 100, 200, -100, 0, PI / 4);
getchar();
closegraph();
return 0;
}
8.圆弧
arc
这个函数用于画圆弧。
void arc(
int left,
int top,
int right,
int bottom,
double stangle,
double endangle
);
参数 | 类型 | 意义 |
---|---|---|
left | int | 圆弧所在椭圆的外切矩形的左上角 x 坐标 |
top | int | 圆弧所在椭圆的外切矩形的左上角 y 坐标 |
right | int | 圆弧所在椭圆的外切矩形的右下角 x 坐标 |
bottom | int | 圆弧所在椭圆的外切矩形的右下角 y 坐标 |
stangle | int | 圆弧的起始角的弧度 |
endangle | int | 圆弧的终止角的弧度 |
圆弧arc
函数与扇形pie
函数的参数全部一致,只不过圆弧arc
函数不会绘制从圆心到圆周的线段。
#include <easyx.h>
#include <stdio.h>
#define PI 3.14
int main()
{
initgraph(800, 600);
setorigin(400, 300);
setaspectratio(1, -1);
// 画圆弧
arc(-200, 100, 200, -100, 0, PI / 4);
getchar();
closegraph();
return 0;
}