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

news2024/11/27 3:41:37

一 实验目的

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

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

 

 

 

中值分割算法:

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

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

 Liang-Barsky算法:

 

 

三 实验内容

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

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

 

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


裁剪前:

 

裁剪后:

 

 

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

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

 

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

裁剪前:

裁剪后:

 

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

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

 

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

裁剪前:

 裁剪后:

 

四 程序说明

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;

}

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;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/429062.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java创建线程的方法

线程是程序的一种操作单元&#xff0c;在程序中&#xff0c;一个线程和另一个线程是同时存在的。它是一个程序的一部分&#xff0c;但是他又是独立的&#xff0c;它不会影响到另一个线程的执行。但是多个线程同时运行时&#xff0c;会对系统资源造成一定的消耗。 线程之间的竞争…

[Linux] 基础IO

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【LINUX】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449; LeetCode刷题网站 文…

SQL Server用户定义的函数(UDF)使用详解

SQL Server用户定义的函数一、背景知识1.1、用户定义函数的优点1.2、函数类型1.3、指引1.4、函数中的有效语句1.5、架构绑定函数1.6、指定参数二、创建用户定义函数2.1、限制和权限2.2、标量函数示例&#xff08;标量 UDF&#xff09;2.3、表值函数示例2.3.1、内联表值函数 &am…

leetcode26.删除数组中的重复项

1.原题目链接&#xff1a;力扣 2.题目&#xff1a; 3. 思路&#xff1a;使用两个指针:src与dst,刚开始均指向起始位置&#xff0c;如果src的值与dst值相同&#xff0c;src,如果src的值与dst的值不相同&#xff0c;dst,src的值赋值给dst,src,即两个指针比较&#xff0c;值不相同…

图像去模糊:MIMO-UNet 模型详解

本内容主要介绍实现图像去模糊的 MIMO-UNet 模型。 论文&#xff1a;Rethinking Coarse-to-Fine Approach in Single Image Deblurring 代码&#xff08;官方&#xff09;&#xff1a;https://github.com/chosj95/MIMO-UNet 1. 背景 由于深度学习的成功&#xff0c;基于卷…

docker搭建linux网络代理

docker搭建linux网络代理 1.准备 config.yaml 配置文件&#xff08;含订阅节点、规则&#xff0c;一般机场或者本地配置中含有&#xff09; 在root下创建文件夹命名为clash。上传配置好的config.yaml至clash文件夹。 2.配置 端口: port: 7890 ; socks-port: 7891 运行局域网…

Python网络爬虫之HTTP原理

写爬虫之前&#xff0c;我们还需要了解一些基础知识&#xff0c;如HTTP原理、网页的基础知识、爬虫的基本原理、Cookies的基本原理等。本文中&#xff0c;我们就对这些基础知识做一个简单的总结。 &#x1f31f;HTTP 基本原理 在本文中&#xff0c;我们会详细了解 HTTP的基本原…

医学图像分割之MedNeXt

论文&#xff1a;MedNeXt: Transformer-driven Scaling of ConvNets for Medical Image Segmentation ConvNeXt网络是一种借鉴Transformer的思想进行了改进实现的全卷积网络&#xff0c;其通过全卷积网络和逆向残差瓶颈单元的设计&#xff0c;可以实现比较大的空间感受野。本文…

【MySQL】聚合查询

目录 1、前言 2、插入查询结果 3、聚合查询 3.1 聚合函数 3.1.1 count 3.1.2 sum 3.1.3 avg 3.1.4 max 和 min 4、GROUP BY 子句 5、HAVING 关键字 1、前言 前面的内容已经把基础的增删改查介绍的差不多了&#xff0c;也介绍了表的相关约束&#xff0c; 从本期开始…

windows将exe或者bat封装成系统服务进行管理

NSSM介绍 NSSM(the Non-Sucking Service Manager)是Windows环境下一款免安装的服务管理软件&#xff0c;它可以将应用封装成服务&#xff0c;使之像windows服务可以设置自动启动等。并且可以监控程序运行状态&#xff0c;程序异常中断后自动启动&#xff0c;实现守护进程的功能…

