【计算机图形学】裁剪算法(Cohen-Sutherland算法 & 中值分割算法 & Liang-Barsky算法)

这篇具有很好参考价值的文章主要介绍了【计算机图形学】裁剪算法(Cohen-Sutherland算法 & 中值分割算法 & Liang-Barsky算法)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一 实验目的

  1. 编写直线段、多边形裁剪算法
  2. 熟悉Cohen-Sutherland算法、中值分割算法和Liang-Barsky算法的裁剪

二 实验算法理论分析
Cohen-Sutherland算法:

试用liang-barsky算法裁剪如图所示线段,计算机图形学,计算机视觉,人工智能

 试用liang-barsky算法裁剪如图所示线段,计算机图形学,计算机视觉,人工智能

 试用liang-barsky算法裁剪如图所示线段,计算机图形学,计算机视觉,人工智能

中值分割算法:

与CS算法一样,首先对直线段端点进行编码,并把线段与窗口的关系一样分为3种情况:全在、完全不在、线段和窗口有交点,并对前两种情况进行一样的处理。对于第3种情况,则用中点分割的方法简单地把线段等分为两段,对两段重复上述测试处理,直至每条线段完全在窗口内和完全在窗口外。

可行性分析:计算机屏幕是有限的,比如1024×768个像素,x方向是2的10次方。所以这样一直二分下去的话,最多分10次。分到第十次的时候,就到像素级了,就不用再分了。所以最多循环10次。

试用liang-barsky算法裁剪如图所示线段,计算机图形学,计算机视觉,人工智能

 Liang-Barsky算法:

试用liang-barsky算法裁剪如图所示线段,计算机图形学,计算机视觉,人工智能

试用liang-barsky算法裁剪如图所示线段,计算机图形学,计算机视觉,人工智能

三 实验内容

1:用Cohen-Sutherland算法实现直线段裁剪

实验结果如下图所示:
第一步:依次输入A点的横坐标和纵坐标、B点的横坐标和纵坐标(此处以【0,0】为A点坐标,【400,400】为B点坐标为例)。

 试用liang-barsky算法裁剪如图所示线段,计算机图形学,计算机视觉,人工智能

 第二步:用户勾选需要裁剪的红色框,并将存在于矩形框内的AB线段用白色部分展示出来(此处以用户第一次点击为矩形框的左下位置,第二次点击为矩形框的右上位置为例)。


裁剪前:

 试用liang-barsky算法裁剪如图所示线段,计算机图形学,计算机视觉,人工智能

裁剪后:

 试用liang-barsky算法裁剪如图所示线段,计算机图形学,计算机视觉,人工智能

2:用中值分割算法实现直线段裁剪

实验结果如下图所示:
第一步:依次输入A点的横坐标和纵坐标、B点的横坐标和纵坐标(此处以【0,0】为A点坐标,【400,400】为B点坐标为例)。

 试用liang-barsky算法裁剪如图所示线段,计算机图形学,计算机视觉,人工智能

 第二步:用户勾选需要裁剪的红色框,并将存在于矩形框内的AB线段用白色部分展示出来(此处以用户第一次点击为矩形框的左下位置,第二次点击为矩形框的右上位置为例)。

裁剪前:

试用liang-barsky算法裁剪如图所示线段,计算机图形学,计算机视觉,人工智能

裁剪后:

试用liang-barsky算法裁剪如图所示线段,计算机图形学,计算机视觉,人工智能

3:用Liang-Barsky算法实现直线段裁剪

实验结果如下图所示:
第一步:依次输入A点的横坐标和纵坐标、B点的横坐标和纵坐标(此处以【0,0】为A点坐标,【400,250】为B点坐标为例)。

 试用liang-barsky算法裁剪如图所示线段,计算机图形学,计算机视觉,人工智能

 第二步:用户勾选需要裁剪的红色框,并将存在于矩形框内的AB线段用白色部分展示出来(此处以用户第一次点击为矩形框的左下位置,第二次点击为矩形框的右上位置为例)。

裁剪前:

试用liang-barsky算法裁剪如图所示线段,计算机图形学,计算机视觉,人工智能

 裁剪后:

试用liang-barsky算法裁剪如图所示线段,计算机图形学,计算机视觉,人工智能

