【计算几何】判断一条线段和一段圆弧是否相交 C++代码实现

news2024/11/26 20:29:38

文章目录

  • 一、前言
  • 二、线段与圆弧的代码表示
    • 2.1 线段代码表示
    • 2.2 圆弧代码表示
  • 三、实现思路及数学推导
    • 3.1 第一步(粗略判断)
    • 3.2 第二步
    • 3.3 第三步
  • 四、完整代码
  • 五、效果展示


一、前言

最近做项目,需要判断一条线段是否和一段圆弧相交,网上也没找到很好的解答(最主要是没有直接可以搬来用的代码,或者思路写得太过高深,我看不懂),于是决定自己想一个方法,写一个博客,将实现思路和完整代码都分享出来


二、线段与圆弧的代码表示

2.1 线段代码表示

线段可用两个点表示,点的对象如下所示,包含x和y坐标信息:

class Point {
public:
    Point(double px=0.0, double py=0.0) {
        x = px;
        y = py;
    }
    double x;
    double y;
};

2.2 圆弧代码表示

圆弧由圆心坐标、半径、起始和终止角度组成:

class Arc
{
public:
	Point centerpoint; // 圆心
	double radius; // 圆弧半径
	double bangle; // 起点角度
	double eangle; // 终点角度
};

三、实现思路及数学推导

3.1 第一步(粗略判断)

第一步(粗略判断):将线段当成直线,将圆弧当成圆,如果直线和圆不相交,则线段和圆弧必然不相交,否则进行下一步判断

首先,将线段扩展成一条直线,它的方程为: y = k x + c y=kx+c y=kx+c

根据线段的两个点(假设为 p 1 p_1 p1 p 2 p_2 p2,且 p 1 . x ≤ p 2 . x p_1.x\le p_2.x p1.xp2.x)信息,我们可以很轻易求出 k k k c c c 的取值

p 1 p_1 p1 p 2 p_2 p2 代入直线方程:

