Matlab 求xAx=b特征值,matlab练习程序(简单多边形的核)

还是计算几何, 多边形的核可以这样理解:这个核为原多边形内部的一个多边形,站在这个叫核的多边形中,我们能看到原多边形的任何一个位置。

算法步骤如下:

1.根据原多边形最大和最小的x,y初始化核多边形,就是个矩形。

2.计算多边形当前处理的点的凹凸性。

3.用当前点与其后继点构成直线,判断当前点的前驱点在该直线的左边或右边。

4.用该直线将原核多边形分为两个部分,选择其中一个部分作为处理下一个点将用到的核,选择的依据有以下两点:

1)如果当前点为凸点,那么选择的核与3步中前驱点的所在方向相同。

2)如果当前点为凹点,那么选择的核与3步中前驱点的所在方向相反。

在编程中正好是三个标记连乘为正。

5.使用新的核,计算下一个点,循环第2步直到遍历所有点。

结果如下:

20190101142850213399.jpg

matlab代码如下:

clear all;close all;clc;

n=20;

p=rand(n,2);

p=createSimplyPoly(p);

n=n+1;

p(n,:)=p(1,:);

maxX=max(p(:,1));

minX=min(p(:,1));

maxY=max(p(:,2));

minY=min(p(:,2));

core=[minX minY; %初始化核

minX maxY;

maxX maxY;

maxX minY;

minX minY];

for i=2:n

[m ~]=size(core);

p_pre=p(i-1,:); %多边形当前点的前一个点

p_cur=p(i,:); %多边形当前点

if i~=n %如果回到第一个点,那么下一个点则为第二个点

p_nxt=p(i+1,:);

else

p_nxt=p(2,:);

end

k=(p_nxt(2)-p_cur(2))/(p_nxt(1)-p_cur(1)); %当前点与下一个点构成的多边形的其中一边

b=p_cur(2)-k*p_cur(1);

flag=k*p_pre(1)-p_pre(2)+b; %标记当前点的前一个点在该边的左边或右边

v1=p_pre-p_cur; %计算当期点的凹凸性

v2=p_nxt-p_cur;

r=det([v1;v2]); %大于0为凸,反之为凹

re=[];

for j=1:m-1

core_cur_flag=core(j,1)*k-core(j,2)+b; %标记当前核中的点在边的左边或右边

core_nxt_flag=core(j+1,1)*k-core(j+1,2)+b; %标记下一个核中的点在边的左边或右边

if r*core_cur_flag*flag>0 %当当前多边形点为凸点,且前一个点和核的点同方向或当前多边形点为凹点,且前一个点和核的点是反方向时标记该点为新核的点

re=[core(j,:);re];

end

if core_cur_flag*core_nxt_flag<=0 %标记多边形边与核的边的交点为新核的点

if core(j,1)~=core(j+1,1)

kbar=(core(j,2)-core(j+1,2))/(core(j,1)-core(j+1,1));

bbar=core(j,2)-kbar*core(j,1);

xx=-(b-bbar)/(k-kbar);

yy=-(-bbar*k+b*kbar)/(k-kbar);

else

xx=core(j,1);

yy=k*xx+b;

end

re=[xx yy;re];

end

end

core=re;

core(size(core,1)+1,:)=core(1,:); %多边形第一个点和最后一个点相同

end

hold on;

plot(p(:,1),p(:,2));

plot(core(:,1),core(:,2),‘r‘)

axis equal;

createSimplyPoly函数在这里,因为生成简单多边形策略的问题,这里几乎所有的多边形都会有核存在的。

部分可能除0的地方没有处理。

参考:

关注公众号: MATLAB基于模型的设计 (ID:xaxymaker) ,每天推送MATLAB学习最常见的问题,每天进步一点点,业精于勤荒于嬉。

20190101142850676260.jpg

打开微信扫一扫哦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值