四 程序说明

Project中程序的调用:

将当前cpp文件的属性——常规——从生成中排除中选择否,其他文件选择是,即可运行当前的cpp文件

1

//

// 程序名称:CS裁剪

// 功    能:用Cohen-Sutherland算法实现直线段裁剪

// 编译环境:VS2019,EasyX_20220116

// 最后修改:2022-3-17

#include <graphics.h>

#include <conio.h>

#include <iostream>

using namespace std;

#define LEFT 1

#define RIGHT 2

#define BOTTOM 4

#define TOP 8

int XL, XR, YB, YT;

int encode(float x, float y, int* code) {

    int c = 0;

    if (x < XL) {

         c = c | LEFT;

    }

    else if (x > XR) {

         c = c | RIGHT;

    }

    if (y < YB) {

         c = c | BOTTOM;;

    }

    else if (y > YT) {

         c = c | TOP;

    }

    *code = c;

    return 0;

}文章来源地址https://www.toymoban.com/news/detail-769996.html

int CSLineClip(float x1, float y1, float x2, float y2) {

    int code1, code2, code;

    float x, y;

    encode(x1, y1, &code1);

    encode(x2, y2, &code2);

    while (code1 != 0 || code2 != 0) {

         if ((code1 & code2) != 0) {

             return 0;

         }

         code = code1;

         if (code1 == 0) {

             code = code2;

         }

         if ((LEFT & code) != 0) {

             x = XL;

             y = y1 + (y2 - y1) * (XL - x1) / (x2 - x1);

         }

         else if ((RIGHT & code) != 0) {

             x = XR;

             y = y1 + (y2 - y1) * (XR - x1) / (x2 - x1);

         }

         else if ((BOTTOM & code) != 0) {

             y = YB;

             x = x1 + (x2 - x1) * (YB - y1) / (y2 - y1);

         }

         else if ((TOP & code) != 0) {

             y = YT;

             x = x1 + (x2 - x1) * (YT - y1) / (y2 - y1);

         }

         //

         if (code == code1) {

             x1 = x;

             y1 = y;

             encode(x, y, &code1);

         }

         else {

             x2 = x;

             y2 = y;

             encode(x, y, &code2);

         }

    }

    setlinecolor(WHITE);

    line(x1, y1, x2, y2);

    return 0;

}

int main() {

    //用户定义a、b坐标

    float xa, ya, xb, yb;

    cout << "please input the coordinate of A point:" << endl;

    cin >> xa >> ya;

    cout << "please input the coordinate of B point:" << endl;

    cin >> xb >> yb;

    int x0, y0, x1, y1;

    //0->left bottom; 1->right top;

    //图形界面

    initgraph(640, 480);

    ExMessage m;

    //勾勒AB线段:绿色

    setlinecolor(GREEN);

    line(xa, ya, xb, yb);

    while (true) {

         m = getmessage(EX_MOUSE | EX_KEY);

         switch (m.message) {

         case WM_LBUTTONDOWN:

             x0 = m.x;

             y0 = m.y;

             setlinecolor(WHITE);

             setfillcolor(GREEN);

             fillrectangle(m.x - 3, m.y - 3, m.x + 3, m.y + 3);

         case WM_RBUTTONDOWN:

             x1 = m.x;

             y1 = m.y;

             setlinecolor(WHITE);

             setfillcolor(GREEN);

             fillrectangle(m.x - 3, m.y - 3, m.x + 3, m.y + 3);

             //判断用户是左上~右下 / 左下~右上 / 右上~左下 / 右下~左上

             if ((x0 < x1) && (y0 > y1)) {

                  XL = x0;

                  XR = x1;

                  YB = y1;

                  YT = y0;

             }

             else if ((x0 < x1) && (y0 < y1)) {

                  XL = x0;

                  XR = x1;

                  YB = y0;

                  YT = y1;

             }

             else if ((x0 > x1) && (y0 > y1)) {

                  XL = x1;

                  XR = x0;

                  YB = y1;

                  YT = y0;

             }

             else if ((x0 > x1) && (y0 < y1)) {

                  XL = x1;

                  XR = x0;

                  YB = y0;

                  YT = y1;

             }

             //勾勒裁剪框

             setlinecolor(RED);

             line(XL, YT, XR, YT);

             line(XL, YB, XR, YB);

             line(XL, YT, XL, YB);

             line(XR, YT, XR, YB);

             //裁剪部分为白色

             CSLineClip(xa, ya, xb, yb);

         case WM_KEYDOWN:

             if (m.vkcode == VK_ESCAPE)

                  return 0;    // 按 ESC 键退出程序

         }

    }

    closegraph();

    return 0;

}