和利时:自主可控 安全高效

4月13—15日&#xff0c;由易派客电子商务有限公司、中国石油和石油化工设备工业协会、北京长城电子商务有限公司共同主办的2023第二届易派客工业品展览会在苏州国际博览中心成功召开。本次展会以“绿色智造融通赋能”为主题&#xff0c;杭州和利时自动化有限公司&#xff08;简…

Cesium:Particle Systems粒子系统

官网文档,点击此处查看。 粒子系统简述 粒子系统是一种用于模拟复杂物理效果的图形学技术,它是一系列小图片的集合,当这些小图片被放在一起查看时,会形成一种更为模糊的对象,例如:火苗、烟、天气或者烟花。 粒子系统效果在电影和游中是十分普遍的。例如:飞机失…

Spark 之 解析json的复杂和嵌套数据结构

本文主要使用以下几种方法&#xff1a; 1&#xff0c;get_json_object()&#xff1a;从一个json 字符串中根据指定的json 路径抽取一个json 对象 2&#xff0c;from_json()&#xff1a;从一个json 字符串中按照指定的schema格式抽取出来作为DataFrame的列 3&#xff0c;to_j…

【洋桃一号板】STM32F103CBT6标准库函数驱动TM1640点亮数码管

一、今天介绍如何使用STM32F103CBT6驱动TM1640点亮数码管&#xff0c;硬件用的洋桃开发板&#xff0c;点亮后效果如下&#xff0c;六个数码管依次显示0.1.2.3.4.5.6.7 硬件原理图如下&#xff0c;只用到了单片机的两个IO口即可实现上图的效果&#xff0c;该开发板上用的是PA11…

chapter-3 -数据库数据模型

以下内容来源于MOOC学习—原课程请见&#xff1a;数据库原理与应用 考研复习 概述 关系及关系模式 笛卡尔积 定义在一组域上的有序对的集合&#xff0c; 域是一组具有相同类型的集合&#xff0c;比如自然数&#xff0c;长度小于n的字符串结合等【比如int age】 从n个域的每…

Linux工具make与makefile

Linux项目自动化构建工具-make/Makefile 目录Linux项目自动化构建工具-make/Makefile引言1、make && makefile2、make执行步骤2.1 依赖关系2.2 依赖方法3、项目清理4、伪目标 .PHONY5、文件的三个时间6、make的工作原理7、Linux下的第一个小程序认识缓冲区进度条①函数…

T5模型简单介绍

目录 一、概要 二、深入扩展 2.1 两个要素 2.2 预训练方法 一、概要 谷歌公司的研究人员提出的 T5&#xff08;Text-to-Text Transfer Transformer&#xff0c;有5个T开头的单词&#xff0c;所以叫做T5&#xff09;模型采用了一种与前述模型截然不同的策略&#xff1a;将不…

RUAS论文阅读笔记

这是CVPR2021的一篇暗光增强的论文 Retinex增强和去噪部分 第一部分的核心公式是一种retinex公式&#xff08;用于暗图增强的retinex公式有几种类型&#xff0c;虽然本质一样但是对于各个分量的定义不一样&#xff09;&#xff1a;yx⊗tyx\otimes tyx⊗t&#xff0c;其中x是正…

Trie|并查集|堆|

目录 初始化 插入 查询 合并集合 连通块中点的数量 堆排序 模拟堆 Trie树是用来快速存储和查找字符串集合的数据结构 #include<iostream> using namespace std; const int N 100010; int son[N][26];//本题为小写因为字母&#xff0c;每个节点最多有26个子节点…

JUC编程之——synchronized的底层实现与分析

1 synchronized关键字 synchronized 是 Java 中的关键字&#xff0c;是一种同步锁(也是一种悲观锁)。它修饰的对象有以下几种&#xff1a; 作用于实例方法&#xff0c;当前实例加锁&#xff0c;进入同步代码前要获得当前实例的锁——对象锁&#xff1b;作用于代码块&#xff…