当前位置:首页 » 操作系统 » gjk算法

gjk算法

发布时间: 2022-05-14 12:13:48

Ⅰ 请C++高手做一个判断三角形和矩形是否相交的程序

classVector2D{//2D向量类
public:
doublex,y;
Vector2D(doublex_=0,doubley_=0):x(x_),y(y_){}
};

boolisZero(constVector2D&vec,doubletolerance=0.05)const{
returnstd::abs(vec.x)<tolerance&&std::abs(vec.y)<tolerance;
}

Vector2DtripleProct(constVector2D&v1,constVector2D&v2,constVector2D&v3){//三角乘积
doublep=v1.x*v2.y-v1.y*v2.x;
returnVector2D(-p*v3.y,p*v3.x);
}

doubledot(constVector2D&v1,cosntVector2D&v2){//点乘
returnv1.x*v2.x+v1.y*v2.y;
}

Vector2Dnegate(constVector2D&vec){//向量取反
returnVector2D(-vec.x,-vec.y);
}

Vector2Dsub(constVector2D&v1,constVector2D&v2){//向量相减
returnVector2D(v1.x-v2.x,v1.y-v2.y);
}

Vector2DgetFarthestPoint(constVector2D&dir,constVector2Dpoly[],intlen){//求一个凸多边形poly在某个方向dir上最远的一点
Vector2DbestPoint=poly[0];
doublebestProj=dot(bestPoint,dir);
for(inti=1;i<len;++i){
Vector2Dcurr=poly[i];
doubleproj=dot(curr,dir);
if(proj>bestProj){
bestPoint=curr;
bestProj=proj;
}
}
returnbestPoint;
}

Vector2DgetSupportPoint(constVector2D&dir,constVector2Dpoly1[],intlen1,constVector2Dpoly2[],intlen2){//GJK算法的一部分,求两个凸多边形的闵可夫斯基差在某个方向dir上最远的一点
Vector2Dv1=getFarthestPoint(dir,poly1,len1),
v2=getFarthestPoint(negate(dir),poly2,len2);
returnsub(v1,v2);
}

boolisIntersect(constVector2Dpoly1[],intlen1,constVector2Dpoly2[],intlen2){
Vector2DsimplexA,simplexB,simplexC,dir=Vector2D(-1,-1);

simplexA=getSupportPoint(dir,poly1,len1,poly2,len2);
if(dot(simplexA,dir)<=0){
returnfalse;
}

dir=negate(simplexA);
simplexB=getSupportPoint(dir,poly1,len1,poly2,len2);
if(dot(simplexB,dir)<=0){
returnfalse;
}

Vector2Dab=sub(simplexB,simplexA);
dir=tripleProct(ab,negate(simplexA),ab);

for(inti=25;i--;){//25是最大迭代次数,一般迭代3次以内就能完成
if(isZero(dir)){
returntrue;
}

simplexC=getSupportPoint(dir,poly1,len1,poly2,len2);
if(dot(simplexC,dir)<=0){
returnfalse;
}

Vector2Dba=sub(simplexA,simplexB),
ac=sub(simplexC,simplexA),
bc=sub(simplexC,simplexB),
acPerp=tripleProct(ac,negate(ba),ac),
bcPerp=tripleProct(bc,ba,bc);

if(dot(acPerp,simplexA)>0){
simplexB=simplexC;
dir=negate(acPerp);
}elseif(dot(bcPerp,simplexB)>0){
simplexA=simplexC;
dir=negate(bcPerp);
}else{
returntrue;
}
}

returnfalse;
}


这个是我把自己的代码里的一段截出来改了下变量名和参数什么的, 不确定有没哪里漏了改的, 如果运行有错误可以自己修一下

isIntersect可以判断任意两个凸多边形是否相交, 用的GJK算法

三角形和矩形存在一个Vector2D数组里, 用isIntersect(poly1, poly1len, poly2, poly2len)就能判断

改一下getFarthestPoint还能变成任意两个凸图形是否相交

Ⅱ 关于结构设计中 荷载组合 是一个什么意思始终没有一个很清晰的概念。谢谢