2

//

// 程序名称:中值裁剪

// 功    能:用中值分割算法实现直线段裁剪

// 编译环境:VS2019,EasyX_20220116

// 最后修改:2022-3-26

// Special Thanks To Gong WH

#include <graphics.h>

#include <conio.h>

#include <iostream>

using namespace std;

#define LEFT 1

#define RIGHT 2

#define BOTTOM 4

#define TOP 8

int XL, XR, YB, YT;

//区域编码

int encode(float x, float y, int* code) {

    int c = 0;

    if (x < XL) {

         c = c | LEFT;

    }

    else if (x > XR) {

         c = c | RIGHT;

    }

    if (y < YB) {

         c = c | BOTTOM;;

    }

    else if (y > YT) {

         c = c | TOP;

    }

    *code = c;

    return 0;

}

void MidClip(float x1, float y1, float x2, float y2) {

    int code1, code2;

    encode(x1, y1, &code1);

    encode(x2, y2, &code2);

   

    //无法继续二分

    if (abs(x1 - x2) + abs(y1 - y2) <= 2) {

         return;

    }

   

    //线段完全不可见

    if ((code1 & code2) != 0) {

         return;

    }

    //线段完全可见

    if ((code1 | code2) == 0) {

         setlinecolor(WHITE);

         line(x1, y1, x2, y2);

         return;

    }

    //线段部分可见=>递归吧。。

    int midx = (x1 + x2) / 2, midy = (y1 + y2) / 2;

   

    MidClip(midx, midy, x2, y2);

    MidClip(x1, y1, midx, midy);

    /*

    //这个优化,不大行

    int midcode;

    encode(midx, midy, &midcode);

    //中点可见,继续二分

    if (midcode == 0) {

         MidClip(midx, midy, x2, y2);

         MidClip(x1, y1, midx, midy);

    }

    //中点不可见,判断中点和哪个点在同一区域

    else {

         int cnt1[4] = { 0 }, cnt2[4] = { 0 }, cntmid[4] = { 0 };

         //handle midcode

         do {

             if (midcode >= 8) {

                  cntmid[0] = 1;

                  midcode -= 8;

             }

             else if (midcode >= 4) {

                  cntmid[1] = 1;

                  midcode -= 4;

             }

             else if (midcode >= 2) {

                  cntmid[2] = 1;

                  midcode -= 2;

             }

             else if (midcode >= 1) {

                  cntmid[3] = 1;

                  midcode -= 1;

             }

             else {

                  continue;

             }

         } while (midcode != 0);

         //handle code1

         do {

             if (code1 >= 8) {

                  cnt1[0] = 1;

                  code1 -= 8;

             }

             else if (code1 >= 4) {

                  cnt1[1] = 1;

                  code1 -= 4;

             }

             else if (code1 >= 2) {

                  cnt1[2] = 1;

                  code1 -= 2;

             }

             else if (code1 >= 1) {

                  cnt1[3] = 1;

                  code1 -= 1;

             }

             else {

                  continue;

             }

         } while (code1 != 0);

         //handle code2

         do {

             if (code2 >= 8) {

                  cnt2[0] = 1;

                  code2 -= 8;

             }

             else if (code2 >= 4) {

                  cnt2[1] = 1;

                  code2 -= 4;

             }

             else if (code2 >= 2) {

                  cnt2[2] = 1;

                  code2 -= 2;

             }

             else if (code2 >= 1) {

                  cnt2[3] = 1;

                  code2 -= 1;

             }

             else {

                  continue;

             }

         } while (code2 != 0);

         int count1 = 0, count2 = 0;

         for (int i = 0; i < 4; i++) {

             if (cnt1[i] == cntmid[i]) {

                  count1++;

             }

             if (cnt2[i] == cntmid[i]) {

                  count2++;

             }

         }

         if (count1 > count2) {

             //point 1 area is closer to midpoint area

             MidClip(x1, y1, midx, midy);

         }

         else {

             //point 2 area is closer to midpoint area

             MidClip(midx, midy, x2, y2);

         }

    }

    */

}

