计算机图形学——中点画线算法

计算机图形学——中点画线算法

/// <summary>
/// 中点画线算法
/// </summary>
/// <param name="x1">起点x</param>
/// <param name="y1">起点y</param>
/// <param name="x2">终点x</param>
/// <param name="y2">终点y</param>
/// <returns>返回计算出的点,不包含顶点</returns>
vector<pair<int, int>>midpointdrawing(int x1, int y1, int x2, int y2) {
    vector < pair<int, int>> point;
    double dx = x2 - x1;
    double dy = y2 - y1;
    int delatx = abs(dx);
    int delaty = abs(dy);
    int xstep = dx > 0 ? 1 : -1;
    int ystep = dy > 0 ? 1 : -1;
    int num = delaty > delatx ? delaty : delatx;
    int err = 0;
    double decision = abs(dy / dx);
    int A = 0, B = 0;
    A = static_cast<int>(dy) * xstep;//A的正负与dx有关
    B = static_cast<int>(dx) * ystep;//B的正负与dy有关
    if ((dy<=0&&dx>0)||(dy>0&&dx<=0)) {
        B *= -1;
    }
    else {
        A *= -1;
    }
    //point.emplace_back(x1, y1);

    if (delaty >= delatx) {
        err = A + 2 * B;
        for (int i = 1; i < num; i++) {
            if (err >= 0) {
                x1 += xstep;
                err += 2 * A + 2 * B;
            }
            else
            {
                err += 2 * B;
            }
            y1 += ystep;
            point.emplace_back(x1, y1);
        }
    }
    else
    {
        err = 2 * A + B;
        for (int i = 1; i < num; i++) {
            if (err >= 0) {
                err += 2 * A;
            }
            else {
                y1 += ystep;
                err += 2 * A + 2 * B;
            }
            x1 += xstep;
            point.emplace_back(x1, y1);
        }
    }
    return point;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值