详见《建筑结构荷载规范》GB 50009 - 2012第3章
3 荷载分类和荷载组合
3.1 荷载分类和荷载代表值
3.1.1 建筑结构的荷载可分为下列三类:
1 永久荷载,包括结构自重、土压力、预应力等。
2 可变荷载,包括楼面活荷载、屋面活荷载和积灰荷载、
吊车荷载、风荷载、雪荷载、温度作用等。
3 偶然荷载,包括爆炸力、撞击力等。
3. 1. 2 建筑结构设计时,应接下列规定对不同荷载采用不同的
代表值:
1 对永久荷载应采用标准值作为代表值;
2 对可变荷载应根据设计要求采用标准值、组合值、频遇
值或准永久值作为代表值;
3 对偶然荷载应按建筑结构使用的特点确定其代表值。
3.1.3 确定可变荷载代表值时应采用50 年设计基准期。
3. 1. 4 荷载的标准值,应按本规范各章的规定采用。
3. 1. 5 承载能力极限状态设计或正常使用极限状态按标准组合
设计时,对可变荷载应按规定的荷载组合采用荷载的组合值或标
准值作为其荷载代表值。可变荷载的组合值,应为可变荷载的标
准值乘以荷载组合值系数。
3. 1. 6 正常使用极限状态按频遇组合设计时,应采用可变荷载
的频遇值或准永久值作为其荷载代表值;按准永久组合设计时,
应采用可变荷载的准永久值作为其荷载代表值。可变荷载的频遇
值,应为可变荷载标准值乘以频遇值系数。可变荷载准永久值,
应为可变荷载标准值乘以准永久值系数。
3.2 荷载组合
3.2.1 建筑结构设计应根据使用过程中在结构上可能同时出现
的荷载,按承载能力极限状态和正常使用极限状态分别进行荷载
组合,并应取各自的最不利的组合进行设计。
3.2.2 对于承载能力极限状态,应按荷载的基本组合或偶然组
合计算荷载组合的效应设计值,并应采用下列设计表达式进行
设计z
YoSd 运Rd (3. 2. 2)
式中:ìí。一一结构重要性系数,应按各有关建筑结构设计规范的
规定采用;
Sd 一一荷载组合的效应设计值;
Rd 一一结构构件抗力的设计值,应按各有关建筑结构设计
规范的规定确定。
3.2.3 荷载基本组合的效应设计值马,应从下列荷载组合值中
取用最不利的效应设计值确定:
1 由可变荷载控制的效应设计值,应接下式进行计算:
Sd= ~γGjSGjk +γQjγ'4 S~k + ~ 10; 1~ tþ C;SO;k
(3.2.3-1)
式申:γGj 一一第j 个永久荷载的分项系数,应按本规范第3.2.4
条采用;
h 一一第i 个可变荷载的分项系数,其中γQj 为主导可变
荷载Ql 的分项系数,应按本规范第3.2.4 条
采用;
飞一一第i 个可变荷载考虑设计使用年限的调整系数,
其中飞为主导可变荷载Ql 考虑设计使用年限的
调整系数;
S马k 一一按第j 个永久荷载标准值GJk 计算的荷载效应值;
Sqk 一一按第i 个可变荷载标准值QIk计算的荷载效应值,
其中S~k为诸可变荷载效应中起控制作用者;
队一一第i 个可变荷载Qi 的组合值系数;
m 一-参与组合的永久荷载数;
n-一一参与组合的可变荷载数。
2 由永久荷载控制的效应设计值,应接下式进行计算:
Sd=Ehhk+EW呐Sqk (3 山)
注: 1 基本组合中的效应设计值仅适用于荷载与荷载效应为线性的
情况;
2 当对~k 无法明显判断时,应轮次以各可变荷载效应作为
向k I 并选取其中最不利的荷载组合的效应设计值。
3.2.4 基本组合的荷载分项系数,应按下列规定采用:
1 永久荷载的分项系数应符合下列规定:
1) 当永久荷载效应对结构不利时,对由可变荷载效应控
制的组合应取1.2 ,对由永久荷载效应控制的组合应
取1. 35;
2) 当永久荷载效应对结构有利时,不应大于1.0。
2 可变荷载的分项系数应符合下列规定:
1) 对标准值大于4kN/旷的工业房屋楼面结构的活荷载,
应取1.3;
2) 其他情况,应取1.4 。
3 对结构的倾覆、滑移或漂浮验算,荷载的分项系数应满
足有关的建筑结构设计规范的规定。
3.2.5 可变荷载考虑设计使用年限的调整系数几应按下列规定
采用:
1 楼面和屋面活荷载考虑设计使用年限的调整系数几应按
表3. 2. 5 采用。表3.2.5 辙面和厘面活荷载考虑设计使用年限的调整系数γL
|结构设计使用年限何I 5 I 50 I 100
孔I o. 9 I 1. 0 I 1. 1
注: 1 当设计使用年限不为表中数值时,调整系数只可按线性内插确定;
2 对于荷载标准值可控制的活荷载,设计使用年限调整系数几取1. 0 0
2 对雪荷载和风荷载,应取重现期为设计使用年限,按本
规范第E. 3. 3 条的规定确定基本雪压和基本风压,或按有关规
范的规定采用。
3.2.6 荷载偶然组合的效应设计值Sd 可按下列规定采用t
1 用于承载能力极限状态计算的效应设计值,应按下式进
行计算:
Sd = ~ SGjk + SAd + (/J!j SQjk + ~ CÞQ; S Q,k (3.2.6-1)
式中: SAd 一一按偶然荷载标准值Ad 计算的荷载效应值;
CÞf1 一一第1 个可变荷载的频遇值系数;
弘一一第i 个可变荷载的准永久值系数。
2 用于偶然事件发生后受损结构整体稳固性验算的效应设
计值,应按下式进行计算:
Sd = ~ SGjk + CÞfj SQjk 十~ CÞQ; S Q,k (3.2. 6-2)
注:组合中的设计值仅适用于荷载与荷载效应为线性的情况。
3.2.7 对于正常使用极限状态,应根据不同的设计要求,采用
荷载的标准组合、频遇组合或准永久组合,并应按下列设计表达
式进行设计z
Sd ~ C (3.2. 7)
式中:C一一结构或结构构件达到正常使用要求的规定限值,例
如变形、裂缝、振幅、加速度、应力等的限值,应
按各有关建筑结构设计规范的规定采用。
3.2.8 荷载标准组合的效应设计值Sd 应按下式进行计算:Sd = ~ SGjk + SQlk 十三:仇.,5qk (3.2.8)
注:组合中的设计值仅适用于荷载与荷载效应为线性的情况。
3.2.9 荷载频遇组合的效应设计值Sd 应按下式进行计算z
Sd = ~ S乌k+ 仇l SQl k + 三句句(3.2.9)
注g 组合中的设计值仅适用于荷载与荷载效应为线性的情况。
3.2.10 荷载准永久组合的效应设计值Sd 应按下式进行计算z
Sd=E S马k 十三Ý''l; Sqk (3.2.10)
注:组合中的设计值仅适用于荷载与荷载效应为线性的情况。

Ⅲ 建筑面积计算规则是什么

房屋建筑面积、使用面积等都与购房者息息相关,对于房屋建筑面积的概念和计算方式等信息购房者需要有一定的了解。

房屋建筑面积

房屋的建筑面积系指外围水平面积及水平投影面积计算,其中包括房屋建筑面积、共有建筑面积、使用面积等的测算。

建筑面积计算规则有以下一般规定

房屋建筑计算面积时,需要注意的是:第一是房屋建筑面积计算按房屋外墙(柱)勒脚以上各层的外围水平投影面积,包括阳台、挑廊、地下室、室外楼梯等,且具备有上盖,结构牢固,层高2.20米(含2.20米,下同)以上的永久性建筑;第二、房屋共有建筑面积系指各产权人共同占有或共同使用的建筑面积;第三、房屋使用面积系指房屋户内全部可供使用的空间面积,按房屋的内墙面水平面积计算;第四、房屋层数是指房屋的自然层数,一般按室内地坪±0.00m以上计算;第五、房屋所在层次是指本权属单元的房屋在该幢楼房中的第几层。地下层次以负数表示。第六、房屋结构(如墙、柱)占用的面积,包括地下室所占用的面积,但不包括天井、墙外阳台、客观存在外楼梯等占用的面积。

(以上回答发布于2013-05-27,当前相关购房政策请以实际为准)

更多房产资讯,政策解读,专家解读,点击查看

Ⅳ 二维实序列的快速傅里叶变换(FFT)

在地球物理数据处理中,经常遇到处理二维实数据的情况。例如在地震勘探中,对面波勘探数据作频散分析解释时,要将时间-空间域的信息转换为频率-波数域频谱;在重磁异常的滤波或转换中,要将空间域的异常f(x,y)转换为波数域F(ω,υ)等。这些分析都需要进行二维的傅里叶变换(FFT)。

根据傅里叶变换的定义,对于连续二维函数f(x,y),其傅里叶变换对为

地球物理数据处理基础

对于离散的二维序列fjk(j=0,1,…,M-1;k=0,1,…,N-1),其傅里叶变换为

地球物理数据处理基础

1.二维复序列的FFT算法

对于M条测线,每条测线N个测点,构成复序列yjk(j=0,1,…,M-1;k=0,1,…,N-1),根据离散傅里叶公式(8-41),其傅里叶变换为

地球物理数据处理基础

于是,可以分两步套用一维复FFT完成二维复FFT的计算。

(1)沿测线方向计算

对于j=0,1,…,M-1逐测线套用一维复FFT,执行式(8-43)。定义复数组 则算法为

1)对于j=0,1,…,M-1,作2)~7);

