凸壳算法2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

离散点集多层凸壳嵌套的建立算法 2
任务:1。

逐步生成多层凸壳嵌套
2.实时记录当前凸壳点的地址下标于一个地址串,用坐标冲零法消去外层凸壳坐标
点。

在形成内层点集时,要滤掉零坐标点。

算法:1。

极值点肯定是凸点。

2.从一个极值点(XMIN,YA )出发,求出与该点相关的两个最大夹角点:
YA 之上的一点为凸壳终止条件点 PEND ;
YA 之下的一点为当前凸壳的第2点,借此形成第一个凸壳边;
3.从第一边开始,反时针方向求其最大夹角点为下一个凸壳点,直到下一个凸壳点
为点PEND 时为止。

一、生成离散点数据集:N ,{x
i ,y i }
二、将离散点集读入数组 N ,三、 设置当前凸壳多边形顶点的原数组序号于 IRE CT( )
四、由外向内逐层生成凸壳:45 若总点数N 为0,则结束。

若总点数N 为1,则绘一点符,结束。

若总点数N 为2,则绘一直线,结束。

若总点数N 为3,则绘一三角形,结束。

(1) 求四个方向的坐标极值:XMIN,YA; XB, YMIN; XMAX,YC; XD, YMAX
并记下最左点的点号于 IA
(2) 过A 点作纵坐标轴矢量 (XMIN,YA ),(XMIN,YMAX)
(3) 求与纵轴矢量的最小夹角矢量点PEND
最小夹角初值:ALFMIN =99
初始辅助矢量(按反时针方向):X1=XMIN
Y1=YMAX
X2=XMIN P
Y2=YA PEND
ax=(X1-X2) ay=(Y1-Y2) XMIN ,YA P1 (4) 通过扫描判别以确定 PEND
DO 100 I=1,N
X3=X(I) P2
Y3=Y(I)
IF(X3.EQ.XMN.AND.Y3.EQ.YA) GOTO 100
BX=(X3-X2)
BY=(Y3-Y2)
A1=AX*BX+AY*BY
S1=SQRT(AX**2+AY**2)
S2=SQRT(BX**2+BY**2)
ARCCOS=A1/S1/S2 AA=AMIN1(1.,ARCCOS)
ALF=ACOS(AA)
IF(ALF.LT.ALFMIN) THEN
ALFMIN=ALF
A=X(I)
B=Y(I)
III=I
ENDIF
100CONTINUE
最小夹角点PEND 的坐标:
XEND=A
YEND=B
(5)最大夹角矢量点P2 点的确定,形成初始矢量 P1 P2:X1=XMN
Y1=YMX
X2=X1
Y2=YA
XX(1)=X2
YY(1)=Y2
IRECT(1)=IA
K=1
IA 为最左点的点号; K 为凸壳点计数器
通过扫描判断,确定与初始矢量构成最大夹角的下一个矢量端点DO 2000 II=1,1000
最大夹角初值:ALFMAX=-4.
AX=(X1-X2)
AY=(Y1-Y2)
DO 1000 I=1,N
排除全部已确定的凸壳点
DO 200 J=1,K
IF(X(I).EQ.XX(J).AND.Y(I).EQ.YY(J)) GOTO 1000
200 CONTINUE
X3=X(I)
Y3=Y(I)
BX=(X3-X2)
BY=(Y3-Y2)
A1=AX*BX+AY*BY
S1=SQRT(AX**2+AY**2)
S2=SQRT(BX**2+BY**2)
ARCCOS=A1/S1/S2
AA=AMIN1(1.,ARCCOS)
ALF=ACOS(AA)
IF(ALF.GT.ALFMAX) THEN
ALFMAX=ALF
A=X(I)
B=Y(I)
III=I
ENDIF
1000 CONTINUE
新增凸壳点及其点号 III :
K=K+1
IRECT(K)=III
XX(K)=A
YY(K)=B
新增凸壳点是否到达终止条件点 PEND(Xend,Yend)
若是: IF(A.EQ.XEND.AND.B.EQ.YEND) THEN
K=K+1
XX(K)=XX(1)
YY(K)=YY(1)
GOTO 2100
ENDIF
若否:变当前矢量为初始矢量:
X1=X2
Y1=Y2
X2=A
Y2=B
AX=(X1-X2)
AY=(Y1-Y2)
2000 CONTINUE
2100 绘制当前凸壳多边形
根据所记录的当前凸壳点在原数组的下标串,对相应的坐标点冲零:DO 2500 I=1,K-1
IREC=IRECT(I)
X(IREC)=0.
Y(IREC)=0.
2500 CONTINUE
形成内部新的非零离散点集 N,X(),Y():
K=0
DO 2600 I=1,N
IF(X(I).EQ.0..AND.Y(I).EQ.0.) GOTO 2600
K=K+1
X(K)=X(I)
Y(K)=Y(I)
2600 CONTINUE
N=K
3000 CONTINUE
STOP。

相关文档
最新文档