其他分享
首页 > 其他分享> > 计算机图形学

计算机图形学

作者:互联网

计算机图形学期末复习

第一章 绪论

第二章 计算机设备及硬件系统

知识点

image-20201204152829971 image-20201204154551945

注意事项

第四章 图形的表示与数据结构

第五章 基本图形生成算法

第六章 二维变换级二维观察

二维变换

裁剪

第七章 三维变换及三维观察

三维变换

三维观察

(规定以逆时针旋转方向为正向;三视图:以Z轴正向朝上)

投影在x0y平面

透视投影
image-20201206162028637 image-20201206162054131

第八章 曲线与曲面

第九、十章 消隐、真实感图形绘制

消隐

简单光照模型

入射光=反射光+透射光+散射光+吸收光
简单光反射模型=漫反射光+环境光+镜面反射光

程序设计

编码裁剪

//编码定义
char clipCode(const GPoint2d &pt, const GRect2d &rc)
{
    char code = 0;
    if(pt.y() > rc.y1()) code |= 0x01;
    else if(pt.y() < rc.y0()) code |= 0x02;
    if(pt.x() > rc.x1()) code |= 0x04;
    else if(pt.x() < rc.x0()) code |= 0x08;
    return code;
}

//裁剪
bool gltLineClip2d(GPoint2d &pt0, GPoint2d &pt1, const GRect2d &rc)
{
    char c0, c1;
    while(true)
    {
        c0 = clipCode(pt0, rc);
        c1 = clipCode(pt1, rc);
        if((c0 & c1) != 0) return false;//按位与,两点在同一个测
        if(c0 == 0 && c1 == 0) return true;//两点在窗口内

        if(c0 == 0)
        {
            swap(pt0, pt1);
            swap(c0, c1);
        }

        if(c0 & 0x01) // 在 Yt 之上
        {
            pt0.setX(pt0.x()-(pt0.y()-rc.y1())*(pt0.x()-pt1.x())/(pt0.y()-pt1.y()));
            pt0.setY(rc.y1());
        }
        else if(c0 & 0x02) // 在 Yb 之下
        {
            pt0.setX(pt0.x()-(pt0.y()-rc.y0())*(pt0.x()-pt1.x())/(pt0.y()-pt1.y()));
            pt0.setY(rc.y0());
        } 
        else if(c0 & 0x04) // 在 Xr 之右
        {
            pt0.setY(pt0.y()-(pt0.x()-rc.x1())*(pt0.y()-pt1.y())/(pt0.x()-pt1.x()));
            pt0.setX(rc.x1());
        }
        else if(c0 & 0x08) // 在 Xl 之左
        {
            pt0.setY(pt0.y()-(pt0.x()-rc.x0())*(pt0.y()-pt1.y())/(pt0.x()-pt1.x()));
            pt0.setX(rc.x0());
        } 
    }
}

Bezier曲线

//bezier的Castel推分算法
double bezierCastel(double x[],int n,double t){
	for(int r=1;r<n;r++){
        for(int i=0;i<n-r;i++){
            x[i] = (1-t)*x[i]+t*x[i+1];
        }
    }
    return x[0];
}

void gltBezier2d(const GPoint2dArray &points){
    if(points.count<2)
        return;
    double x0,y0,x1,y1;
    double t,dt;
    GPoint2d pt;
    int n = points.count();
    dt = 1.0f/(n*20);
    double *x = new double[n];
    double *y = new double[n];
    pt = points.at(0);
    x0 = pt.x();
    y0 = pt.y();
    for(int i = 0;i<n;i++){
        pt = points.at(i);
        x[i] = pt.x();
        y[i] = pt.y();
    }
    
    for(t=dt;t<1;t+=dt){
        x1 = bezierCastel(x,n,t);
        y1 = bezierCastel(y,n,t);
        gltLine2d(x0,y0,x1,y1);
		x0 = x1;
        y0 = y1;
    }
    pt = points.at(n-1);
    gltLine2d(x0,y0,pt.x().pt.y());
    delete []x;
    delete []y;
}

B样条曲线

//b样条基函数
void cubicBSplineBase(int begin,const GPoint2dArray &points,double t,GPoint &pt){
    float fh1 = (-t*t*t+3*t*t-3*t+1)/6;
    float fh2 = (3*t*t*t-6*t*t+4)/6;
    float fh3 = (-3*t*t*t+3*t*t+3*t+1)/6;
    float fh4 = (t*t*t)/6;
    GPoint pt0 = points.at(begin);
    GPoint pt1 = points.at(begin+1);
    GPoint pt2 = points.at(begin+2);
    Gpoint pt3 = points.at(begin+3);
    pt.setX(fh1 * pt0.x() + fh2 * pt1.x() +fh3 * pt2.x() + fh4 * pt3.x());
    pt.setY(fh1 * pt0.y() + fh2 * pt1.y() +fh3 * pt2.y() + fh4 * pt3.y());
}

void gltBSpline2d(const GPoint2dArray &points){
    if(points.count()<4)
        return ;
    double x0,y0;
    double t,dt;
    GPoint pt;
    int n = points.count();
    dt = 0.05;
    for(int i=0;i<n-3;i++){
        cubicBSplineBase(i,points,0,pt);
        x0 = pt.x();
        y0 = pt.y();
        for(t=dt;t<1;t+=dt){
            cubicBsplineBase(i,points,t,pt);
            gltLine2d(x0,y0,pt.x(),pt.y());
            x0 = pt.x();
            y0 = pt.y();
        }
        cubicBSplineBase(i,points,t,pt);
        gltLine2d(x0,y0,pt.x(),pt.y());
    }
}

标签:计算机,曲线,图形学,算法,rc,c0,pt1,pt0
来源: https://www.cnblogs.com/Christal-pyy/p/14099418.html