当前位置: 首页 > news >正文

GAMES101-计算机图形学入门 LEC4: TRANSFORMATION-3D

本节课程视频地址:https://www.bilibili.com/video/BV1X7411F744/?p=4

补充上一节课的一个内容,旋转矩阵的逆矩阵是它的转置,也就是说有R−θ=Rθ−1=RθTR_{-\theta} = R_\theta^{-1}=R_\theta^TRθ=Rθ1=RθT

上节课讲了,二维变换中的绕原点的旋转、缩放、切变,以及齐次坐标,还有通过简单变换组合成复杂变换。

这节课先讲三维变换,然后讲困难且重要的观测变换(Viewing Transformation)

文章目录

  • 三维变换(3D Transformation)
    • 缩放
    • 平移
    • 旋转
    • Rodrigues 旋转公式
  • 观测变换 (Viewing transformation)
    • 视图变换 (View transformation)
    • 投影变换(Perspective Projection)
      • 正交投影
      • 透视投影

三维变换(3D Transformation)

三维的齐次坐标:

  • 点:(x,y,z,1)T(x,y,z,1)^T(x,y,z,1)T
  • 向量:(x,y,z,0)T(x,y,z,0)^T(x,y,z,0)T

注:(x,y,z,w)其中w!=0 表示的是点(x/w,y/w,z/w)

齐次坐标使用4维矩阵来表示仿射变换:
[x′y′z′1]=[abctxdeftyghitz0001]⋅[xyz1]\begin{bmatrix} x'\\ y' \\ z' \\ 1 \end{bmatrix}= \begin{bmatrix} a&b&c&t_x\\ d&e&f&t_y\\ g&h&i&t_z \\ 0&0&0&1 \end{bmatrix} \cdot \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix} xyz1=adg0beh0cfi0txtytz1xyz1
注:仿射变换中是先线性变换(也就是绕原点所作的变换)再平移变换。

缩放

[x′y′z′1]=[sx0000sy0000sz00001]⋅[xyz1]\begin{bmatrix} x'\\ y' \\ z' \\ 1 \end{bmatrix}= \begin{bmatrix} s_x&0&0&0\\ 0&s_y&0&0\\ 0&0&s_z&0\\ 0&0&0&1 \end{bmatrix} \cdot \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix} xyz1=sx0000sy0000sz00001xyz1

平移

[x′y′z′1]=[100tx010ty001tz0001]⋅[xyz1]\begin{bmatrix} x'\\ y' \\ z' \\ 1 \end{bmatrix}= \begin{bmatrix} 1&0&0&t_x\\ 0&1&0&t_y\\ 0&0&1&t_z\\ 0&0&0&1 \end{bmatrix} \cdot \begin{bmatrix} x\\ y\\ z\\ 1 \end{bmatrix} xyz1=100001000010txtytz1xyz1

旋转

三维的旋转分为绕x轴旋转、绕y轴旋转和绕z轴旋转。

Rx(α)=[10000cosα−sinα00sinαcosα00001]R_x(\alpha) = \begin{bmatrix} 1&0&0&0\\ 0&cos\alpha&-sin\alpha&0\\ 0&sin\alpha&cos\alpha&0\\ 0&0&0&1 \end{bmatrix}\\ Rx(α)=10000cosαsinα00sinαcosα00001
Ry(α)=[cosα0sinα00100−sinα0cosα00001]R_y(\alpha) = \begin{bmatrix} cos\alpha&0&sin\alpha&0\\ 0&1&0&0\\ -sin\alpha&0&cos\alpha&0\\ 0&0&0&1 \end{bmatrix} Ry(α)=cosα0sinα00100sinα0cosα00001
Rz(α)=[cosα−sinα00−sinαcosα0000100001]R_z(\alpha) = \begin{bmatrix} cos\alpha&-sin\alpha&0&0\\ -sin\alpha&cos\alpha&0&0\\ 0&0&1&0\\ 0&0&0&1 \end{bmatrix} Rz(α)=cosαsinα00sinαcosα0000100001