int main() {

    //用户定义a、b坐标

    int xa, ya, xb, yb;

    cout << "please input the coordinate of A point:" << endl;

    cin >> xa >> ya;

    cout << "please input the coordinate of B point:" << endl;

    cin >> xb >> yb;

    int x0, y0, x1, y1;

    //0->left bottom; 1->right top;

    //图形界面

    initgraph(640, 480);

    ExMessage m;

    //勾勒AB线段:绿色

    setlinecolor(GREEN);

    line(xa, ya, xb, yb);

    while (true) {

         m = getmessage(EX_MOUSE | EX_KEY);

         switch (m.message) {

         case WM_LBUTTONDOWN:

             x0 = m.x;

             y0 = m.y;

             setlinecolor(WHITE);

             setfillcolor(GREEN);

             fillrectangle(m.x - 3, m.y - 3, m.x + 3, m.y + 3);

         case WM_RBUTTONDOWN:

             x1 = m.x;

             y1 = m.y;

             setlinecolor(WHITE);

             setfillcolor(GREEN);

             fillrectangle(m.x - 3, m.y - 3, m.x + 3, m.y + 3);

             //判断用户是左上~右下 / 左下~右上 / 右上~左下 / 右下~左上

             if ((x0 < x1) && (y0 > y1)) {

                  XL = x0;

                  XR = x1;

                  YB = y1;

                  YT = y0;

             }

             else if ((x0 < x1) && (y0 < y1)) {

                  XL = x0;

                  XR = x1;

                  YB = y0;

                  YT = y1;

             }

             else if ((x0 > x1) && (y0 > y1)) {

                  XL = x1;

                  XR = x0;

                  YB = y1;

                  YT = y0;

             }

             else if ((x0 > x1) && (y0 < y1)) {

                  XL = x1;

                  XR = x0;

                  YB = y0;

                  YT = y1;

             }

             //勾勒裁剪框

             setlinecolor(RED);

             line(XL, YT, XR, YT);

             line(XL, YB, XR, YB);

             line(XL, YT, XL, YB);

             line(XR, YT, XR, YB);

             //裁剪部分为白色

             MidClip(xa, ya, xb, yb);

         case WM_KEYDOWN:

             if (m.vkcode == VK_ESCAPE)

                  return 0;    // 按 ESC 键退出程序

         }

    }

    closegraph();

    return 0;

}

3

//

// 程序名称:LB裁剪

// 功    能:用Liang-Barsky算法实现直线段裁剪

// 编译环境:VS2019,EasyX_20220116

// 最后修改:2022-3-17

#include <graphics.h>

#include <conio.h>

#include <iostream>

using namespace std;

float XL, XR, YT, YB;

void Displayline(float x1, float y1, float x2, float y2) {

    setlinecolor(WHITE);

    line(x1, y1, x2, y2);

}