2)将yjk输入A1(k),即A1(k)=yjk(k=0,1,…,N-1);

3)计算Wr,存入W(r),即

4)q=1,2,…,p(p=log2N),若q为偶数执行6),否则执行5);

5)k=0,1,2,…,(2p-q-1)和n=0,1,2,…,(2q-1-1)循环,作

A2(k2q+n)=A1(k2q-1+n)+A1(k2q-1+n+2p-1

A2(k2q+n+2q-1)=[A1(k2q-1+n)-A1(k2q-1+n+2p-1)]·W(k2q-1

至k,n循环结束;

6)k=0,1,2,…,(2p-q-1)和n=0,1,2,…,(2q-1-1)循环,作

A1(k2q+n)=A2(k2q-1+n)+A2(k2q-1+n+2p-1

A1(k2q+n+2q-1)=[A2(k2q-1+n)-A2(k2q-1+n+2p-1)]·W(k2q-1

至k,n循环结束;

7)q循环结束,若p为偶数,将A1(n)输入到Yjn,否则将A2(n)输入到Yjn(n=0,1,…,N-1);

8)j循环结束,得到Yjn(j=0,1,…,M-1;n=0,1,…,N-1)。

(2)垂直测线方向计算

对于n=0,1,…,N-1逐一套用一维复FFT,执行式(8-44)。即

1)对于n=0,1,…,N-1,作2)~7);

2)将Yjn输入A1(j),即A1(j)=Yjn(j=0,1,…,M-1);

3)计算Wr存入W(r),即

4)q=1,2,…,p(p=log2M),若q为偶数执行6),否则执行5);

5)j=0,1,2,…,(2p-q-1)和m=0,1,2,…,(2q-1-1)循环,作