注意旋转矩阵Ry(α)R_y(\alpha)Ry(α)sinαsin\alphasinα的正负号是和另外两个相反的。其实没有反,因为这是一个右手系的坐标轴,绕x轴逆时针旋转的方向是在y0z平面中y轴旋转到z轴的方向,绕z轴旋转的方向是在x0y平面中x轴旋转到y轴的方向,而绕y轴旋转的方向在z0x平面中是从z轴旋转到x轴的方向。以x0y平面的旋转为例:x′=xcosα−ysinαx' = xcos\alpha - ysin\alphax=xcosαysinα,即要得到x′x'x需要乘上y轴原始坐标的−sinα-sin\alphasinα。所以在z0x平面内,要得到z轴所在坐标:z′=zcosα−xsinαz' = zcos\alpha - xsin\alphaz=zcosαxsinα。清晰的记忆方法,以绕x轴旋转为例,绕x轴旋转在y0z平面内是从y轴到z轴的方向,y′=ycos⁡α−zsin⁡αy' = y\cos\alpha - z\sin\alphay=ycosαzsinα即转离y轴的方向就减,$z’ = z\cos\alpha + y\sin\alpha $ 即朝z轴转的方向就加。

Rodrigues 旋转公式

绕旋转轴 n⃗\vec{n}n 旋转角度 α\alphaα

形式一:
R(n⃗,α)=cos(α)I+(1−cos(α))n⃗⋅n⃗T+sin⁡α⋅[0−nznynz0−nx−nynx0]R(\vec{n},\alpha)=cos(\alpha) I + (1-cos(\alpha)) \vec{n}\cdot \vec{n}^T + \sin\alpha\cdot \begin{bmatrix} 0 & -n_z & n_y \\ n_z & 0 & -n_x \\ -n_y & n_x & 0 \\ \end{bmatrix} R(n,α)=cos(α)I+(1cos(α))nnT+sinα0nznynz0nxnynx0
形式二:
R(n⃗,α)=I+sin⁡α⋅[0−nznynz0−nx−nynx0]+(1−cos(α))⋅[0−nznynz0−nx−nynx0]2R(\vec{n},\alpha)= I + \sin\alpha\cdot \begin{bmatrix} 0 & -n_z & n_y \\ n_z & 0 & -n_x \\ -n_y & n_x & 0 \\ \end{bmatrix} + (1-cos(\alpha))\cdot{\begin{bmatrix} 0 & -n_z & n_y \\ n_z & 0 & -n_x \\ -n_y & n_x & 0 \\ \end{bmatrix}}^2 R(n,α)=I+sinα0nznynz0nxnynx0+(1cos(α))0nznynz0nxnynx02

证明:

https://www.cnblogs.com/wtyuan/p/12324495.html

观测变换 (Viewing transformation)

视图变换 (View transformation)

什么是视图变换

想象一下拍照:

  • 首先要找一个好的背景,把人的位置和人与背景的相对位置安排好(模型变换);
  • 然后要找一个好的角度(视图变换);
  • 最后按快门(投影变换)。

定义相机:

  1. 位置向量 Postion: e⃗\vec{e}e
  2. 朝向 Look-at direction: g⃗\vec{g}g
  3. 相机向上的方向 Up direction (垂直于朝向) : t⃗\vec{t}t

在这里插入图片描述

约定:相机永远放在原点,相机永远以+y为向上方向,相机永远朝-z方向看。 也就是进行视图变换时要将所有对象和相机一起做变换,直到相机在原点,朝向-z,以+y为正方向。
在这里插入图片描述

如何将相机从它原来的位置移到约定位置

  1. 平移 e⃗\vec{e}e到原点;
  2. 旋转 g⃗\vec{g}g 到 -z 方向;
  3. 旋转 t⃗\vec{t}t 到 +y 方向
  4. 旋转 g⃗×t⃗\vec{g} \times \vec{t}g×t 到 +x 方向

如何求出将相机旋转到约定位置的旋转矩阵?

先平移到原点:
Tview=[100−xe010−ye001−ze0001]T_{view} = \begin{bmatrix} 1 & 0 & 0 & -x_e \\ 0 & 1 & 0 & -y_e \\ 0 & 0 & 1 & -z_e \\ 0 & 0 & 0 & 1 \end{bmatrix} Tview=100001000010xeyeze1