void LiangBarsky(float x1, float y1, float x2, float y2, float XL, float XR, float YT, float YB) {

    float ansx1, ansx2, ansy1, ansy2;

    //平行于y轴

    if (x1 - x2 == 0) {

        if (x1<XL || x1>XR) {

            return;

        }

        else {

            int ymin = max(YB, min(y1, y2));

            int ymax = min(YT, max(y1, y2));

            if (ymin <= ymax) {

                ansx1 = ansx2 = x1;

                ansy1 = ymin;

                ansy2 = ymax;

            }

            else {

                return;

            }

        }

    }

    //平行于x轴

    else if (y1 - y2 == 0) {

        if (y1<YB || y1>YT) {

            return;

        }

        else {

            int xmin = max(XL, min(x1, x2));

            int xmax = min(XR, max(x1, x2));

            if (xmin <= xmax) {

                ansy1 = ansy2 = y1;

                ansx1 = xmin;

                ansx2 = xmax;

            }

            else {

                return;

            }

        }

    }

    //不平行于坐标轴

    else {

        float p1, p2, p3, p4;

        float q1, q2, q3, q4;

        p1 = -(x2 - x1);

        p2 = -p1;

        p3 = -(y2 - y1);

        p4 = -p3;

        q1 = x1 - XL;

        q2 = XR - x1;

        q3 = y1 - YB;

        q4 = YT - y1;

        float u1, u2, u3, u4;

        u1 = q1 / p1;

        u2 = q2 / p2;

        u3 = q3 / p3;

        u4 = q4 / p4;

        float umin, umax;

        if (p1 < 0) {

            if (p3 < 0) {

                umin = max(0, max(u1, u3));

                umax = min(1, min(u2, u4));

            }

            else {

                umin = max(0, max(u1, u4));

                umax = min(1, min(u2, u3));

            }

        }

        else {

            if (p3 < 0) {

                umin = max(0, max(u2, u3));

                umax = min(1, min(u1, u4));

            }

            else {

                umin = max(0, max(u2, u4));

                umax = min(1, min(u1, u3));

            }

        }

        if (umin <= umax) {

            ansx1 = x1 + umin * (x2 - x1);

            ansx2 = x1 + umax * (x2 - x1);

            ansy1 = y1 + umin * (y2 - y1);

            ansy2 = y1 + umax * (y2 - y1);

        }

        else {

            return;

        }

    }

    Displayline(ansx1, ansy1, ansx2, ansy2);

    return;

}

int main() {

    //用户定义a、b坐标

    float xa, ya, xb, yb;

    cout << "please input the coordinate of A point:" << endl;

    cin >> xa >> ya;

    cout << "please input the coordinate of B point:" << endl;

    cin >> xb >> yb;

    float x0, y0, x1, y1;

    //0->left bottom; 1->right top;

    initgraph(640,480);

    ExMessage m;

    //勾勒AB线段:绿色

    setlinecolor(GREEN);

    line(xa, ya, xb, yb);

    while (true) {

        m = getmessage(EX_MOUSE | EX_KEY);

        switch (m.message) {

        case WM_LBUTTONDOWN:

            x0 = m.x;

            y0 = m.y;

            setlinecolor(WHITE);

            setfillcolor(GREEN);

            fillrectangle(m.x - 3, m.y - 3, m.x + 3, m.y + 3);

        case WM_RBUTTONDOWN:

            x1 = m.x;

            y1 = m.y;

            setlinecolor(WHITE);

            setfillcolor(GREEN);

            fillrectangle(m.x - 3, m.y - 3, m.x + 3, m.y + 3);

            //判断用户是左上~右下 / 左下~右上 / 右上~左下 / 右下~左上

            if ((x0 < x1) && (y0 > y1)) {

                XL = x0;

                XR = x1;

                YB = y1;

                YT = y0;

            }

            else if ((x0 < x1) && (y0 < y1)) {

                XL = x0;

                XR = x1;

                YB = y0;

                YT = y1;

            }

            else if ((x0 > x1) && (y0 > y1)) {

                XL = x1;

                XR = x0;

                YB = y1;

                YT = y0;

            }

            else if ((x0 > x1) && (y0 < y1)) {

                XL = x1;

                XR = x0;

                YB = y0;

                YT = y1;

            }

            //勾勒裁剪框

            setlinecolor(RED);

            line(XL, YT, XR, YT);

            line(XL, YB, XR, YB);

            line(XL, YT, XL, YB);

            line(XR, YT, XR, YB);

            //裁剪部分为白色

            LiangBarsky(xa, ya, xb, yb, XL, XR, YT, YB);

        case WM_KEYDOWN:

            if (m.vkcode == VK_ESCAPE)

                return 0;  // 按 ESC 键退出程序

        }

    }

    closegraph();  //关闭绘图窗口

    return 0;

}