A2(j2q+m)=A1(j2q-1+m)+A1(j2q-1+m+2p-1

A2(j2q+m+2q-1)=[A1(j2q-1+m)-A1(j2q-1+m+2p-1)]·W(j2q-1

至j,m循环结束;

6)j=0,1,2,…,(2p-q-1)和m=0,1,2,…,(2q-1-1)循环,作

A1(j2q+m)=A2(j2q-1+m)+A2(j2q-1+m+2p-1

A1(j2q+m+2q-1)=[A2(j2q-1+m)-A2(j2q-1+m+2p-1)]·W(j2q-1

至j,m循环结束;

7)q循环结束,若p为偶数,将A1(m)输入到Ymn,否则将A2(m)输入到Ymn(m=0,1,…,M-1);

8)n循环结束,得到二维复序列的傅氏变换Ymn(m=0,1,…,M-1;n=0,1,…,N-1),

所求得的Ymn是复数值,可以写为

Ymn=Rmn+iImn (m=0,1,…,M-1;n=0,1,…,N-1)

其中,Rmn,Imn的值也是已知的。

2.二维实序列的FFT算法

对于二维的实序列,我们把其看作是虚部为零的复序列,套用上述的二维复序列FFT方法来求其频谱算法上也是可行的,但势必会增加大量的无功运算。因此,有必要研究二维实序列FFT的实用算法,同一维实序列FFT的实现思路一样,同样把二维实序列按一定的规律构造成二维复序列,调用二维复序列FFT,然后通过分离和加工得到原实序列的频谱。

例如采样区域有2 M条测线,每条测线有N个点,并且M,N都是2的整数幂,需要计算实样本序列xjk(j=0,1,2,…,2 M-1;k=0,1,2,…,N-1)的傅氏变换:

地球物理数据处理基础

类似于一维实序列FFT的思想,直接建立下面的二维实序列FFT算法:

(1)将一个二维实序列按偶、奇线号分为两个二维子实序列,分别作为实部和虚部组合为一个二维复序列。即令

地球物理数据处理基础

(2)调用二维复FFT过程,求出yjk的二维傅氏变换Ymn的复数值:

地球物理数据处理基础

式中:Rmn,Imn是Ymn的实部和虚部。

(3)利用Rmn,Imn换算Xmn的值。

前两步容易实现,下面分析第(3)步的实现。

记hjk,gjk的傅氏变换为Hmn,Gmn。根据傅里叶变换的定义,我们导出Xmn与Hmn,Gmn的关系式:

地球物理数据处理基础

式中,Hmn,Gmn为复数,我们用上标r和i表示其实部和虚部,将上式右端实部、虚部分离

地球物理数据处理基础

其中:

地球物理数据处理基础

下面的任务是将Hmn,Gmn各分量与通过二维复FFT求出的Rmn,Imn值联系起来。为此先给出奇、偶分解性质和类似于一维情况的三个二维傅氏变换性质:

(1)奇偶分解性

任何一个正负对称区间定义的函数,均可唯一地分解为如下偶(even)、奇(odd)函数之和:

地球物理数据处理基础

(2)周期性

地球物理数据处理基础

(3)复共轭性

地球物理数据处理基础

现在我们来建立Rmn,Imn与Hmn,Gmn的关系。对Ymn作奇偶分解:

地球物理数据处理基础

根据线性性质

地球物理数据处理基础

对照式(8-54)和式(8-55),得

地球物理数据处理基础

由于hjk,gjk是实函数,根据复共轭性质,上面两式对应的奇偶函数相等。即

地球物理数据处理基础

再由奇偶分解性和周期性,得

地球物理数据处理基础

将式(8-57)代入式(8-50),得

地球物理数据处理基础

再利用Hmn,Gmn周期性及复共轭性,可以得到m=M/2+1,…,M-1;n=0,1,…,N-1的傅氏变换,即

地球物理数据处理基础

将式(8-50)中M,N改为M-m,N-n,并将上式代入,得

地球物理数据处理基础

由式(8-58)、式(8-59)和式(8-61)即可得到原始序列xjk(j=0,1,…,2M-1;n=0,1,…,N-1)在m=0,1,…,M-1;n=0,1,…,N-1区间的傅氏变换Xmn

具体二维实序列的FFT算法如下:

(1)令hjk=x2j,k,gjk=x2j+1,k,形成

yjk=hjk+igjk (j=0,1,…,2 M-1;n=0,1,…,N-1)

(2)调用二维复序列FFT过程,即从两个方向先后调用一维复FFT算法式(8-43)和式(8-44),求得yjk的二维傅氏变换Ymn的复数值:

Ymn=Rmn+iImn (m=0,1,…,M-1;n=0,1,…,N-1)

(3)用下列公式由Rmn,Imn的值换算Xmn的值:

地球物理数据处理基础

地球物理数据处理基础

Ⅳ 吊车钢梁在设计荷载作用下应按哪个应力阶段设计计算

钢筋混凝土梁使用阶段应力计算时,荷载采用短期效用组合值并考虑长期作用影响,详见《建筑结构荷载规范》 GB 50009 - 2012第3章
3.2 荷载组合
3.2.1 建筑结构设计应根据使用过程中在结构上可能同时出现
的荷载,按承载能力极限状态和正常使用极限状态分别进行荷载
组合,并应取各自的最不利的组合进行设计。
3.2.2 对于承载能力极限状态,应按荷载的基本组合或偶然组
合计算荷载组合的效应设计值,并应采用下列设计表达式进行
设计z
YoSd 运Rd (3. 2. 2)
式中:ìí。一一结构重要性系数,应按各有关建筑结构设计规范的
规定采用;
Sd 一一荷载组合的效应设计值;
Rd 一一结构构件抗力的设计值,应按各有关建筑结构设计
规范的规定确定。
3.2.3 荷载基本组合的效应设计值马,应从下列荷载组合值中
取用最不利的效应设计值确定:
1 由可变荷载控制的效应设计值,应接下式进行计算:
Sd= ~γGjSGjk +γQjγ'4 S~k + ~ 10; 1~ tþ C;SO;k
(3.2.3-1)
式申:γGj 一一第j 个永久荷载的分项系数,应按本规范第3.2.4
条采用;
h 一一第i 个可变荷载的分项系数,其中γQj 为主导可变
荷载Ql 的分项系数,应按本规范第3.2.4 条
采用;
飞一一第i 个可变荷载考虑设计使用年限的调整系数,
其中飞为主导可变荷载Ql 考虑设计使用年限的
调整系数;
S马k 一一按第j 个永久荷载标准值GJk 计算的荷载效应值;
Sqk 一一按第i 个可变荷载标准值QIk计算的荷载效应值,
其中S~k为诸可变荷载效应中起控制作用者;
队一一第i 个可变荷载Qi 的组合值系数;
m 一-参与组合的永久荷载数;
n-一一参与组合的可变荷载数。
2 由永久荷载控制的效应设计值,应接下式进行计算:
Sd=Ehhk+EW呐Sqk (3 山)
注: 1 基本组合中的效应设计值仅适用于荷载与荷载效应为线性的
情况;
2 当对~k 无法明显判断时,应轮次以各可变荷载效应作为
向k I 并选取其中最不利的荷载组合的效应设计值。
3.2.4 基本组合的荷载分项系数,应按下列规定采用:
1 永久荷载的分项系数应符合下列规定:
1) 当永久荷载效应对结构不利时,对由可变荷载效应控
制的组合应取1.2 ,对由永久荷载效应控制的组合应
取1. 35;
2) 当永久荷载效应对结构有利时,不应大于1.0。
2 可变荷载的分项系数应符合下列规定:
1) 对标准值大于4kN/旷的工业房屋楼面结构的活荷载,
应取1.3;
2) 其他情况,应取1.4 。
3 对结构的倾覆、滑移或漂浮验算,荷载的分项系数应满
足有关的建筑结构设计规范的规定。

Ⅵ 构造平面三角形类,并使该类具有判断,任意两三角形是否相交,相离包含的

<pre t="code" l="cpp">class Vector2D { //2D向量类
public:
double x, y;
Vector2D(double x_ = 0, double y_ = 0): x(x_), y(y_) {}
};

bool isZero(const Vector2D vec, double tolerance = 0.05) const {
return std::abs(vec.x) < tolerance std::abs(vec.y) < tolerance;
}

Vector2D tripleProct(const Vector2D v1, const Vector2D v2, const Vector2D v3) { //三角乘积
double p = v1.x * v2.y - v1.y * v2.x;
return Vector2D(-p * v3.y, p * v3.x);
}

double dot(const Vector2D v1, cosnt Vector2D v2) { //点乘
return v1.x * v2.x + v1.y * v2.y;
}

Vector2D negate(const Vector2D vec) { //向量取反
return Vector2D(-vec.x, -vec.y);
}

Vector2D sub(const Vector2D v1, const Vector2D v2) { //向量相减
return Vector2D(v1.x - v2.x, v1.y - v2.y);
}

Vector2D getFarthestPoint(const Vector2D dir, const Vector2D poly[], int len) { //求一个凸多边形poly在某个方向dir上最远的一点
Vector2D bestPoint = poly[0];
double bestProj = dot(bestPoint, dir);
for (int i = 1; i < len; ++i) {
Vector2D curr = poly[i];
double proj = dot(curr, dir);
if (proj > bestProj) {
bestPoint = curr;
bestProj = proj;
}
}
return bestPoint;
}

Vector2D getSupportPoint(const Vector2D dir, const Vector2D poly1[], int len1, const Vector2D poly2[], int len2) { //GJK算法的一部分, 求两个凸多边形的闵可夫斯基差在某个方向dir上最远的一点
Vector2D v1 = getFarthestPoint(dir, poly1, len1),
v2 = getFarthestPoint(negate(dir), poly2, len2);
return sub(v1, v2);
}