{ p 1 . y = k p 1 . x + c                  ( 1 ) p 2 . y = k p 2 . x + c                  ( 2 ) \begin{cases} p_1.y=kp_1.x+c\,\, \ \ \ \ \ \ \ \ \ \ \ \ \ \left( 1 \right)\\ p_2.y=kp_2.x+c\,\, \ \ \ \ \ \ \ \ \ \ \ \ \ \left( 2 \right) \end{cases} {p1.y=kp1.x+c             (1)p2.y=kp2.x+c             (2)

( 1 ) − ( 2 ) (1)-(2) (1)(2) 可得:

p 1 . y − p 2 . y = ( p 1 . x − p 2 . x ) k ⇒ k = p 1 . y − p 2 . y p 1 . x − p 2 . x               ( 3 ) p_1.y-p_2.y=\left( p_1.x-p_2.x \right) k \\ \Rightarrow k=\frac{p_1.y-p_2.y}{p_1.x-p_2.x} \ \ \ \ \ \ \ \ \ \ \ \ \ \left( 3 \right) p1.yp2.y=(p1.xp2.x)kk=p1.xp2.xp1.yp2.y             (3)

( 3 ) (3) (3) 代入 ( 1 ) (1) (1) 可得:

p 1 . y = p 1 . y − p 2 . y p 1 . x − p 2 . x p 1 . x + c ⇒ c = p 1 . y − p 1 . y − p 2 . y p 1 . x − p 2 . x p 1 . x               ( 4 ) p_1.y=\frac{p_1.y-p_2.y}{p_1.x-p_2.x}p_1.x+c \\ \Rightarrow c=p_1.y-\frac{p_1.y-p_2.y}{p_1.x-p_2.x}p_1.x \ \ \ \ \ \ \ \ \ \ \ \ \ \left( 4 \right) p1.y=p1.xp2.xp1.yp2.yp1.x+cc=p1.yp1.xp2.xp1.yp2.yp1.x             (4)

假设圆心坐标为 ( a , b ) (a,b) (a,b) ,半径为 r r r ,容易写出圆弧扩展而成的圆的方程如下所示:

( x − a ) 2 + ( y − b ) 2 = r 2               ( 5 ) (x-a)^2+(y-b)^2=r^2 \ \ \ \ \ \ \ \ \ \ \ \ \ \left( 5 \right) (xa)2+(yb)2=r2             (5)

要判断直线和圆是否相交,需要将直线方程和圆方程进行联立得:

{ y = k x + c ( x − a ) 2 + ( y − b ) 2 = r 2 ⇓ ( x − a ) 2 + ( k x + c − b ) 2 = r 2 , 令 d = c − b ⇓ x 2 + a 2 − 2 a x + k 2 x 2 + d 2 + 2 k d x = r 2 ⇓ ( 1 + k 2 ) x 2 + ( 2 k d − 2 a ) x + a 2 + d 2 − r 2 = 0               ( 6 ) \begin{cases} y=kx+c \\ (x-a)^2+(y-b)^2=r^2 \\ \end{cases} \\ \Downarrow \\ (x-a)^2+(kx+c-b)^2=r^2,令d=c-b \\ \Downarrow \\ x^2+a^2-2ax+k^2x^2+d^2+2kdx=r^2 \\ \Downarrow \\ (1+k^2)x^2+(2kd-2a)x+a^2+d^2-r^2=0 \ \ \ \ \ \ \ \ \ \ \ \ \ \left( 6 \right) {y=kx+c(xa)2+(yb)2=r2(xa)2+(kx+cb)2=r2,d=cbx2+a22ax+k2x2+d2+2kdx=r2(1+k2)x2+(2kd2a)x+a2+d2r2=0             (6)

根据韦达定理判断一元二次方程 ( 6 ) (6) (6) 是否存在实数根:

Δ = ( 2 k d − 2 a ) 2 − 4 ( 1 + k 2 ) ( a 2 + d 2 − r 2 ) ⇒ { Δ < 0 : 式 ( 6 ) 不存在实数根 Δ ≥ 0 : 式 ( 6 ) 存在实数根 \varDelta=(2kd-2a)^2-4(1+k^2)(a^2+d^2-r^2) \Rightarrow \begin{cases} \varDelta<0: 式 (6) 不存在实数根 \\ \varDelta\ge0:式 (6) 存在实数根 \end{cases} Δ=(2kd2a)24(1+k2)(a2+d2r2){Δ<0:(6)不存在实数根Δ0:(6)存在实数根

如果式 ( 6 ) (6) (6) 不存在实数根,意味着直线和圆没有交点,此时线段和圆弧必然也没有交点,程序结束。

如果式 ( 6 ) (6) (6) 存在实数根,则可以解出直线与圆的两个交点的 X X X 方向坐标 x 1 x_1 x1 x 2 x_2 x2

x 1 = − ( 2 k d − 2 a ) + Δ 2 ( 1 + k 2 )  和  x 2 = − ( 2 k d − 2 a ) − Δ 2 ( 1 + k 2 ) x_1=\frac{-(2kd-2a)+\sqrt{\varDelta}}{2(1+k^2)} \ 和 \ x_2=\frac{-(2kd-2a)-\sqrt{\varDelta}}{2(1+k^2)} x1=2(1+k2)(2kd2a)+Δ   x2=2(1+k2)(2kd2a)Δ

x 1 x_1 x1 x 2 x_2 x2 分别代入直线方程 y = k x + c y=kx+c y=kx+c 可得两个交点的 Y Y Y 方向坐标 y 1 y_1 y1 y 2 y_2 y2

y 1 = k x 1 + c  和  y 2 = k x 2 + c y_1=kx_1+c \ 和\ y_2=kx_2+c y1=kx1+c  y2=kx2+c

然后进行下一步判断

3.2 第二步

第二步:判断直线和圆的两个交点是否在线段上,如果不在,说明线段和圆弧必然不相交,否则进行下一步判断

线段是连续的,所以可以通过区间判断两个交点是否在线段上

详细地说,我们已经知道线段的X轴方向的区间为 [ p 1 . x   ,   p 2 . x ] [p_1.x\ ,\ p_2.x] [p1.x , p2.x]

如果 x 1 x_1 x1 不在 [ p 1 . x   ,   p 2 . x ] [p_1.x\ ,\ p_2.x] [p1.x , p2.x] 区间内,则点 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) 不在线段上,也就不可能是线段和圆弧的交点

同理,如果 x 2 x_2 x2 不在 [ p 1 . x   ,   p 2 . x ] [p_1.x\ ,\ p_2.x] [p1.x , p2.x] 区间内,则点 ( x 2 , y 2 ) (x_2,y_2) (x2,y2) 也不可能是线段和圆弧的交点

如果点 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) 和点 ( x 2 , y 2 ) (x_2,y_2) (x2,y2) 都不是线段和圆弧的交点,则说明线段和圆弧必然不相交

否则进行下一步判断

3.3 第三步

第三步:根据前面的推导,假设已知直线和圆的一个在线段上的交点为 ( x 1 , y 1 ) (x_1,y_1) (x1,y1),在这一步中,需要判断该点是否在圆弧上,如果在,则说明线段和圆弧相交,且交点为 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)

在这一步中,需要使用圆的参数方程,为了方便表示,假设圆弧的起始角度和终止角度分别为 θ 1 \theta_1 θ1 θ 2 \theta_2 θ2,则圆弧的参数方程为:

{ x = a + r c o s θ      ( 7 ) y = b + r s i n θ      ( 8 )      , θ 1 ≤ θ ≤ θ 2 \begin{cases} x=a+rcos\theta \ \ \ \ \left( 7 \right) \\ y=b+rsin\theta \ \ \ \ \left( 8 \right) \\ \end{cases} \ \ \ \ ,\theta_1\le\theta\le\theta_2 {x=a+rcosθ    (7)y=b+rsinθ    (8)    ,θ1θθ2

( x 1 , y 1 ) (x_1,y_1) (x1,y1) 代入式 ( 7 ) (7) (7) 和式 ( 8 ) (8) (8) 中:

{ x 1 = a + r c o s θ y 1 = b + r s i n θ      , θ 1 ≤ θ ≤ θ 2 ⇓ { x 1 − a = r c o s θ      ( 9 ) y 1 − b = r s i n θ      ( 10 )      , θ 1 ≤ θ ≤ θ 2 \begin{cases} x_1=a+rcos\theta \\ y_1=b+rsin\theta \\ \end{cases} \ \ \ \ ,\theta_1\le\theta\le\theta_2 \\ \Downarrow \\ \begin{cases} x_1-a=rcos\theta \ \ \ \ \left( 9 \right) \\ y_1-b=rsin\theta \ \ \ \ \left( 10 \right) \\ \end{cases} \ \ \ \ ,\theta_1\le\theta\le\theta_2 {x1=a+rcosθy1=b+rsinθ    ,θ1θθ2{x1a=rcosθ    (9)y1b=rsinθ    (10)    ,θ1θθ2

( 10 ) (10) (10) ( 9 ) (9) (9) 可得:

y 1 − b x 1 − a = t a n θ ⇓ θ = a r c t a n ( y 1 − b x 1 − a ) \frac{y_1-b}{x_1-a}=tan\theta \\ \Downarrow \\ \theta = arctan(\frac{y_1-b}{x_1-a}) x1ay1b=tanθθ=arctan(x1ay1b)

如果解出的 θ \theta θ 不在区间 [ θ 1 , θ 2 ] [\theta_1,\theta_2] [θ1,θ2] 内,则说明点 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) 不在圆弧上

否则,点 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) 在圆弧上,并且是线段和圆弧的一个交点

至此,证毕!

注意:使用 a t a n atan atan 函数计算反正切值时,返回值的取值范围是 [ − π 2 , π 2 ] [-\frac{\pi}{2},\frac{\pi}{2}] [2π,2π],而 θ \theta θ 的取值是 [ 0 , 2 π ] [0,2\pi] [0,2π],所以在实际代码中需要对角度进行转换


四、完整代码

// 圆周率
#define PI acos(-1)
// 浮点型数据精度
#define ERROR 0.0000001

// lineIsIntersectArc 的辅助函数:接着第二步判断
bool lineIsIntersectArcAuxiliaryFunction(Point p1, Point p2, double a, double b, double theta1, double theta2, double x1, double y1){
	// 2.3 判断交点是否在线段上
	if (p1.x <= x1 && x1 <= p2.x){
		// 第三步:交点(x1,y1)在线段上,再判断该点是否在圆弧上,如果在,则说明线段和圆弧相交,且交点为(x1,y1)
		// 3,1 计算 theta ,并转化为角度值
		double theta = atan((y1 - b) / (x1 - a)) / PI * 180.0;
		// 3.2 修正角度值,确保 theta1 <= theta2
		if (theta1 > theta2){
			if (theta2 >= 0){
				theta1 -= 360;
			}
			else{
				theta2 += 360;
			}			
		}
		if (theta1 < 0 && theta2 < 0){
			theta1 += 360;
			theta2 += 360;
		}
		// 3.3 修正 tan 的角度
		if (x1 < a){
			theta += 180;
		}
		// 3.4 在端点时,由于精度误差,有时可能会出现判断出错 (即出现 10.000000001 > 10 的情况),故以极小的误差接受(x1,y1)为圆弧的某个端点
		if (abs(theta1 - theta) < ERROR || abs(theta2 - theta) < ERROR){
			return true;
		}
		// 3.5 判断 theta 是否在圆弧范围内,如果在则(x1,y1)是线段和圆弧的交点,否则不是
		return theta1 <= theta && theta <= theta2;
	}
	return false;
}

// 判断一个线段是否和圆弧相交
bool lineIsIntersectArc(Point p1, Point p2, Arc arc){
	// 确保 p1.x <= p2.x
	if (p1.x > p2.x){
		DL_VertexData temp = p1;
		p1 = p2;
		p2 = temp;
	}
	// 简化圆弧的相关变量表示
	double a = arc.centerpoint.x;
	double b = arc.centerpoint.y;
	double r = arc.radius;
	double theta1 = arc.bangle;
	double theta2 = arc.eangle;
	// 第一步(粗略判断):将线段当成直线,将圆弧当成圆,如果直线和圆不相交,则线段和圆弧必然不相交,否则进行下一步判断
	// 1.1 根据公式,计算直线方程 y=kx+c 中的 k 和 c
	double k = (p1.y - p2.y) / (p1.x - p2.x);
	double c = p1.y - (p1.y - p2.y) / (p1.x - p2.x)*p1.x;
	// 1.2 根据韦达定理判断式(6)是否存在实数根
	double d = c - b;
	double varDelta = pow(2 * k*d-2*a, 2) - 4 * (1 + k*k)*(a*a + d*d - r*r);
	if (varDelta >= 0){
		// 第二步:判断直线和圆的两个交点是否在线段上,如果不在,说明线段和圆弧必然不相交,否则进行下一步判断
		// 2.1 计算两个交点的坐标(x1,y1)和(x2,y2)
		double x1 = (2 * a - 2 * k*d + sqrt(varDelta)) / (2 * (1 + k*k));
		double x2 = (2 * a - 2 * k*d - sqrt(varDelta)) / (2 * (1 + k*k));
		double y1 = k*x1 + c;
		double y2 = k*x2 + c;
		// 2.2 判断两个交点是否相等
		if (varDelta == 0){
			// 两个交点相等,只需要判断一个就好
			return lineIsIntersectArcAuxiliaryFunction(p1, p2, a, b, theta1, theta2, x1, y1);
		}
		else{
			// 两个交点不相等,分别进行判断,只要其中一个是线段和圆弧的交点就返回 true
			return lineIsIntersectArcAuxiliaryFunction(p1, p2, a, b, theta1, theta2, x1, y1) || lineIsIntersectArcAuxiliaryFunction(p1, p2, a, b, theta1, theta2, x2, y2);
		}
	}
	return false;
}

五、效果展示

有了判断一条线段和一段圆弧是否相交的函数之后,就可以用来判断圆弧是否和一个多边形相交了。最简单的思路就是用圆弧和多边形的每个边依次做判断,如果多边形的任意一条边和圆弧都不相交,则圆弧与多边形必然不相交。

交叉判断前,从下图可以看到,黄色部分就是圆弧和多边形出现了交叉重叠的情况

在这里插入图片描述

交叉判断后,圆弧与多边形的交叉情况完全消失~

在这里插入图片描述

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

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

相关文章

利用Ad Hoc传感器网络上的局部信息组织全球坐标系(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 知道通信网络中节点的地理位置通常是有用的&#xff0c;但在每个节点上添加GPS接收器或其他复杂的传感器可能会很昂贵。 本文…

系统集成项目管理工程师 笔记(第14章 项目采购管理)

文章目录 采购管理包括如下几个过程14.2 编制采购计划 4621&#xff09;采购管理计划2&#xff09;采购工作说明书3&#xff09;采购文件14.2.3 工作说明书&#xff08;SOW&#xff09; 14.3 实施采购 47414.3.2 实施采购的方法和技术 476&#xff08;1&#xff09;投标人会议&…

深入篇【C++】类与对象:构造函数+析构函数

深入篇【C】类与对象&#xff1a;构造函数析构函数 ①.构造函数Ⅰ.概念Ⅱ.特性1.函数名和类型相同。2.无返回值&#xff0c;也不用写void。3.自动调用对应的构造函数。4.构造函数可重载5.编译器的无参构造6.编译器的无参构造特性7.声明时可缺省8.构造函数的调用9.默认构造函数 …

进程控制下篇

进程控制下篇 1.进程创建 1.1认识fork / vfork 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程 #include<unistd.h> int main() {pid_t i fork;return 0; }当前进程调用fork&#xff0c;…

【VScode】的 安装--配置--使用(中文插件下载不了怎么办?)

&#x1f58a;作者 : D. Star. &#x1f4d8;专栏 : VScode &#x1f606;今日分享 : ”兰因絮果“是世间定律吗&#xff1f; 一段美好爱情开始时你侬我侬、缠缠绵绵&#xff0c;最后却以相看两厌结尾&#xff0c;让人唏嘘。清代词人纳兰容若于是咏出「人生若只如初见&#xff…

后端程序员的前端必备【Vue】 -01 Vue入门

Vue概述与基础入门 1 Vue简介1.1 简介1.2 MVVM 模式的实现者——双向数据绑定模式1.3 其它 MVVM 实现者1.4 为什么要使用 Vue.js1.5 Vue.js 的两大核心要素1.5.1 数据驱动![请添加图片描述](https://img-blog.csdnimg.cn/963aca7d7a4447009a23f6900fdd7ee1.png)1.5.2 组件化 2 …

系统集成项目管理工程师 笔记(第13章 项目合同管理)

文章目录 13.2.1 按信息系统 范围 划分的合同分类 4451、总承包合同2、单项工程承包合同3、分包合同 13.2.2 按项目 付款方式 划分的合同分类 4461、总价合同2、成本补偿合同&#xff08;卖方有利&#xff09;3、工料合同 13.3.1 项目合同的内容 44713.3.2 项目合同签订的注意事…

进程地址空间与页表方面知识点(缺页中断及写时拷贝部分原理)

谢谢阅读&#xff0c;如有错误请大佬留言&#xff01;&#xff01; 目录 谢谢阅读&#xff0c;如有错误请大佬留言&#xff01;&#xff01; 抛出总结 开始介绍 发现问题 进程地址空间&#xff08;虚拟地址&#xff09; 页表 物理内存与进程地址空间映射 缺页中断基本…

Linux操作系统之mysql数据库简介

文章目录 数据库的介绍有关数据库的操作有关数据表的操作C语言访问mysql事务视图索引 数据库的介绍 mysql数据库模型&#xff1a; 关系型数据库与非关系型数据库&#xff1a; 关系型数据库&#xff1a;指采用了关系模型来组织数据的数据库&#xff0c;关系模型就是指二维表格模…

【PCL】—— 点云滤波

文章目录 直通滤波降采样使用统计滤波&#xff08;statisticalOutlierRemoval&#xff09;移除离群点使用条件滤波&#xff08;ConditionalRemoval&#xff09;或 半径滤波&#xff08;RadiusOutlinerRemoval&#xff09;移除离群点 在获取点云数据时&#xff0c;由于设备精度&…

Vue(组件化编程:非单文件组件、单文件组件)

一、组件化编程 1. 对比传统编写与组件化编程&#xff08;下面两个解释图对比可以直观了解&#xff09; 传统组件编写&#xff1a;不同的HTML引入不同的样式和行为文件 组件方式编写&#xff1a;组件单独&#xff0c;复用率高&#xff08;前提组件拆分十分细致&#xff09; 理…

【Fluent】Error: Model information is incompatible with incoming mesh.

一、问题背景 在原有workbench数据文件上&#xff0c;修改几何数据&#xff0c;然后重新划分网格&#xff0c;在更新网格后&#xff0c;workbench就弹出错误Error&#xff01; Model information is incompatible with incoming mesh. 因为当时并不影响我打开fluent求解器&am…

C语言数组介绍和用法

文章目录 前言一、数组的定义二、数组的大小三、数组的访问方法四、使用for循环遍历数组五、数组地址的访问方法六、二维数组七、二维数组的遍历总结 前言 本篇文章将带大家学习C语言中的数组&#xff0c;数组在C语言中是一个比较重要的点&#xff0c;大家需要好好理解并多加使…

Linux Shell 介绍及常用命令汇总

文章目录 Part.I shell 简介Chap.I 概念汇编Chap.II 命令概览 Part.II shell 常用命令大全Chap.I 关于文件和目录Chap.II 关于磁盘和内存Chap.III 关于进程调度 Reference Part.I shell 简介 Chap.I 概念汇编 下面是一些概念 shell 与 bash 的区别与联系&#xff1a;bash 是 b…

2023五一杯B题:快递需求分析问题

题目 网络购物作为一种重要的消费方式&#xff0c;带动着快递服务需求飞速增长&#xff0c;为我国经济发展做出了重要贡献。准确地预测快递运输需求数量对于快递公司布局仓库站点、节约存储成本、规划运输线路等具有重要的意义。附件1、附件2、附件3为国内某快递公司记录的部分…

从力的角度再次比较9-2分布和8-3分布

( A, B )---1*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有1个节点&#xff0c;AB各由11张二值化的图片组成&#xff0c;让A中有3个0&#xff0c;8个1.B中全是0&#xff0c;排列组合A的所有可能&#xff0c;统计迭代次数的顺序。在前面实验中得到了8-3分布的数据 A-B 迭代次数 …

孔乙己文学,满街长衫,为谁而穿?解构孔乙己文学

鲁迅先生创作《孔乙己》的背景是20世纪初期的中国社会。那时&#xff0c;中国正处于民国的初期&#xff0c;社会动荡不安&#xff0c;人民生活贫困。在这个背景下&#xff0c;鲁迅开始写作并发表了一系列揭露社会黑暗面的作品。《孔乙己》是其中之一&#xff0c;它讲述了一个被…

利用snpEff对基因型VCF文件进行变异注释的详细方法

利用snpEff对VCF文件进行变异注释 群体遗传研究中&#xff0c;在获得SNP位点后,我们需要对SNP位点进行注释&#xff0c;对这些SNP位点进行更深的了解。 snpEff是一个用于对基因组单核苷酸多态性(SNP)进行注释的软件&#xff0c;snpEff软件可以用于对VCF文件进行变异注释&#x…

VC++ | VS2017编译报错-20230428

VC | VS2017编译报错-20230428 文章目录 VC | VS2017编译报错-202304281.报错1-1.解决办法 2.报错2-1.解决办法2-1-1.做如下设置2-1-2.代码调整 1.报错 1>------ 已启动生成: 项目: NvtUSBTool, 配置: Debug Win32 ------ 1>NvtUSBTool.cpp 1>$(PRJ_ROOT_DIR)nvtusbt…

Linux文件系统权限

目录标题 文件权限文件和目录的一般权限文件的权限针对三类对象进行定义文件和目录中&#xff0c;r、w、x的作用 设置文件和目录的一般权限修改文件或目录的权限—chmod(change mode)命令权限值的表示方法—使用3位八进制数表示权限值的表示方法—使用字符串表示修改文件或目录…