到了这里,关于【计算机图形学】裁剪算法(Cohen-Sutherland算法 & 中值分割算法 & Liang-Barsky算法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【计算机图形学|直线生成算法】Bresenham画法详解

    Bresenham画法是一种用于计算计算机图形中线条的算法,其原理是沿着所需绘制的线段中的像素点进行递增或递减,来进行准确的点阵绘制。 实现该算法的关键在于确定像素在基准线上的位置,以及在每次迭代时进行相应的调整。该算法比传统的直线算法更快且更准确,在低速

    2024年02月07日
    浏览(52)
  • 【计算机图形学|直线生成算法】中点画线法

    中点画线法(Midpoint Line Algorithm)是一种画线(Line Drawing)算法,用来在计算机屏幕上绘制线条。 它的基本思想是从线段的起点和终点出发,按照一定的规则向终点逐步逼近,并在途中以控制变量的方式得出每个像素点的坐标,从而绘制出所需的线条。 具体实现中,中点画线

    2024年02月04日
    浏览(51)
  • 计算机图形学03:改进的中点BH算法

    作者 :非妃是公主 专栏 :《计算机图形学》 博客地址 :https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 专栏名称 专栏地址 软件工程 专栏——软件工程 计算机图形学 专栏——计算机图形学 操作系统 专栏——操作系统 软件测试 专

    2024年01月17日
    浏览(46)
  • 【计算机图形学】扫面转换算法(DDA算法 & 中点画线算法 & Bresenham画线算法)

    模块1 扫描转换算法 一 实验目的 编写直线、弧线的光栅扫描转换算法,并对线宽与线形的算法加以探讨 用DDA算法、中点画线算法、Bresenham画线算法绘制直线(如果键盘输入数据,给出数据值;如果绘制图案,图案中应包含各种斜率;如果鼠标确定任意两点,给出操作说明)

    2024年04月12日
    浏览(33)
  • 计算机图形学:三次Bezier曲线的绘制(算法原理及代码实现)

    一、实现方案        贝塞尔曲线原理:贝塞尔曲线是计算机图形图像造型的基本工具,是图形造型运用得最多的基本线条之一。它通过控制曲线上的四个点(起始点、终止点以及两个相互分离的中间点)来创造、编辑图形。其中起重要作用的是位于曲线中央的控制线。这条

    2024年02月11日
    浏览(50)
  • 【计算机图形学 】扫描线多边形填充算法 | OpenGL+鼠标交互

    传送门 实现多边形扫描线填充算法,并和鼠标进行交互。 具体原理略过,会贴上完整代码,可直接运行。 环境: vs2019,OpenGL的库(可以搜索如何用vs使用OpenGL的库,可以使用vs自带的插件或者其他方法,很方便) 要点: 1.NET和AET的创建,改动 2.改变鼠标点击和鼠标拖拽的响应

    2023年04月08日
    浏览(72)
  • 计算机图形学05:中点BH算法对任意斜率的直线扫描转换方法

    作者 :非妃是公主 专栏 :《计算机图形学》 博客地址 :https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 专栏名称 专栏地址 软件工程 专栏——软件工程 计算机图形学 专栏——计算机图形学 操作系统 专栏——操作系统 软件测试 专

    2024年02月02日
    浏览(54)
  • 【计算机图形学算法工具技巧】用Blender查看三维点云ply文件的点的序号和坐标

    因为用最近在学拉普拉斯曲面编辑的算法,需要查看三维点云ply文件的点的序号和坐标,然后固定或移动这些点的坐标。 这里介绍使用Blender 3.2软件查看三维点云ply文件的点的序号和坐标。 导入ply文件 隐藏不必要的物体(如cube),并将物体模式变成编辑模型!! 选择 gemo

    2024年02月13日
    浏览(71)
  • 计算机图形学实验——利用MFC对话框实现多边形绘制与填充(扫描线填充算法)附源码

    内容概括: 利用基于对话框的MFC项目 实现鼠标点击绘制多边形 实现扫描线算法填充多边形 源码见Yushan-Ji/ComputerGraphics: ECNU2023秋 计算机图形学课程实验代码 (github.com) 通过鼠标交互输入多边形 对各种多边形进行填充,包括边界自交的情况 利用 OnLButtonDown 和 OnRButtonDown 函数,

    2024年02月04日
    浏览(68)
  • 初识计算机图形学

    笔记来源:【老奇】阴差阳错 撼动世界的游戏引擎 详见本人博客: 1.Transformation 2.梳理从MVP变换到光栅化的过程 MVP变换将空间中3D物体投影到2D屏幕 详见本人博客: 1.Rasterization(光栅化) 2.梳理从MVP变换到光栅化的过程 场景是一个个由三角面组成的模型 将模型投射到像素就

    2024年01月21日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包