bool isIntersect(const Vector2D poly1[], int len1, const Vector2D poly2[], int len2) {
Vector2D simplexA, simplexB, simplexC, dir = Vector2D(-1, -1);

simplexA = getSupportPoint(dir, poly1, len1, poly2, len2);
if (dot(simplexA, dir) <= 0) {
return false;
}

dir = negate(simplexA);
simplexB = getSupportPoint(dir, poly1, len1, poly2, len2);
if (dot(simplexB, dir) <= 0) {
return false;
}

Vector2D ab = sub(simplexB, simplexA);
dir = tripleProct(ab, negate(simplexA), ab);

for (int i = 25; i--;) { //25是最大迭代次数, 一般迭代3次以内就能完成
if (isZero(dir)) {
return true;
}

simplexC = getSupportPoint(dir, poly1, len1, poly2, len2);
if (dot(simplexC, dir) <= 0) {
return false;
}

Vector2D ba = sub(simplexA, simplexB),
ac = sub(simplexC, simplexA),
bc = sub(simplexC, simplexB),
acPerp = tripleProct(ac, negate(ba), ac),
bcPerp = tripleProct(bc, ba, bc);

if (dot(acPerp, simplexA) > 0) {
simplexB = simplexC;
dir = negate(acPerp);
} else if (dot(bcPerp, simplexB) > 0) {
simplexA = simplexC;
dir = negate(bcPerp);
} else {
return true;
}
}

return false;
}
这个是我把自己的代码里的一段截出来改了下变量名和参数什么的, 不确定有没哪里漏了改的, 如果运行有错误可以自己修一下
isIntersect可以判断任意两个凸多边形是否相交, 用的GJK算法三角形和矩形存在一个Vector2D数组里, 用isIntersect(poly1, poly1len, poly2, poly2len)就能判断
改一下getFarthestPoint还能变成任意两个凸图形是否相交

Ⅶ 如何办理小额贷款