再考虑它的逆旋转,找到三个特殊向量的旋转,即 x^\hat{x}x^g^×t^\hat{g} \times \hat{t}g^×t^, y^\hat{y}y^t^\hat {t}t^z^\hat{z}z^−g^-\hat{g}g^,就能找到这个逆旋转的旋转矩阵:

Rreview−1=[xg^×t^xt^x−g^0yg^×t^yt^y−g^0zg^×t^zt^z−g^00001]R_{review}^{-1} = \begin{bmatrix} x_{\hat{g}\times\hat{t}} & x_{\hat{t}} & x_{-\hat{g}} & 0\\ y_{\hat{g}\times\hat{t}} & y_{\hat{t}} & y_{-\hat{g}} & 0\\ z_{\hat{g}\times\hat{t}} & z_{\hat{t}} & z_{-\hat{g}} & 0\\ 0 & 0 & 0 & 1 \end{bmatrix} Rreview1=xg^×t^yg^×t^zg^×t^0xt^yt^zt^0xg^yg^zg^00001
旋转矩阵是正交矩阵,上面这个矩阵显然符合,旋转矩阵的逆矩阵就是它的转置:
Rreview=[xg^×t^yg^×t^zg^×t^0xt^yt^zt^0x−g^y−g^z−g^00001]R_{review} = \begin{bmatrix} x_{\hat{g}\times\hat{t}} & y_{\hat{g}\times\hat{t}} & z_{\hat{g}\times\hat{t}} & 0 \\ x_{\hat{t}} & y_{\hat{t}} & z_{\hat{t}} & 0 \\ x_{-\hat{g}} & y_{-\hat{g}} & z_{-\hat{g}} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} Rreview=xg^×t^xt^xg^0yg^×t^yt^yg^0zg^×t^zt^zg^00001

总结:将所有对象和相机一起做变换,直到相机在原点,朝向-z,以+y为正方向。

这就是视图变换。

投影变换(Perspective Projection)

正交投影(Orthographic projection)

透视投影(Perspective projection)

区别:正交投影没有近大远小而透视投影有。

在这里插入图片描述

正交投影

做法一:

假设已经进行了视图变换(即相机在原点,朝向-z,以+y为向上方向)

第一步,把所有点的z坐标变为0;

第二步,将得到的二维平面坐标做平移和缩放,让它们装在[−1,−1]2[-1,-1]^2[1,1]2 这个正方形里。(至于为什么要进行这一步操作,这是一个约定俗成的办法,可以方便之后的操作)

做法二:(正规做法)

实际的计算机图形学操作中,还有一个比简单地把z扔掉更方便的做法:

同样,假设已经进行了视图变换(即相机在原点,朝向-z,以+y为向上方向)

假设此时所有物体装在一个 [l,r]×[b,t]×[f,n][l, r]\times[b,t] \times [f, n][l,r]×[b,t]×[f,n] 的长方体内,将这个长方体映射到 [−1,1]3[-1, 1]^3[1,1]3 的正方体:

在这里插入图片描述
先平移,再缩放:
Mortho=[2r−l00002t−b00002n−f00001][100−r+l2010−t+b2001−n+f20001]M_{ortho} = \begin{bmatrix} \frac{2}{r-l} & 0 & 0 & 0 \\ 0 & \frac{2}{t-b} & 0 & 0 \\ 0& 0 & \frac{2}{n-f} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & -\frac{r+l}{2}\\ 0 & 1 & 0 & -\frac{t+b}{2}\\ 0 & 0 & 1 & -\frac{n+f}{2}\\ 0 & 0 & 0 & 1 \end{bmatrix} Mortho=rl20000tb20000nf2000011000010000102r+l2t+b2n+f1

透视投影

回顾齐次坐标的一个重要性质:

(x,y,z,1)(x,y,z,1)(x,y,z,1)表示一个点,

(kx,ky,kz,k!=0)(kx,ky,kz,k!=0)(kx,ky,kz,k!=0)也表示该点,

(xz,yz,z2,z!=0)(xz,yz,z^2,z!=0)(xz,yz,z2,z!=0)也表示该点。

