GAMES101-现代计算机图形学学习笔记(5)作业4

前言

上篇作业3

本篇继续更新作业4相关内容

作业4相关链接

games的作业4链接

我的源码

作业4简述

  • 实现贝塞尔曲线
  • (提高)对贝塞尔曲线实现反走样

作业4相关知识笔记

  • 贝塞尔曲线相关

作业4思路

此处我考虑的是迭代。

cv::Point2f recursive_bezier(const std::vector<cv::Point2f> &control_points, float t) 
{
    // TODO: Implement de Casteljau's algorithm
    if(control_points.size()==2) return (1-t) * control_points[0] + t * control_points[1];

    std::vector<cv::Point2f> temp;

    for (int i=0;i<control_points.size()-1;i++){
        temp.push_back((1-t) * control_points[i] + t * control_points[i+1]);
    }

    return recursive_bezier(temp,t);

}
void bezier(const std::vector<cv::Point2f> &control_points, cv::Mat &window) 
{
    // TODO: Iterate through all t = 0 to t = 1 with small steps, and call de Casteljau's 
    // recursive Bezier algorithm.
    
    for (double t= 0.0;t<=1.0;t+=0.001){
        auto p = recursive_bezier (control_points,t);
        window.at<cv::Vec3b>(p.y,p.x)[1] =255;
    }
    
}

结果:
在这里插入图片描述

提高部分:

计算相邻4个边缘点的像素颜色,此处有4种情况,

我们将点所在的像素颜色设为a(不变),那么根据距离再计算相邻3个像素的颜色。

void bezier(const std::vector<cv::Point2f> &control_points, cv::Mat &window) 
{
    // TODO: Iterate through all t = 0 to t = 1 with small steps, and call de Casteljau's 
    // recursive Bezier algorithm.
    //Bilinear
    
    for (double t= 0.0;t<=1.0;t+=0.001){
        auto p = recursive_bezier (control_points,t);
        

        float dx = p.x - std::floor(p.x);
        float dy = p.y - std::floor(p.y);
        cv::Point2f near;
        cv::Point2f p00;
        cv::Point2f p01;
        cv::Point2f p10;
        cv::Point2f p11;

        if(dx<=0.5f && dy<=0.5f){
            p00 = cv::Point2f(std::floor(p.x),std::floor(p.y));
            p01 = cv::Point2f(std::floor(p.x),std::floor(p.y)+1);
            p10 = cv::Point2f(std::floor(p.x)+1,std::floor(p.y));
            p11 = cv::Point2f(std::floor(p.x)+1,std::floor(p.y)+1);
            near = p00;
        }
        if(dx<=0.5f && dy>0.5f){
            p00 = cv::Point2f(std::floor(p.x)-1,std::floor(p.y));
            p01 = cv::Point2f(std::floor(p.x)-1,std::floor(p.y)+1);
            p10 = cv::Point2f(std::floor(p.x),std::floor(p.y));
            p11 = cv::Point2f(std::floor(p.x),std::floor(p.y)+1);
            near = p10;
        }
        if(dx>0.5f && dy<=0.5f){
            p00 = cv::Point2f(std::floor(p.x),std::floor(p.y)-1);
            p01 = cv::Point2f(std::floor(p.x),std::floor(p.y));
            p10 = cv::Point2f(std::floor(p.x)+1,std::floor(p.y)-1);
            p11 = cv::Point2f(std::floor(p.x)+1,std::floor(p.y));
            near = p01;
        }
        if(dx>0.5f && dy>0.5f){
            p00 = cv::Point2f(std::floor(p.x)-1,std::floor(p.y)-1);
            p01 = cv::Point2f(std::floor(p.x)-1,std::floor(p.y));
            p10 = cv::Point2f(std::floor(p.x),std::floor(p.y)-1);
            p11 = cv::Point2f(std::floor(p.x),std::floor(p.y));
            near = p11;
        }

        std::vector<cv::Point2f> vec;
        vec.push_back(p00);
        vec.push_back(p01);
        vec.push_back(p10);
        vec.push_back(p11);

        float distance = sqrt((p-near).x * (p-near).x + (p-near).y * (p-near).y);
        
        for(auto point:vec){
            float d = sqrt((p-point).x * (p-point).x + (p-point).y * (p-point).y);
            float ratio = distance/d;
            window.at<cv::Vec3b>(p.y,p.x)[1] =255;            
            cv::Vec3b color = window.at<cv::Vec3b>(p.y,p.x);
            window.at<cv::Vec3b>(point.y,point.x) = ratio * color;
        }
    }   
}

对比:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值