做个小练习
通过导入图形库,在用图形库初始化的画布上进行坐标像素操作。
试用简单的二分算法逐步点出AB线段中的像素点来画线段,美中不足的是因为时间关系箭头并未完全按照要求使用无符整形。
#define _CRT_SECURE_NO_WARNINGS
#include <graphics.h>
#include <stdio.h>
#include <math.h>
#define HALFLENGTH 250
#define HALFHEIGHT 250
#define CIRCLERADIUS 10
#define SMALLARROWSLENGTH 5
#define BIGARROWSLENGTH 20
#define ARROWSANGLE 30
#define PI 3.14159265
void Drawarrows(const unsigned short Ax, const unsigned short Ay, const unsigned short Bx, const unsigned short By, int ArrowLength);
void Init()
{
initgraph(HALFLENGTH * 2, HALFHEIGHT * 2, SHOWCONSOLE);
int x = 0, y = 0;
for (x = 0; x < HALFLENGTH * 2; x++)
for (y = 0; y < HALFHEIGHT * 2; y++)
{
putpixel(x, y, WHITE);
}
for (x = 0, y = HALFHEIGHT; x < HALFLENGTH * 2; x++)
{
putpixel(x, y, BLACK);
}
for (x = HALFLENGTH, y = 0; y < HALFHEIGHT * 2; y++)
{
putpixel(x, y, BLACK);
}
Drawarrows(0, HALFHEIGHT, HALFLENGTH*2, HALFHEIGHT, SMALLARROWSLENGTH);
Drawarrows(HALFLENGTH, HALFHEIGHT * 2, HALFLENGTH, 0, SMALLARROWSLENGTH);
}
void Drawline(const unsigned short x1, const unsigned short y1, const unsigned short x2, const unsigned short y2)
{
unsigned short Midx = 0, Midy = 0;
Midx = (x1 + x2) / 2;
Midx = (Midx > 0) ? Midx : -Midx;
Midy = (y1 + y2) / 2;
Midy = (Midy > 0) ? Midy : -Midy;
putpixel(Midx, Midy, BLACK);
if (!((x1 == Midx && y1 == Midy)||(x2 == Midx && y2 == Midy)))//如果中点和A/B任一端点重合则二分到了尽头
{
Drawline(x1, y1, Midx, Midy);
Drawline(x2, y2, Midx, Midy);
}
}
//输入起点xy,重点xy,并画箭头
void Drawarrows(const unsigned short Ax, const unsigned short Ay, const unsigned short Bx, const unsigned short By,int ArrowLength)
{
//CoordinateTransformation(arrowX1, arrowY1);
//CoordinateTransformation(arrowX2, arrowY2);
// 计算箭头的两个端点坐标
ArrowLength = ARROWSANGLE;
double k = atan2((By - Ay), (Bx - Ax));//求AB斜率(弧度)
double angle1 = k + (180 - ARROWSANGLE) * PI / 180;
double angle2 = k - (180 - ARROWSANGLE) * PI / 180;
unsigned short arrowX1 = Bx + ArrowLength * cos(angle1);
unsigned short arrowY1 = By + ArrowLength * sin(angle1);
unsigned short arrowX2 = Bx + ArrowLength * cos(angle2);
unsigned short arrowY2 = By + ArrowLength * sin(angle2);
Drawline(Bx, By, arrowX1, arrowY1); // 绘制箭头的一段
Drawline(Bx, By, arrowX2, arrowY2); // 绘制箭头的另一段
}
void CoordinateTransformation(unsigned short &x, unsigned short &y)//把坐标翻转到第一象限
{
x += HALFLENGTH;
y = HALFHEIGHT - y;
}
int main()
{
Init();
unsigned short x = 0, y = 0, Ax = 0, Ay = 0, Bx = 0, By = 0;
printf("请输入点A的坐标Ax、Ay:");
scanf("%hu %hu", &Ax, &Ay);
printf("请输入点B的坐标Bx、By:");
scanf("%hu %hu", &Bx, &By);
if (Ax > HALFLENGTH || Bx > HALFLENGTH || Ay > HALFHEIGHT || By > HALFHEIGHT)
printf("InvalidValue!\n");
//画出AB线段
CoordinateTransformation(Ax, Ay);//象限转换(默认为右x正,下y正)
CoordinateTransformation(Bx, By);
putpixel(Ax, Ay, BLACK);//补全AB点
putpixel(Bx, By, BLACK);
Drawline(Ax, Ay, Bx, By);//绘制线段,递推中点绘制
//在A画个圆
for (x = Ax- CIRCLERADIUS; x < Ax+ CIRCLERADIUS; x++)
for (y = Ay - CIRCLERADIUS; y < Ay + CIRCLERADIUS; y++)
{
if ((x - Ax) * (x - Ax) + (y - Ay) * (y - Ay) <= CIRCLERADIUS * CIRCLERADIUS)
putpixel(x, y, BLACK);
}
//画箭头
Drawarrows(Ax, Ay, Bx, By, BIGARROWSLENGTH);
system("pause");
closegraph();
return 0;
}