[计算机图形学]Bresenham画线算法的C语言代码

本文详细介绍了Bresenham算法的C语言实现,包括垂直线、水平线以及非垂直非水平线的绘制过程,适用于计算机图形学中的像素渲染。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[计算机图形学]Bresenham画线算法的C语言代码

教材上Bresenham画线算法的推导详细,这里不再赘述,直接贴出C语言代码:

#include <stdio.h>
#include <stdlib.h>

void vline(int x, int y1, int y2, FILE* f){
    /*竖直的线*/
    int s = y1 > y2 ? -1 : 1; // 迭代方向
    for (int i = y1; i != y2; i += s) {
        fprintf(f, "(%d,%d)\n", x, i);
    }
    fprintf(f, "(%d,%d)\n", x, y2);
}

void hline(int x1, int x2, int y, FILE* f){
    /*水平的线*/
    int s = x1 > x2 ? -1 : 1; // 迭代方向
    for (int i = x1; i != x2; i += s){
        fprintf(f, "(%d,%d)\n", i, y);
    }
    fprintf(f, "(%d,%d)\n", x2, y);
}

void BresenhamLine(int x1, int y1, int x2, int y2, FILE* f){
    /* 使用Bresenham画线算法绘制起点为(x1,y1),终点为(x2,y2)的直线 */

    if (x1 == x2) { // 直线为竖直线
        vline(x1, y1, y2, f);
        return;
    }

    if (y1 == y2) { // 直线为水平线
        hline(x1, x2, y1, f);
        return;
    }

    int dx, dy; // 起终点之间的横、纵距离
    dx = (x1 > x2) ? (x1 - x2) : (x2 - x1);
    dy = (y1 > y2) ? (y1 - y2) : (y2 - y1);

    int sx, sy; // 起点到终点的迭代方向
    sx = (x1 > x2) ? -1 : 1;
    sy = (y1 > y2) ? -1 : 1;

    int x, y, e; // 迭代参数
    x = x1;
    y = y1;
    e = (dy > dx) ? (2 * dx - 2 * dy) : (2 * dy - 2 * dx);
    fprintf(f, "(%d,%d)\n", x1, y1);
    if (dy > dx) {
        while (x != x2){
            if (e < 0){
                y += sy; e += 2 * dx;
                fprintf(f, "(%d,%d)\n", x, y);
            } else {
                x += sx; y += sy; e += 2 * dx - 2 * dy;
                fprintf(f, "(%d,%d)\n", x, y);
            }
        } return;
    } else {
        while (x != x2){
            if (e < 0) {
                x += sx; e += 2 * dy;
                fprintf(f, "(%d,%d)\n", x, y);
            } else {
                x += sx; y += sy; e += 2 * dy - 2 * dx;
                fprintf(f, "(%d,%d)\n", x, y);
            }
        } return;
    }
}

int main() {
    int x1,y1,x2,y2;
    printf("请输入点(x1 y1): ");
    scanf("%d %d", &x1, &y1);
    printf("请输入点(x2 y2): ");
    scanf("%d %d", &x2, &y2);

    FILE* f;
    f = fopen("BresenhamLine.txt","w");
    if (f == NULL) {
        printf("无法建立输出文件,程序错误。");
        return 0;
    }

    BresenhamLine(x1, y1, x2, y2, f);
    fclose(f);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值