做法:

将一个截头锥体,“挤压”到一个长方体:
在这里插入图片描述
如何“挤压”呢?
提前告诉你,这个“挤压”可以用一个矩阵表示,一般叫投影变换矩阵,那么这个矩阵怎么求呢?

观察,该“挤压”的特点:
x坐标和 y坐标很明显有相似关系
在这里插入图片描述
y′=nzy,x′=nzxy' = \frac{n}{z}y,\ \ \ x' = \frac{n}{z}xy=zny,   x=znx
z坐标怎么变目前还不知道,用齐次坐标表示:
[xyz1]→[nx/zny/zunknown1]==[nxnyunknownz]\begin{bmatrix} x\\y\\z\\1 \end{bmatrix}\rightarrow \begin{bmatrix} nx/z\\ny/z\\unknown\\1 \end{bmatrix} == \begin{bmatrix} nx\\ny\\unknown\\z \end{bmatrix} xyz1nx/zny/zunknown1==nxnyunknownz
这样已经可以得到这个变换矩阵的一大部分了:
Mpersp→ortho=[n0000n00????00n0]M_{persp\rightarrow ortho} = \begin{bmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ ? & ? & ? & ?\\ 0 & 0 & n & 0 \end{bmatrix} Mpersportho=n0?00n?000?n00?0

那么该矩阵的第三行怎么求?

利用两点:

  1. 近平面上的点不会发生改变
    [xyn1]→[xyn1]==[nxnyn2n]\begin{bmatrix} x\\y\\n\\1 \end{bmatrix} \rightarrow \begin{bmatrix} x\\y\\n\\1 \end{bmatrix} == \begin{bmatrix} nx\\ ny\\ n^2\\ n \end{bmatrix} xyn1xyn1==nxnyn2n
    因为n2n^2n2xxx无关,所以第三行的第一个和第二个元素是0,也就是说对于透视投影矩阵的第三行有:
    [00AB][xyn1]=n2\begin{bmatrix} 0&0&A&B \end{bmatrix} \begin{bmatrix} x\\y\\n\\1 \end{bmatrix}=n^2 [00AB]xyn1=n2

  2. 远平面上与z轴相交的点不会改变
    [00f1]→[00f1]==[00f2f]\begin{bmatrix} 0\\0\\f\\1 \end{bmatrix}\rightarrow \begin{bmatrix} 0\\0\\f\\1 \end{bmatrix}== \begin{bmatrix} 0\\0\\f^2\\f \end{bmatrix} 00f100f1==00f2f
    也就是:
    [00AB][00f2f]=f2\begin{bmatrix} 0 & 0 & A & B \end{bmatrix} \begin{bmatrix} 0\\0\\f^2\\f \end{bmatrix} = f^2 [00AB]00f2f=f2

可以建立方程组求解A和B了:
An+B=n2Af+B=f2An+B=n^2\\ Af+B=f^2 An+B=n2Af+B=f2
解得
A=n+f,B=−nfA = n+f,\ \ \ B= -nf A=n+f,   B=nf

得到该矩阵为:
Mpersp→ortho=[n0000n0000n+f−nf00n0]M_{persp\rightarrow ortho} = \begin{bmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ 0 & 0 & n+f & -nf\\ 0 & 0 & n & 0 \end{bmatrix} Mpersportho=n0000n0000n+fn00nf0

最后
Mpersp=MorthoMpersp→orthoM_{persp} = M_{ortho}M_{persp\rightarrow ortho} Mpersp=MorthoMpersportho

问题:对于截头锥体中间的点,它的z坐标怎么变?

[n0000n0000n+f−nf00n0][xyz1]=[nxnynz+fz−nfz]\begin{bmatrix} n & 0 & 0 & 0\\ 0 & n & 0 & 0\\ 0 & 0 & n+f & -nf\\ 0 & 0 & n & 0 \end{bmatrix} \begin{bmatrix} x\\y\\z\\1 \end{bmatrix}= \begin{bmatrix} nx\\ny\\nz+fz-nf\\z \end{bmatrix} n0000n0000n+fn00nf0xyz1=nxnynz+fznfz


f(z)=nz+fz−nfz−z=1z[−z2+(n+f)z−nf]f(z) = \frac{nz+fz-nf}{z}-z = \frac{1}{z}[-z^2+(n+f)z -nf] f(z)=znz+fznfz=z1[z2+(n+f)znf]
对于中括号中的二次函数,开口向下,且两个零点为z=f和z=n,所以中括号中的二次函数在f<n<z这个区间里大于0,又z<0,所以f(z)小于0,即z的坐标会变小(朝远平面方向变)。

相关文章:

GAMES101-计算机图形学入门 LEC4: TRANSFORMATION-3D

本节课程视频地址&#xff1a;https://www.bilibili.com/video/BV1X7411F744/?p4 补充上一节课的一个内容&#xff0c;旋转矩阵的逆矩阵是它的转置&#xff0c;也就是说有R−θRθ−1RθTR_{-\theta} R_\theta^{-1}R_\theta^TR−θ​Rθ−1​RθT​ 上节课讲了&#xff0c;…...

robot实战:截取字符串

一&#xff1a;变量标识符号(1) Scalar型变量: "$"作为标识符号&#xff0c;例如&#xff1a;${var}&#xff0c; 这个打印log时只能用logset赋值&#xff1a;a: ${var} Set Variable abcb:${var2} Set Variable If ${Var}abc efgh ace 如果var的值和abc相等&#xf…...

【面经】滴滴测开一面

滴滴测开一面 面试官自我介绍面试者自我介绍大概实习多久&#xff1f;你在在校经历比较丰富&#xff0c;说一下打ACM那些比赛中的一些经验&#xff0c;找一些具体的项目说一下在打ACM中团队里几个人&#xff1f; 你负责什么&#xff1f;在上段实习的过程中都做了哪些事情&…...

数据治理-主数据

二、某企业集团旗下有房地产、供应链、物流、酒店等多个业务子公司&#xff0c;为了统一管理&#xff0c;集团推进数字化转型&#xff0c;建立了统一的数据仓库&#xff0c;各子公司将数据集成到集团信息部负责管理的 数据平台。集团在实施数据治理过程中&#xff0c;发现各业务…...

软考-中级-软件设计师-成绩

低分飘过&#xff0c;备考经验主要就是刷题。...

学习笔记<二> MySQL学习(3):分库、分表

文章目录为什么分库分表一、垂直分片、水平分片二、常用的数据分片策略三、垂直分表、垂直分库、水平分库、水平分表四、垂直切分、水平切分优缺点五、数据分片规则六、分库分表带来的问题本文参考博主「小Y是我的」的文章&#xff0c;原文链接&#xff1a;https://blog.csdn.n…...

重生之我是赏金猎人-SRC漏洞挖掘(八)-记一次移花接木的GetShell

0x00&#xff1a;前言 https://github.com/J0o1ey/BountyHunterInChina 欢迎亲们点个star 作者&#xff1a;RGM78sec 某天测厂商业务时&#xff0c;发现其中有一个提供音乐播放业务的资产&#xff0c;正好里面有我想听的歌&#xff0c;于是就有了这篇文章 0x01&#xff1a;…...

离线数仓(五):数仓搭建

文章目录一、创建数据库二、ODS 层&#xff08;原始数据层&#xff09;三、DWD 层&#xff08;明细数据层&#xff09;3.1 get_json_object 函数使用3.2 启动日志表 DWD层创建四、DWS 层&#xff08;服务数据层&#xff09;五、DWT 层&#xff08;数据主题层&#xff09;六、AD…...

安装SQL Server2017 过程中报KB29119355失败的解决方案

SQLServer 2017脱机版下载地址&#xff1a;http://download.microsoft.com/download/6/4/A/64A05A0F-AB28-4583-BD7F-139D0495E473/SQLServer2017-x64-CHS-Dev.isoMicrosoft SQL Server Management Studio 18管理工具下载https://learn.microsoft.com/zh-cn/sql/ssms/download-…...

2023年浙江建筑特种工(施工升降机)真题题库及答案

百分百题库提供特种工&#xff08;施工升降机&#xff09;考试试题、特种工&#xff08;施工升降机&#xff09;考试预测题、特种工&#xff08;施工升降机&#xff09;考试真题、特种工&#xff08;施工升降机&#xff09;证考试题库等,提供在线做题刷题&#xff0c;在线模拟考…...

2023年进入互联网行业好找工作吗?

俗话说&#xff1a;选择大于努力。年后求职小高峰&#xff0c;大家在找工作的时候选择肯定也多了。说真&#xff0c;不是人人都有铁饭&#xff0c;普通家庭的孩子想要在2023年进入互联网行业去找工作可能吗&#xff1f;01有一点大家要清楚&#xff0c;2022年是进入过一个寒冬的…...

基于策略模式企业实战中策略命中设计

背景 在公司实际项目项目开发中&#xff0c;有一个策略命中的开发需求。根据用户请求参数的不同来动态返回不同的业务数据。比如说有城市、客户年龄、请求时间3个策略维度&#xff0c;不同的城市返回不同的地区的地标&#xff0c;根据时间地标的背景色要发生变化等等的需求。当…...

pod生命周期,pod控制器service

一&#xff1a;pod-demo.yml apiVersion: v1 # <string> kind: Pod # <string> metadata: # <Object>对象&#xff1a;键值对的集合&#xff0c;又称为映射&#xff08;mapping&#xff09;/ 哈希&#xff08;hashes&#xff09; / 字…...

SAP FICO 深入讲解会计凭证

SAP系统在数据处理&#xff0c;无论是业务处理&#xff0c;还是财务处理都会产生大量的凭证&#xff0c;无论是什么凭证&#xff0c;最终的反映形式就是 会计凭证。 1.凭证原则Code 每笔记账都一直以凭证形式存储&#xff0c;每一凭证都作为前后一致的单位保留在系统中&#xf…...

LeetCode 2341. 数组能形成多少数对

【LetMeFly】2341.数组能形成多少数对 力扣题目链接&#xff1a;https://leetcode.cn/problems/maximum-number-of-pairs-in-array/ 给你一个下标从 0 开始的整数数组 nums 。在一步操作中&#xff0c;你可以执行以下步骤&#xff1a; 从 nums 选出 两个 相等的 整数从 nums…...

PHPStorm常用快捷键

alt 1 左侧项目结构树隐藏或者显示&#xff0c;这两个组合键的使用可以切换“项目结构树”和当前打开文件之间的焦点。 alt 2 隐藏或者显示 Favorites Ctrl Shift F12 切换到最大编辑器窗口&#xff0c;隐藏其他所有的工具窗口。例如项目结构树、Favorites、Terminal等。…...

【基于腾讯云的远程机械臂小车】

【基于腾讯云的远程机械臂小车】1. 项目来源1.1 项目概述1.2 系统结构1.3 设计原理2. 硬件搭建2.1 CH32V307开发板2.2 Arduino mega25602.3 富斯I6遥控器2.4 机械臂小车2.5 ESP8266 MCU2.5.1 ESP8266 MCU介绍2.5.2 腾讯云固件烧录3. 软件设计3.1 两种控制方式3.1.1 富斯I6遥控机…...

兼职任务平台收集(一)分享给有需要的朋友们

互联网时代&#xff0c;给人们带来了很大的便利。信息交流、生活缴费、足不出户购物、便捷出行、线上医疗、线上教育等等很多。可以说&#xff0c;网络的时代会一直存在着。很多人也在互联网上赚到了第一桶金&#xff0c;这跟他们的努力和付出是息息相关的。所谓一份耕耘&#…...

MarkDown中公式的编辑

MarkDown中公式的编辑生成目录积分插入编号常见希腊字母大小写分式括号求和积分连乘根式三角函数运算符集合运算箭头逻辑运算符约等于向量绝对值申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计1077字&…...

解决jupyter以及windows系统中pycharm编译器画图的中文乱码问题大全

一、jupyter环境下中文乱码问题解决 我们在jupyter的notebook中使用matplotlib画图的时候&#xff0c;经常性的会遇见一些中文乱码显示□的情况,如下所示: 在此&#xff0c;网上给出的方法大多是以下的解决方法&#xff1a; import matplotlib.pyplot as pltplt.rcParams[fo…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...