通过图形库实现像素操作

做个小练习

通过导入图形库,在用图形库初始化的画布上进行坐标像素操作。

试用简单的二分算法逐步点出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;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值