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

算法步骤如下:

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

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

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

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

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

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

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

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

结果如下:

matlab代码如下:

clear all;close all;clc;

n=;
p=rand(n,); p=createSimplyPoly(p);
n=n+;
p(n,:)=p(,:); maxX=max(p(:,));
minX=min(p(:,));
maxY=max(p(:,));
minY=min(p(:,)); core=[minX minY; %初始化核
minX maxY;
maxX maxY;
maxX minY;
minX minY]; for i=:n
[m ~]=size(core); p_pre=p(i-,:); %多边形当前点的前一个点
p_cur=p(i,:); %多边形当前点
if i~=n %如果回到第一个点,那么下一个点则为第二个点
p_nxt=p(i+,:);
else
p_nxt=p(,:);
end k=(p_nxt()-p_cur())/(p_nxt()-p_cur()); %当前点与下一个点构成的多边形的其中一边
b=p_cur()-k*p_cur();
flag=k*p_pre()-p_pre()+b; %标记当前点的前一个点在该边的左边或右边 v1=p_pre-p_cur; %计算当期点的凹凸性
v2=p_nxt-p_cur;
r=det([v1;v2]); %大于0为凸,反之为凹 re=[];
for j=:m-
core_cur_flag=core(j,)*k-core(j,)+b; %标记当前核中的点在边的左边或右边
core_nxt_flag=core(j+,)*k-core(j+,)+b; %标记下一个核中的点在边的左边或右边
if r*core_cur_flag*flag> %当当前多边形点为凸点,且前一个点和核的点同方向或当前多边形点为凹点,且前一个点和核的点是反方向时标记该点为新核的点
re=[core(j,:);re];
end if core_cur_flag*core_nxt_flag<= %标记多边形边与核的边的交点为新核的点
if core(j,)~=core(j+,)
kbar=(core(j,)-core(j+,))/(core(j,)-core(j+,));
bbar=core(j,)-kbar*core(j,); xx=-(b-bbar)/(k-kbar);
yy=-(-bbar*k+b*kbar)/(k-kbar);
else
xx=core(j,);
yy=k*xx+b;
end
re=[xx yy;re];
end end core=re;
core(size(core,)+,:)=core(,:); %多边形第一个点和最后一个点相同
end hold on;
plot(p(:,),p(:,));
plot(core(:,),core(:,),'r')
axis equal;

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

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

参考:

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

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

  1. matlab练习程序(SUSAN检测)

    matlab练习程序(SUSAN检测) SUSAN算子既可以检测角点也可以检测边缘,不过角点似乎比不过harris,边缘似乎比不过Canny.不过思想还是有点意思的. 主要思想就是:首先做一个和原图像 ...

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

    matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram o ...

  3. matlab练习程序(构造简单多边形)

    简单多边形是指各边不相交的多边形. 首先计算出所有顶点中心位置. 然后求每个顶点与中心的极角. 再对极角进行排序. 连接排序后的点就行了. 结果如下: matlab代码如下: clear all;cl ...

  4. matlab示例程序--Motion-Based Multiple Object Tracking--卡尔曼多目标跟踪程序--解读

    静止背景下的卡尔曼多目标跟踪 最近学习了一下多目标跟踪,看了看MathWorks的关于Motion-Based Multiple Object Tracking的Documention. 官网链接:h ...

  5. matlab练习程序(多边形顶点凹凸性)

    生成简单多边形后,有时还需要对多边形各顶点的凹凸性做判断. 先计算待处理点与相邻点的两个向量,再计算两向量的叉乘,根据求得结果的正负可以判断凹凸性. 结果为负则为凹顶点,为正则为凸顶点. 凹顶点用o表 ...

  6. matlab练习程序(透视投影,把lena贴到billboard上)

    本练习程序是受到了这个老外博文的启发,感觉挺有意思,就尝试了一下.他用的是opencv,我这里用的是matlab. 过去写过透视投影,当时是用来做倾斜校正的,这次同样用到了透视投影,不过更有意思,是将 ...

  7. matlab练习程序(射线法判断点与多边形关系)

    依然是计算几何. 射线法判断点与多边形关系原理如下: 从待判断点引出一条射线,射线与多边形相交,如果交点为偶数,则点不在多边形内,如果交点为奇数,则点在多边形内. 原理虽是这样,有些细节还是要注意一下 ...

  8. matlab练习程序(多圆交点)

    最近总是对计算几何方面的程序比较感兴趣. 多圆求交点,要先对圆两两求交点. 有交点的圆分为相切圆和相交圆. 相切圆求法: 1.根据两圆心求直线 2.求公共弦直线方程 3.求两直线交点即两圆切点. 相交 ...

  9. matlab练习程序(矩形变换为单连通形状)

    变换使用的模板必须是单连通的,而且模板中心必须在模板内,如果在模板中打个结或是月牙形,这里的程序就处理不了了. 虽然非单连通模板也有办法处理,不过不是这里要讨论的. 这里用到的方法和矩形变换为圆那片文 ...

随机推荐

  1. Graph Valid Tree

    Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), ...

  2. CEF3开发者系列之外篇——IE中JS与C++交互

    使用IE内核开发客户端产品,系统和前端页面之间的交互,通常给开发和维护带来很大的便利性.但操作系统和前端之间的交互却是比较复杂的.具体来说就是脚本语言和编译语言的交互.在IE内核中html和css虽然 ...

  3. iOS 在UITableViewCell中加入自定义view时view的frame设定注意

    由于需要重用同一个布局,于是在cellForRowAtIndexPath中把自定义view加在了cell上,我是这样设定view的frame的 var screenFrame = UIScreen.m ...

  4. 表现层的设计(一)——常用的模式、Json与DTO

    上几篇博文介绍了 业务逻辑层和数据访问层,我认为写博文的作用主要是向业界的读者交流一种思想,点到为止,至于学习架构设计,通过几篇博文是讲不清楚的,还需要[基础]扎实的情况下,[反复]研究[权威]的书籍 ...

  5. codeforces 557B. Pasha and Tea 解题报告

    题目链接:http://codeforces.com/problemset/problem/557/B 题目意思:有 2n 个茶杯,规定第 i 个茶杯最多只能装 ai 毫升的水.现在给出 w 毫升的水 ...

  6. Android屏幕适配dp、px两套解决办法

    "又是屏幕适配,这类文章网上不是很多了吗?" 我也很遗憾,确实又是老问题.但本文重点对网上的各种方案做一个简短的总结,和具体使用方法. 若想了解具体Android设备适配的前世因果 ...

  7. 【leetcode】Count Primes(easy)

    Count the number of prime numbers less than a non-negative number, n 思路:数质数的个数 开始写了个蛮力的,存储已有质数,判断新数字 ...

  8. struts2.0整合json

    框架:struts2.0+hibernate2+spring 今天写代码时,需要用到json,我就直接加了两个jar包:json-lib-2.1-jdk15.jar,struts2-json-plug ...

  9. .NET微信公众号开发-1.0初始微信公众号

    一.前言 微信公众号是开发者或商家在微信公众平台上申请的应用账号,该帐号与QQ账号互通,通过公众号,商家可在微信平台上实现和特定群体的文字.图片.语音.视频的全方位沟通.互动 .形成了一 种主流的线上 ...

  10. Stanford大学机器学习公开课(二):监督学习应用与梯度下降

    本课内容: 1.线性回归 2.梯度下降 3.正规方程组   监督学习:告诉算法每个样本的正确答案,学习后的算法对新的输入也能输入正确的答案   1.线性回归 问题引入:假设有一房屋销售的数据如下: 引 ...