当..天下,无前.*.期,魏*xin: tcvipa
--------
网络安全从其本质上来讲就是网络上的信息安全。从广义来说,凡是涉及到网络上信息的保密性、完整性、可用性、真实性和可控性的相关技术和理论都是网络安全的研究领域。确保网络系统的信息安全是网络安全的目标,信息安全包括两个方面:信息的存储安全和信息的传输安全。信息的存储安全是指信息在静态存放状态下的安全,如是否会被非授权调用等。信息的传输安全是指信息在动态传输过程中安全。为了确保网络信息的传输安全,有以下几个问题:
(1)对网络上信息的监听;
(2)对用户身份的仿冒;
(3)对网络上信息的篡改;
(4)对发出的信息予以否认;
(5)对信息进行重发。
折叠对于一般的常用入侵方法主要有
1.口令入侵
所谓口令入侵,就是指用一些软件解开已经得到但被人加密的口令文档,不过许多黑客已大量采用一种可以绕开或屏蔽口令保护的程序来完成这项工作。对于那些可以解开或屏蔽口令保护的程序通常被称为“Crack”。由于这些软件的广为流传,使得入侵电脑网络系统有时变得相当简单,一般不需要很深入了解系统的内部结构,是初学者的好方法。
2.特洛伊木马术
说到特洛伊木马,只要知道这个故事的人就不难理解,它最典型的做法可能就是把一个能帮助黑客完成某一特定动作的程序依附在某一合法用户的正常程序中,这时合法用户的程序代码已被该变。一旦用户触发该程序,那么依附在内的黑客指令代码同时被激活,这些代码往往能完成黑客指定的任务。由于这种入侵法需要黑客有很好的编程经验,且要更改代码、要一定的权限,所以较难掌握。但正因为它的复杂性,一般的系统管理员很难发现。
3.监听法
这是一个很实用但风险也很大的黑客入侵方法,但还是有很多入侵系统的黑客采用此类方法,正所谓艺高人胆大。
网络节点或工作站之间的交流是通过信息流的转送得以实现,而当在一个没有集线器的网络中,数据的传输并没有指明特定的方向,这时每一个网络节点或工作站都是一个接口。这就好比某一节点说:“嗨!你们中有谁是我要发信息的工作站。”
此时,所有的系统接口都收到了这个信息,一旦某个工作站说:“嗨!那是我,请把数据传过来。”联接就马上完成。
目前有网络上流传着很多嗅探软件,利用这些软件就可以很简单的监听到数据,甚至就包含口令文件,有的服务在传输文件中直接使用明文传输,这也是非常危险的。
4.E-mail技术
使用email加木马程序这是黑客经常使用的一种手段,而且非常奏效,一般的用户,甚至是网管,对网络安全的意识太过于淡薄,这就给很多黑客以可乘之机。
5.病毒技术
作为一个黑客,如此使用应该是一件可耻的事情,不过大家可以学习,毕竟也是一种攻击的办法,特殊时间,特殊地点完全可以使用。
6.隐藏技术
折叠攻击的准备阶段
首先需要说明的是,入侵者的来源有两种,一种是内部人员利用自己的工作机会和权限来获取不应该获取的权限而进行的攻击。另一种是外部人员入侵,包括远程入侵、网络节点接入入侵等。本节主要讨论远程攻击。
进行网络攻击是一件系统性很强的工作,其主要工作流程是:收集情报,远程攻击,远程登录,取得普通用户的权限,取得超级用户的权限,留下后门,清除日志。主要内容包括目标分析,文档获取,破解密码,日志清除等技术,下面分别介绍。
1.确定攻击的目的
攻击者在进行一次完整的攻击之前首先要确定攻击要达到什么样的目的,即给对方造成什么样的后果。常见的攻击目的有破坏型和入侵型两种。破坏型攻击指的只是破坏攻击目标,使其不能正常工作,而不能随意控制目标的系统的运行。要达到破坏型攻击的目的,主要的手段是拒绝服务攻击(Denial Of Service)。另一类常见的攻击目的是入侵攻击目标,这种攻击是要获得一定的权限来达到控制攻击目标的目的。应该说这种攻击比破坏型攻击更为普遍,威胁性也更大。因为黑客一旦获取攻击目标的管理员权限就可以对此服务器做任意动作,包括破坏性的攻击。此类攻击一般也是利用服务器操作系统、应用软件或者网络协议存在的漏洞进行的。当然还有另一种造成此种攻击的原因就是密码泄露,攻击者靠猜测或者穷举法来得到服务器用户的密码,然后就可以用和真正的管理员一样对服务器进行访问
2.信息收集
除了确定攻击目的之外,攻击前的最主要工作就是收集尽量多的关于攻击目标的信息。这些信息主要包括目标的操作系统类型及版本,目标提供哪些服务,各服务器程序的类型与版本以及相关的社会信息。
要攻击一台机器,首先要确定它上面正在运行的操作系统是什么,因为对于不同类型的操作系统,其上的系统漏洞有很大区别,所以攻击的方法也完全不同,甚至同一种操作系统的不同版本的系统漏洞也是不一样的。要确定一台服务器的操作系统一般是靠经验,有些服务器的某些服务显示信息会泄露其操作系统。例如当我们通过TELNET连上一台机器时,如果显示
Unix(r)System V Release 4.0
login:
那么根据经验就可以确定这个机器上运行的操作系统为SUN OS 5.5或5.5.l。但这样确定操作系统类型是不准确的,因为有些网站管理员为了迷惑攻击者会故意更改显示信息,造成假象。
还有一种不是很有效的方法,诸如查询DNS的主机信息(不是很可靠)来看登记域名时的申请机器类型和操作系统类型,或者使用社会工程学的方法来获得,以及利用某些主机开放的SNMP的公共组来查询。
另外一种相对比较准确的方法是利用网络操作系统里的TCP/IP堆栈作为特殊的“指纹”来确定系统的真正身份。因为不同的操作系统在网络底层协议的各种实现细节上略有不同。可以通过远程向目标发送特殊的包,然后通过返回的包来确定操作系统类型。例如通过向目标机发送一个FIN的包(或者是任何没有ACK或SYN标记的包)到目标主机的一个开放的端口然后等待回应。许多系统如windows、 BSDI、CISCO、 HP/UX和IRIX会返回一个RESET。通过发送一个SYN包,它含有没有定义的TCP标记的TCP头。那么在Linux系统的回应包就会包含这个没有定义的标记,而在一些别的系统则会在收到SYN+BOGU包之后关闭连接。或是利用寻找初始化序列长度模板与特定的操作系统相匹配的方法。利用它可以对许多系统分类,如较早的Unix系统是64K长度,一些新的Unix系统的长度则是随机增长。还有就是检查返回包里包含的窗口长度,这项技术根据各个操作系统的不同的初始化窗口大小来唯一确定它们。利用这种技术实现的工具很多,比较着名的有NMAP、CHECKOS、QUESO等。
获知目标提供哪些服务及各服务daemon的类型、版本同样非常重要,因为已知的漏洞一般都是对某一服务的。这里说的提供服务就是指通常我们提到的喘口,例如一般TELNET在23端口,ftp在对21端口,WWW在80端口或8080端口,这只是一般情况,网站管理完全可以按自己的意愿修改服务所监听的端口号。在不同服务器上提供同一种服务的软件也可以是不同,我们管这种软件叫做daemon,例如同样是提供FTP服务,可以使用wuftp、proftp,ncftp等许多不同种类的daemon。确定daemon的类型版本也有助于黑客利用系统漏洞攻破网站。
另外需要获得的关于系统的信息就是一些与计算机本身没有关系的社会信息,例如网站所属公司的名称、规模,网络管理员的生活习惯、电话号码等。这些信息看起来与攻击一个网站没有关系,实际上很多黑客都是利用了这类信息攻破网站的。例如有些网站管理员用自己的电话号码做系统密码,如果掌握了该电话号码,就等于掌握了管理员权限进行信息收集可以用手工进行,也可以利用工具来完成,完成信息收集的工具叫做扫描器。用扫描器收集信息的优点是速度快,可以一次对多个目标进行扫描。
折叠攻击的实施阶段
1.获得权限
当收集到足够的信息之后,攻击者就要开始实施攻击行动了。作为破坏性攻击,只需利用工具发动攻击即可。而作为入侵性攻击,往往要利用收集到的信息,找到其系统漏洞,然后利用该漏洞获取一定的权限。有时获得了一般用户的权限就足以达到修改主页等目的了,但作为一次完整的攻击是要获得系统最高权限的,这不仅是为了达到一定的目的,更重要的是证明攻击者的能力,这也符合黑客的追求。
能够被攻击者所利用的漏洞不仅包括系统软件设计上的安全漏洞,也包括由于管理配置不当而造成的漏洞。前不久,因特网上应用最普及的着名www服务器提供商Apache的主页被黑客攻破,其主页面上的Powered by Apache图样(羽毛状的图画)被改成了Powered byMicrosoft Backoffice的图样,那个攻击者就是利用了管理员对Webserver用数据库的一些不当配置而成功取得最高权限的。
当然大多数攻击成功的范例还是利用了系统软件本身的漏洞。造成软件漏洞的主要原因在于编制该软件的程序员缺乏安全意识。当攻击者对软件进行非正常的调用请求时造成缓冲区溢出或者对文件的非法访问。其中利用缓冲区溢出进行的攻击最为普遍,据统计80%以上成功的攻击都是利用了缓冲区溢出漏洞来获得非法权限的。关于缓冲区溢出在后面用专门章节来作详细解释。
无论作为一个黑客还是一个网络管理员,都需要掌握尽量多的系统漏洞。黑客需要用它来完成攻击,而管理员需要根据不同的漏洞来进行不同的防御措施。了解最新最多的漏洞信息,可以到诸如Rootshell、Packetstorm、Securityfocus等网站去查找。
2.权限的扩大
系统漏洞分为远程漏洞和本地漏洞两种,远程漏洞是指黑客可以在别的机器上直接利用该漏洞进行攻击并获取一定的权限。这种漏洞的威胁性相当大,黑客的攻击一般都是从远程漏洞开始的。但是利用远程漏洞获取的不一定是最高权限,而往往只是一个普通用户的权限,这样常常没有办法做黑客们想要做的事。这时就需要配合本地漏洞来把获得的权限进行扩大,常常是扩大至系统的管理员权限。
只有获得了最高的管理员权限之后,才可以做诸如网络监听、打扫痕迹之类的事情。要完成权限的扩大,不但可以利用已获得的权限在系统上执行利用本地漏洞的程序,还可以放一些木马之类的欺骗程序来套取管理员密码,这种木马是放在本地套取最高权限用的,而不能进行远程控制。例如一个黑客已经在一台机器上获得了一个普通用户的账号和登录权限,那么他就可以在这台机器上放置一个假的su程序。一旦黑客放置了假su程序,当真正的合法用户登录时,运行了su,并输入了密码,这时root密码就会被记录下来,下次黑客再登录时就可以使用su变成root了。
攻击的善后工作
1.日志系统简介
如果攻击者完成攻击后就立刻离开系统而不做任何善后工作,那么他的行踪将很快被系统管理员发现,因为所有的网络操作系统一般都提供日志记录功能,会把系统上发生的动作记录下来。所以,为了自身的隐蔽性,黑客一般都会抹掉自己在日志中留下的痕迹。想要了解黑客抹掉痕迹的方法,首先要了解常见的操作系统的日志结构以及工作方式。Unix的日志文件通常放在下面这几个位置,根据操作系统的不同略有变化
/usr/adm——早期版本的Unix。
/Var/adm新一点的版本使用这个位置。
/Varflort一些版本的Solaris、 Linux BSD、Free BSD使用这个位置。
/etc,大多数Unix版本把Utmp放在此处,一些Unix版本也把Wtmp放在这里,这也是Syslog.conf的位置。
下面的文件可能会根据你所在的目录不同而不同:
acct或pacct-一记录每个用户使用的命令记录。
accesslog主要用来服务器运行了NCSA HTTP服务器,这个记录文件会记录有什么站点连接过你的服务器。
aculo保存拨出去的Modems记录。
lastlog记录了最近的Login记录和每个用户的最初目的地,有时是最后不成功Login的记录。
loginlog一记录一些不正常的L0gin记录。
messages——记录输出到系统控制台的记录,另外的信息由Syslog来生成
ecurity记录一些使用 UUCP系统企图进入限制范围的事例。
ulog记录使用su命令的记录。
utmp记录当前登录到系统中的所有用户,这个文件伴随着用户进入和离开系统而不断变化。
Utmpx,utmp的扩展。
wtmp记录用户登录和退出事件。
Syslog最重要的日志文件,使用syslogd守护程序来获得。
2.隐藏踪迹
攻击者在获得系统最高管理员权限之后就可以随意修改系统上的文件了(只对常规 Unix系统而言),包括日志文件,所以一般黑客想要隐藏自己的踪迹的话,就会对日志进行修改。最简单的方法当然就是删除日志文件了,但这样做虽然避免了系统管理员根据IP追踪到自己,但也明确无误地告诉了管理员,系统己经被人侵了。所以最常用的办法是只对日志文件中有关自己的那一部分做修改。关于修改方法的具体细节根据不同的操作系统有所区别,网络上有许多此类功能的程序,例如 zap、 wipe等,其主要做法就是清除 utmp、wtmp、Lastlog和Pacct等日志文件中某一用户的信息,使得当使用w、who、last等命令查看日志文件时,隐藏掉此用户的信息。
管理员想要避免日志系统被黑客修改,应该采取一定的措施,例如用打印机实时记录网络日志信息。但这样做也有弊端,黑客一旦了解到你的做法就会不停地向日志里写入无用的信息,使得打印机不停地打印日志,直到所有的纸用光为止。所以比较好的避免日志被修改的办法是把所有日志文件发送到一台比较安全的主机上,即使用loghost。即使是这样也不能完全避免日志被修改的可能性,因为黑客既然能攻入这台主机,也很可能攻入loghost。
只修改日志是不够的,因为百密必有一漏,即使自认为修改了所有的日志,仍然会留下一些蛛丝马迹的。例如安装了某些后门程序,运行后也可能被管理员发现。所以,黑客高手可以通过替换一些系统程序的方法来进一步隐藏踪迹。这种用来替换正常系统程序的黑客程序叫做rootkit,这类程序在一些黑客网站可以找到,比较常见的有LinuxRootKit,现在已经发展到了5.0版本了。它可以替换系统的ls、ps、netstat、inetd等等一系列重要的系统程序,当替换了ls后,就可以隐藏指定的文件,使得管理员在使用ls命令时无法看到这些文件,从而达到隐藏自己的目的。
3.后门
一般黑客都会在攻入系统后不只一次地进入该系统。为了下次再进入系统时方便一点,黑客会留下一个后门,特洛伊木马就是后门的最好范例。Unix中留后门的方法有很多种,下面介绍几种常见的后门,供网络管理员参考防范。
折叠密码破解后门
这是入侵者使用的最早也是最老的方法,它不仅可以获得对Unix机器的访问,而且可 以通过破解密码制造后门。这就是破解口令薄弱的帐号。以后即使管理员封了入侵者的当前帐号,这些新的帐号仍然可能是重新侵入的后门。多数情况下,入侵者寻找口令薄弱的未使用帐号,然后将口令改的难些。当管理员寻找口令薄弱的帐号是,也不会发现这些密码已修改的帐号。因而管理员很难确定查封哪个帐号。
Rhosts + + 后门
在连网的Unix机器中,象Rsh和Rlogin这样的服务是基于rhosts文件里的主机名使用简 单的认证方法。用户可以轻易的改变设置而不需口令就能进入。入侵者只要向可以访问的某用户的rhosts文件中输入"+ +",就可以允许任何人从任何地方无须口令便能进入这个帐号。特别当home目录通过NFS向外共享时,入侵者更热中于此。这些帐号也成 了入侵者再次侵入的后门。许多人更喜欢使用Rsh,因为它通常缺少日志能力。许多管理员经常检查 "+ +",所以入侵者实际上多设置来自网上的另一个帐号的主机名和用户名,从而不易被发现。
折叠校验和及时间戳后门
早期,许多入侵者用自己的trojan程序替代二进制文件。系统管理员便依靠时间戳和系 统校验和的程序辨别一个二进制文件是否已被改变,如Unix里的sum程序。入侵者又发展了使trojan文件和原文件时间戳同步的新技术。它是这样实现的: 先将系统时钟拨回到原文件时间,然后调整trojan文件的时间为系统时间。一旦二进制trojan文件与 原来的精确同步,就可以把系统时间设回当前时间。Sum程序是基于CRC校验,很容易骗过。入侵者设计出了可以将trojan的校验和调整到原文件的校验和的程序。MD5是被 大多数人推荐的,MD5使用的算法目前还没人能骗过。
折叠Login后门
在Unix里,login程序通常用来对telnet来的用户进行口令验证。 入侵者获取login.c的原代码并修改,使它在比较输入口令与存储口令时先检查后门口令。如果用户敲入后门 口令,它将忽视管理员设置的口令让你长驱直入。这将允许入侵者进入任何帐号,甚至是root。由于后门口令是在用户真实登录并被日志记录到utmp和wtmp前产生一个访问 的,所以入侵者可以登录获取shell却不会暴露该帐号。管理员注意到这种后门后,便用"strings"命令搜索login程序以寻找文本信息。 许多情况下后门口令会原形毕露。入侵者就开始加密或者更好的隐藏口令,使strings命令失效。 所以更多的管理员是用MD5校验和检测这种后门的。
折叠Telnetd后门
当用户telnet到系统,监听端口的inetd服务接受连接随后递给in.telnetd,由它运行 login.一些入侵者知道管理员会检查login是否被修改,就着手修改in.telnetd. 在in.telnetd内部有一些对用户信息的检验,比如用户使用了何种终端。典型的终端 设置是Xterm或者VT100.入侵者可以做这样的后门,当终端设置为"letmein"时产生一个不要任何验证的shell. 入侵者已对某些服务作了后门,对来自特定源端口的连接产生一个shell。
折叠服务后门
几乎所有网络服务曾被入侵者作过后门。 Finger,rsh,rexec,rlogin,ftp,甚至 inetd等等的作了的版本随处多是。有的只是连接到某个TCP端口的shell,通过后门口令就能获取访问。这些程序有时用刺娲□?Ucp这样不用的服务,或者被加入inetd.conf 作为一个新的服务,管理员应该非常注意那些服务正在运行,并用MD5对原服务程序做校验。
Cronjob后门
Unix上的Cronjob可以按时间表调度特定程序的运行。入侵者可以加入后门shell程序使它在1AM到2AM之间运行,那么每晚有一个小时可以获得访问。也可以查看cronjob中 经常运行的合法程序,同时置入后门。
库后门
几乎所有的UNIX系统使用共享库,共享库用于相同函数的重用而减少代码长度。一些入侵者在象crypt.c和_crypt.c这些函数里作了后门;象login.c这样的程序调用了 crypt()。当使用后门口令时产生一个shell。因此,即使管理员用MD5检查login程序,仍然能产生一个后门函数,而且许多管理员并不会检查库是否被做了后门。对于许多入侵者来说有一个问题: 一些管理员对所有东西多作了MD5校验,有一种办法是入侵者对open()和文件访问函数做后门。后门函数读原文件但执行trojan后门程序。所以当MD5读这些文件时,校验和一切正常,但当系统运行时将执行trojan版本的,即使trojan库本身也可躲过MD5校验,对于管理员来说有一种方法可以找到后门,就是静态编连MD5校验程序然后运行,静态连接程序不会使用trojan共享库。
内核后门
内核是Unix工作的核心,用于库躲过MD5校验的方法同样适用于内核级别,甚至连静态 连接多不能识别。一个后门作的很好的内核是最难被管理员查找的,所幸的是内核的 后门程序还不是随手可得,每人知道它事实上传播有多广。
文件系统后门
入侵者需要在服务器上存储他们的掠夺品或数据,并不能被管理员发现,入侵者的文章常是包括exploit脚本工具,后门集,sniffer日志,email的备分,原代码,等等!有时为了防止管理员发现这么大的文件,入侵者需要修补"ls","","fsck"以隐匿特定的目录和文件,在很低的级别,入侵者做这样的漏洞: 以专有的格式在硬盘上割出一部分,且表示为坏的扇区。因此入侵者只能用特别的工具访问这些隐藏的文件,对于普通的管理员来说,很难发现这些"坏扇区"里的文件系统,而它又确实存在。
Boot块后门
在PC世界里,许多病毒藏匿与根区,而杀病毒软件就是检查根区是否被改变。Unix下,多数管理员没有检查根区的软件,所以一些入侵者将一些后门留在根区。
隐匿进程后门
入侵者通常想隐匿他们运行的程序,这样的程序一般是口令破解程序和监听程序(sniffer),有许多办法可以实现,这里是较通用的: 编写程序时修改自己的argv[] 使它看起来象其他进程名。可以将sniffer程序改名类似in.syslog再执行,因此当管理员用"ps"检查运行进程时,出现 的是标准服务名。可以修改库函数致使"ps"不能显示所有进程,可以将一个后门或程序嵌入中断驱动程序使它不会在进程表显现。使用这个技术的一个后门例子是
amod.tar.gz :
网络通行。这些网络通行后 门有时允许入侵者通过防火墙进行访问。有许多网络后门程序允许入侵者建立某个端口号并不用通过普通服务就能实现访问。 因为这是通过非标准网络端口的通行,管理员可能忽视入侵者的足迹。 这种后门通常使用TCP,UDP和ICMP,但也可能是其他类型报文。
TCP Shell 后门
入侵者可能在防火墙没有阻塞的高位TCP端口建立这些TCP Shell后门. 许多情况下,他们用口令进行保护以免管理员连接上后立即看到是shell访问。 管理员可以用netstat 命令查看当前的连接状态,那些端口在侦听,目前连接的来龙去脉。 通常这些后门可以让入侵者躲过TCP Wrapper技术。这些后门可以放在SMTP端口,许多防火墙允许 e-mail通行的.
UDP Shell 后门
管理员经常注意TCP连接并观察其怪异情况,而UDP Shell后门没有这样的连接,所以 netstat不能显示入侵者的访问痕迹,许多防火墙设置成允许类似DNS的UDP报文的通行,通常入侵者将UDP Shell放置在这个端口,允许穿越防火墙。
ICMP Shell 后门
Ping是通过发送和接受ICMP包检测机器活动状态的通用办法之一。许多防火墙允许外界ping它内部的机器,入侵者可以放数据入Ping的ICMP包,在ping的机器间形成一个shell通道,管理员也许会注意到Ping包暴风,但除了他查看包内数据,否者入侵者不会暴露。
加密连接
管理员可能建立一个sniffer试图某个访问的数据,但当入侵者给网络通行后门加密 后,就不可能被判定两台机器间的传输内容了。

热点内容
python经典程序实例 发布:2024-05-02 09:42:07 浏览:260
酷丰c10出厂密码多少 发布:2024-05-02 09:23:33 浏览:376
开发安卓游戏需要会什么 发布:2024-05-02 09:04:22 浏览:977
无线网密码忘了手机怎么改 发布:2024-05-02 08:57:24 浏览:527
iis上传文件权限设置 发布:2024-05-02 08:56:39 浏览:232
ipad文件加密 发布:2024-05-02 08:20:30 浏览:443
粉土压缩模量 发布:2024-05-02 07:53:59 浏览:806
国都证券初始密码是多少 发布:2024-05-02 07:46:39 浏览:109
shell脚本和linux命令行 发布:2024-05-02 07:37:54 浏览:968
自己的服务器搭建微信小程序商城 发布:2024-05-02 07:36:26 浏览:426