请教 凸壳判断:递归函数+超出矩阵维
我想用下面的函数消去生成的随机多边形的凹点,使其成为凸多边形。其中用到了递归函数。可是总是说我超出矩阵维!不知道是不是该函数的问题?!该子函数的代码如下:
function =mydeleteconcave(S,R,n,x,y)
if S(n)>4 % 如果边数S(n)<=4,肯定为凸多边形
for i=4:length(x)
triangle1=det()
triangle2=det()
if triangle1.*triangle2>0
continue
else
x(:,i-1)=[];y(:,i-1)=[];R(:,i-1)=[];S(n)=S(n)-1; % 如果第i点为凹点,则消去第i-1点
=mydeleteconcave(S,R,n,x,y);
end
end
end
**: S为多边形的边数;
R为以多边形内某点为心和各顶点形成的“半经”;
n表示生成的多边形个数;
x,y为第n个多边形的顶点坐标。
运行时总是显示:
??? Index exceeds matrix dimensions.
Error in ==> E:\matlab6.5\work\convexpolygon.m (myreuse)
On line 154==> tri1=det()
Error in ==> E:\matlab6.5\work\convexpolygon.m
On line 45==> =myreuse(S,R,n,x,y)
恳请各位高人指点迷津,小弟感激不尽!
[ 本帖最后由 canglang 于 2007-5-19 22:15 编辑 ] 算法描述:
1.(x,y)为原始多边形的顶点坐标集p1,p2,p3,...
2.按逆序排序各顶点
3.按序连线成一多边形
4.i=4,向前倒查,若p4,p2,p3构成的三角形与p3,p2,p1构成的三角形面积之乘积大于0,继续查下去,否则,删去第i-1点,并从头开始重新倒查(i=4,向前倒查,...)
5.最后得到凸壳的各个顶点 4边形也可能是凹多边形。
系统提示的错误根本不在你贴出的程序段内.
推荐你debug 慢慢看矩阵的形状. 原帖由 canglang 于 2007-5-19 22:12 发表 http://www.chinavib.com/forum/images/common/back.gif
我想用下面的函数消去生成的随机多边形的凹点,使其成为凸多边形。其中用到了递归函数。
可是总是说我超出矩阵维!不知道是不是该函数的问题?!该子函数的代码如下:
function =mydeleteconcav ...
使用变量前先预分配空间,具体请参阅 置顶贴:聚宝盆 中的精华贴 谢谢关注与提示!谢谢
对,4边形也可能是凹的!!
[ 本帖最后由 canglang 于 2007-5-20 21:06 编辑 ] [quote]原帖由 eight 于 2007-5-19 23:28 发表 http://www.chinavib.com/forum/images/common/back.gif
“使用变量前先预分配空间,具体请参阅 置顶贴:聚宝盆 中的精华贴 “
S,R,n,x,y是调用此程序之前得到的已知值(S,n)或向量(R,x,y)!
triangle1和triangle2的值在每轮循环时自动替换。因此,对于该函数的错误提示我实在
是不知所措,因为我认为 这个子函数本身没有问题。可是在没有运用这个函数之前
我用的是如下代码:
%c=[];
%if S(n)>4
% for i=4:length(x)
% tri1=det();
% tri2=det();
% if tri1.*tri2>0
% continue
% else
% c=;
% end
% end
%end
%x(:,c)=[];y(:,c)=[];
%S(n)=length(x)-1;R(:,c)=[];
**:**: S为多边形的边数;
R为以多边形内某点为心和各顶点形成的“半经”;
n表示生成的多边形个数;即第n个多边形
x,y为第n个多边形的顶点坐标。
这段代码能够成功运行,只是该段代码在记下某凹点下标后不能重新开始该段代码,而是继续下轮循环,
故用了=mydeleteconcave(S,R,n,x,y),于是才产生了错误!
[ 本帖最后由 canglang 于 2007-5-20 22:48 编辑 ]
页:
[1]