matlab练习程序(简单多边形的核)

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

算法步骤如下:

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

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

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

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

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

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

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

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

结果如下:

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的地方没有处理。

参考:

http://wenku.baidu.com/view/65c7d523192e45361066f5e7.html

时间: 2024-12-26 05:48:26

matlab练习程序(简单多边形的核)的相关文章

matlab练习程序(生成黑白网格)

提供了两种生成方法,一个是自己编程实现,比较灵活:另一个是调用系统的checkerboard函数,似乎只能生成8*8网格. 至于用途,也许可以用来下国际象棋. 自己函数生成: 系统函数生成: 代码如下: clear all;close all;clc h=256; w=256; n=8; img=zeros(h,w); flag=1; for y=1:h for x=1:w if flag>0 img(y,x)=255; end if mod(x,int8(w/n))==0 flag=-flag

matlab练习程序(旋转、径向模糊)

还记得过去写过径向模糊,不过当时效果似乎不好. 这次效果还可以,程序中用的算法是: 1.求当前处理点和图像中心点之间的距离r与角度ang; 2.通过对r的修改得到径向模糊. 3.通过对ang的修改得到旋转模糊. 一看代码就能全部明白,不仔细解释了. 原图如下: 处理后效果: matlab代码如下: clear all;close all;clc img=imread('lena.jpg'); [h w]=size(img); imshow(img) imgn=zeros(h,w); for y=

matlab练习程序(弧形投影)

这个其实也算是圆柱体投影了,不过上一篇文章是从正面看,得到的是凸形的结果,而这个是从反面看,得到的是凹形的结果. 计算公式就不写了,大致介绍一下,计算公式中关于x坐标求法和上篇一样,y坐标则正好是上篇公式的反变换,结合上篇公式代码和本篇的代码,应该都不是很难理解的. 下面是hfOV为pi/2时得到的变换结果: 原图: 处理后结果: matlab代码如下: clear all; close all;clc; img=imread('lena.jpg'); [h,w]=size(img); hfOV

(转)matlab练习程序(HOG方向梯度直方图)

matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram of Oriented Gradient)方向梯度直方图,主要用来提取图像特征,最常用的是结合svm进行行人检测. 算法流程图如下(这篇论文上的): 下面我再结合自己的程序,表述一遍吧: 1.对原图像gamma校正,img=sqrt(img); 2.求图像竖直边缘,水平边缘,边缘强度,边缘斜率. 3.

【转载】matlab练习程序(图像Haar小波变换)

matlab练习程序(图像Haar小波变换) 关于小波变换我只是有一个很朴素了理解.不过小波变换可以和傅里叶变换结合起来理解. 傅里叶变换是用一系列不同频率的正余弦函数去分解原函数,变换后得到是原函数在正余弦不同频率下的系数. 小波变换使用一系列的不同尺度的小波去分解原函数,变换后得到的是原函数在不同尺度小波下的系数. 不同的小波通过平移与尺度变换分解,平移是为了得到原函数的时间特性,尺度变换是为了得到原函数的频率特性. 小波变换步骤: 1.把小波w(t)和原函数f(t)的开始部分进行比较,计算

matlab练习程序(波纹扭曲)

其实就是用sin或cos对x,y坐标进行变换,处理的时候依然是反向变换. 类似的,用不同的函数能得到不同的扭曲效果,比如log,1/x,exp等等. 效果如下: 代码如下(还给出了如何生成gif图片的代码): clear all;close all;clc; img=imread('lena.jpg'); [h w]=size(img); wave=[10,100]; %[幅度,周期] newh=h+2*wave(1); neww=w+2*wave(1); rot=0; for i=1:10 i

matlab练习程序(圆柱投影)

圆柱投影就是将一张二维的图像投影到三维的圆柱体上,不过在显示图像的时候依然是以二维的形式给出. 投影最重要的步骤就是计算投影变换公式,和图像旋转类似,只要得到变换公式,再依照公式进行代码编写就很容易了. 这里就不写投影变换公式的推导过程了,直接给出变换公式.公式分为正变换和反变换,编程时,反变换公式通常更有用. 正变换公式如下: x'=f\cdot\arctan\left({\frac{x-\frac{W}{2}}{f}}\right)+f\cdot\arctan\left({\frac{W}{

matlab练习程序(毛玻璃模糊)

算是一种特效模糊方式吧,算法原理就是用邻域随机像素代替当前所处理的像素就可以了. 效果如下图所示: 原图: 处理后结果: matlab代码如下: clear all; close all;clc; img=imread('lena.jpg'); [h,w]=size(img); imgn=img; n=3; %模糊直径 for i=1:h for j=1:w offsetX=n*rand()-n/2; %邻域随机值代替当前像素 offsetY=n*rand()-n/2; y=floor(i+of

matlab练习程序(弧形、圆柱投影的复原)

前一段介绍了从矩形图像到圆柱的正向投影,看这里和这里.今天介绍如何从已经投影的图像反映射到原图像上. 本来此种变换一定是需要数学公式的,不过这里只是用了一个很简单的方式来完成反映射. 具体就把每一列有像素数据的长度拉伸到原图像的高就行了. 原图像是这样: 处理后: 看着感觉还可以,不过这样显然是不合数学公式的,和最原始的图比较一下就看出来差别了: matlab代码如下: clear all;close all;clc; img=imread('re.bmp'); [h w]=size(img);