精华内容
下载资源
问答
  • 2018-03-29 23:42:51

    题目:对一个凸多边形,通过若干条不相交的对角线,把这个凸多边形剖分成若干个三角形,输入多边形边数n,输出不同剖分方案数。当n=5时,方案数为5

    递推公式:C(n)=(4*n-10)/(n-1)*C(n-1)   (我也不会推....)

    #include <iostream>
    #include <cstdio>
    
    using namespace std;
    //公式Cn=(4n-10)/(n-1)*Cn-1
    //边界n=3
    int f(int n)
    {
        if(n==3) return 1;
        else return (4*n-10)*f(n-1)/(n-1);
        
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        printf("%d\n",f(n));
    }
    

    更多相关内容
  • 多边形分解成三角形算法, 耳切法

    千次阅读 2019-11-08 17:08:11
    图6.1展示了一个嵌套多边形构成的树结构,可以分割使用耳切法 树形结构展示如下: 存储当前树节点的数据结构可以定义如下: 解析当前树形结构的流程算法大致如下: 函数MakeSimple封装了获取一个内多边形和其外...

    https://blog.csdn.net/zzq61974/article/details/87635763

    https://www.cnblogs.com/xignzou/p/3721494.html

    https://blog.csdn.net/u012138730/article/details/79927778

     

    内容提要

    1、简介

    2、Ear Clipping方法

    3、含有岛洞的多边形

    4、查找相互可见点

    5、含有多个岛洞的多边形

    6、嵌套多边形

     

    1、简介

    将简单多边形转换成一组由同样顶点组成的三角形集合是计算机图形学中的一个经典问题。问题中,简单多边形是指由一组有序顶点组成的,点V0~点Vn-1。相邻的顶点之间通过边(Vi, Vi-1)连接,并且边(Vn-1,V0)连接起始点。每个顶点被两条边所共享,而边的所有交点都是顶点。图1.1的示例则是说明

    图中,左边的多边形是个简单多边形,中间的多边形点1被四条边共享,不符合定义的条件,不算是简单多边形,右侧的多边形中边14,边02的交点不是我们定义的顶点之一,因此该图形也不符合简单多边形的定义。

     

    图1.1 简单多边形示例

    如果一个多边形是简单多边形,当你延长一条边的时候,内部有界区域中总是在边的一侧。假设多边形顶点逆时针排序,那么当你延长边的时候,内部指的便是你的左边。 我们图1.1中的简单多边形顶点顺序使用的便是逆时针的方法。

           将一个简单多边分解成三角形集合的方法称之为多边形的三角形化(triangulation of the Polygon)。几何学的知识告诉我们,由n个顶点组成的简单多边形总是可以分解成n -2个三角形。解决该问题的方法比较多,他们共同的特点就是算法的复杂度渐近阶随着n的增长没有约束(Various algorithms have been developed for triangulation, each characterized by its asymptotic order as n grows without bound.)。最简单的分割算法是耳剪裁(EarClipping),正是本文档中所要描述的算法。EarClipping的算法复杂度O(n2_n平方),虽然也存在效率更高的算法,但是被其他组织严格使用并没有公开。水平分解成梯形随后被自己单调三角多边形的鉴定阳离子是一种复杂度为O(n log n)的算法[ 1 , 3 ] 。使用增量的改进随机算法产生一个O ( n日志? n),其中记录? n为重对数函数[ 5 ] 。此功能是电子?作为各自一个常数非常大的n ,你会在实践中看到的,所以对于所有的实际目的的随机方法是线性时间。理论存在的复杂度为O(n)的算法,比较复杂,到目前依旧没有看到具体的公开实现。

    2、Ear Clipping方法

    简单多边形的耳朵,是指由连续顶点V0,V1和V2组成的内部不包含其他任意顶点的三角形。在计算机几何术语中,v0与V2之间的连线 称之为多边形的对角线,点V1称之为耳尖。虽然你可以将耳尖放到三角形的任意一个顶点上,但是我们认为三角形包含一个耳尖。一个由四个顶点(或者更多)组成的多变形至少有两个不重叠的耳尖。这个特性提供了一个通过递归来解决三角化分割的方法。针对由N个定点组成的多边形,找到其耳尖,移除唯一耳尖上的顶点,此时剩余顶点组成了一个n-1个顶点的简单多边形。我们重复这个操作知道剩余三个顶点。这样的话会产生一个复杂度为O(N3)的算法

     

    随着一些细节改进,耳朵消除可以在O ( N2)的时间来完成。第一步是将多边形使用双向链表存储,这样可以快速的移除耳朵。列表的构建复杂度是O(n),第二部是遍历顶点寻找耳朵。对于每一个顶点Vi和围绕该顶点的三角形<Vi-1,Vi,Vi+1>,(总长度为N,所以Vn=V0,兵器V-1=Vn-1),测试其他顶点是否在当前三角形中,如果有一个顶点在三角形里面,则不是耳朵,只有都不在的情况,才算是找到一个耳朵。具体实现的时候我们可以考虑以下因素让这个算法更为高效。当发现有一个点在三角形里面的时候便可以开始放弃当前测试。一个凹拐角其两边的夹角大于180,而一个凸拐角两边夹角小于180。存储多边形的数据结构使用四个链表,具体使用数组而不是标准的动态需要分配合释放存储器的链表。多边形的顶点存储在在一个循环链表中,凹顶点和凸顶点存储在线型表中,耳尖存储在一个循环列表中。

     

    一旦凸顶点和耳朵的链表构建成功,每次遍历都会移除一个耳朵。假设当前Vi是个耳朵并且被移除掉,那么边结构的相邻点Vi-1,Vi+1则会发生变化,如果相邻点是凸顶点,那么依旧保持凸点,如果相邻点是个耳朵,那么当Vi被移除后则不一定能保持耳朵的状态,如果相邻点是个凹点,那么他则有可能变为一个凸点甚至是耳朵。因此当移除顶点Vi后,如果相邻点是凸点,则必须遍历相关顶点,通过遍历查看是否包含其他点,来测试它是否是一个耳朵。我们有n个耳朵,每一次更新都会触发一个耳朵检测,每次过程中更新O(n),所以移除进程的复杂度是O(n2)。

     

    图2.1 右侧多边形展示了左侧耳朵2,3,4被移除后的的效果

           下面的示例使用图1.1中的简单多边形,具体展示算法的实现和构建。初始够将的时候凸顶点集合C={0,1,3,4,6,9},初始凹顶点集合R={2,5,7,8},初始的耳朵集合E={3,4,6,9},遍历,当顶点3被移除的时候,其对应的耳朵是三角形T0=<2,3,4>。图2.1展示了改进后的多边形效果。相邻点2是个凹节点,变化后依旧是凹的,顶点4之前是个耳朵,现在依旧耳朵,所以凹节点结合R保持不变,耳朵集合现在变成了E={4,6,9}(3已经被移除)。

           继续移除点点4,此时的三角形对应是T1=<2,4,5>。图2.2展示了变化后的效果。

    图 2.2 移除三角形<2,4,5>后的效果

    相邻顶点2依旧保持凹节点,相邻点5之前是凹顶点,现在变为了凸顶点,经过测试最终发现它是个耳朵。因此定点列表最终的变化结果是,凹节点几何R={2,7,8},耳朵集合E={5,6,9}(移除4,添加了新的5)。

    如果一处顶点5,此时对应的三角形是T2=<2,5,6>,图2.3展示了变化后的效果。

    图2.3 移除耳朵<2,5,6>后的效果

           相邻顶点2起初是个凹节点,现在变为另一个图节点,从图上有点不大容易看出顶点7其实是位于三角形<1,2,6>中间的,所以2不是个耳朵。顶点6起初是个耳朵,现在依旧。操作完成之后各顶点列表中,凹节点集合R={7,8}(移除了2),耳朵集合E={6,9}(移除了5)。

           继续,移除顶点6,此时对应的三角形是T3=<2,6,7>。图2.4是变化后的前后对比效果。

    图2.4移除耳朵<2,6,7>

    相邻点2是图节点,保持依旧,但是它由一个非耳朵变成了耳朵节点。相邻顶点7依旧是个凹节点,因此凹节点集合保持不变。各队列结果,耳朵集合E={9,2}(添加2移除6),耳朵列表这样写是因为新耳朵的加入是在移除了旧的耳朵操作之后(先来后到),在移除旧耳朵之前,它忍让可以被当做是列表的第一个元素(循环列表)。删除操作设置第一项是下一个指向的老耳朵,而不是以前的值。

           移除顶点9,对应的三角形T4=<8,9,0>。图2.5展示了操作前后的多边形对比

     

           相邻顶点8是个凹节点,操作后编程了一个凸点,并且是一个耳朵。相邻点0是个凸点,保持依旧,并且由非耳朵变成了耳朵。操作结束后的各队列集合如下:凹点集合R={7},耳朵集合E={0,2,8}(添加8 ,添加0,移除9,顺序按照了程序的产生方式)

           移除顶点0,对应的三角形是T5=<8,0,1>,图2.6是操作前后的多边形对比

           相邻顶点8和1都是凸节点并且保持依旧,顶点8依旧是个耳朵,顶点1依旧不是耳朵。因此凹节点集合不变,耳朵列表变为E={2,8}(移除了0)

           最后,移除耳朵2顶点,对应的三角形是T6=<1,2,7>。图2.7展示了操作前后的多边形对比。

           到现在,已经没有在需要更新的凹点和耳朵列表,到此为止我们只剩下了三个顶点,这三个顶点组成最后的三角形T7=<7,8,1>。所有的三角形分割线是如图2.8

    3、含有岛洞的多边形

    耳朵裁剪法也可以应用到包含岛洞的多边形中。考虑如图3.1所示的一个包含岛洞的多边形,他有一个外多边形和一个内洞组成。外侧多边形的定点方形和内测岛洞的顶点方向必须是相反的。如果外侧的顶点是逆时针顺序,那么内测的顶点则必须是顺时针顺序。

           图中蓝色的顶点是互相可见的,通过绘制两条双向的边连接两个蓝色的顶点,可以把图3.1转变成一个简单多边形。图3.2中显示这两天便,一条蓝色,一条红色,两条边是重叠的,这里为了看得清晰特殊标绘出来。

     

    图中通过小箭头标识出了边的方向。

           依照这种情景,互相可见的顶点必须复制到不同的数据结构中以供使用。每个数据结构存储当前点可能是凹点也可能是凸点。即使使用同一个坐标的两个点,也可能一个是凹点,一个是凸点,比如位于最下面的蓝色顶点11(18)。原始的顶点在最初的外多边形中是凹点,分割后在新的多边形中,V11与红色边相连,构成了一个凹点,与蓝色边相连构成另一个凸点。

    原始的外多边形顶点数据:

    {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}

    原始的内多边形数据

    {15,16,17}

           分割后顶点V11被复制出V18,顶点V16复制出V19,这时候的简单多边形数据如下:

    {0,1,2,3,4,5,6,7,8,9,10,11,16,17,15,19,18,12,13,14}

    新的多边形即可以使用耳朵裁剪法切割。

    4、查找相互可见点

    视觉上,图3.1我们可以直接看出顶点V11和顶点V16是两个相互可见的点。而实际上,这个多边形中存在不止一对这样的相互可见点(一个来自内多边形,一个来自外多边形)。我们需要个算法来查找一对这样的可见点。

    下面的算法便是如此。查找内多边形中x轴方向最大值的顶点,在图3.1中,这个点是V16,假设以此为原点构造左边系,沿着x轴正方向观察,该轴线可能与外对变形的边教育一点,或者直接连接到外多边形的顶点上,很大程度上,我们会获得一个边的交点。此时,这条边的两个端点则很有可能使我们所要寻找的。如果是一个独立的点点,那么便和最初的V16组成了一对相互可见点。

    下面,我们考虑在x轴正方向的最近可视点是相交边的端点。如图4.1所示:

    假设M是坐标轴的原点(实际上是顶点V16)。向量M+t(1,0)则是图中蓝色标记的x轴射线,最近的交点使用红色标记,叫做点I。最近点所在的边使用绿色标绘出来。边的结束点用一个最大的x值P,假设P点是与M对应的最近相互可视点,那么连接他们的线,与点I组成的三角形<M,I,P>使用橙色绘制如下。

    在图4.1中,P相对M可见,但是,也存在下面的这种情况,线段<M,P>与多边形其他的边相交,即P对M不可见,图4.2展示了这样的情况。

     

    灰色表示该区域位于外部多边形和内部多边形之间,橙色是其中的一部分,在图4.1中,有<M.I,P>组成的三角形全部位于(外部-内部)多边形的一部分,4.2中,外部多边形被裁剪到了多个三角形中,只有部分子集三角形才算的上是外部-内部多边形的一部分。

     

    外部多边形有四个点位于多边形<M,I,P>之间,一般来说,如果一个顶点存在于一个三角形内部,则至少有一个连接边,对于所有连接边,至少有一个是对M可见的。图4.2中,三角形内有三个连接顶点,标记为A,B,C,这样的话连接顶点A对M是可见的,因为连接他们的边<M,R>和边<1,0>之间的夹角最小。

    算法总结如下:

     

    1、寻找内部多边形x周最大值的顶点M

    2、沿X周正方向,寻找最近的相交边<Vi,Vi+1>,让其焦点设置为I,构成X轴方向对M的最近可见点

    3、如果I是一个外部顶点,则M和I相互可见,算法执行结束

    4、如果I只是边上的一个点,寻找端点中x值片的一个,设置为P

    5、寻找位于P内的其他外多边形的可连接顶点。如果所有的顶点都在<M,I,P>之外,则M与P相互可见,反正结果

    6、如果有至少一个点位于三角形<M,I,P>内部,则寻找其中的一个顶点,计算其与x轴(1,0)的夹角,夹角最小的顶点R与M构成相互可见边,算法结束

    7、在这个算法中,有可能有多个顶点同事具有最小的角度,这种情况下,寻找距离M最近的一个点即可

    5、含有多个岛洞的多边形

    一个多边形有可能包含多个岛洞,这里假设所有的岛洞都仅被外多边形包含,彼此不存在嵌套岛洞的情形,图5.1展示了这样的一个多边形。

     

    从图上可以清晰的看出,内多边形I1没有任何一个顶点与外部多边形相互可见,多边形I0则拥有多个与外部多边形相互可见的点。因此,我们可以使用前面介绍的算法,首先把I0和外部多边形拆分,合并成为一个简单多边形,这样,新形成的外多边形则和I1构成了一件简单多边形,使用耳切法分割集合。

     

    假设有多个内多边形,拥有最大X值的内部多边形则可被选中作为与外多边形合并的首选。重复这个过程知道全部成为简单多边形即可。

    6、嵌套多边形

    内多边形也可能包含一些泪如岛洞的外多边形,类如嵌套。这样导致了嵌套多边形的树形结构。根节点是最外围的外多边形,子节点则是包含在当前最外多边形内部的内多边形。每一个孙子节点,则是构成直接被最外围多边形包含的内多边形的子树,每个多边形树可以按照宽度优先去遍历。

    图6.1展示了一个嵌套多边形构成的树结构,可以分割使用耳切法

     

    树形结构展示如下:

     

    存储当前树节点的数据结构可以定义如下:

     

    解析当前树形结构的流程算法大致如下:

     

     

    函数MakeSimple封装了获取一个内多边形和其外多边形中间相互可见边的算法,通过复用他们,产生两个新边,可以生成一个新的简单多边形,这个过程要对没个内多边形不停的重复

     

    完成最终的三角划分,以便获取最终的索引顺序,来代替最初的多边形顶点定义顺序。相比原始的值,这里可能需要复制一些顶点,以便被多个三角形使用

     

    展开全文
  • 算法:凸多边形最优三角剖分

    千次阅读 多人点赞 2019-10-31 18:20:49
    (1)凸多边形的三角剖分:将凸多边形分割成互不相交的三角形的弦的集合T。 (2)最优剖分:给定凸多边形P,以及定义在由多边形的边和弦组成的三角形上的权函数w。要求确定该凸多边形的三角剖分,使得该三角剖分中诸...

    1、问题相关定义:

     (1)凸多边形的三角剖分:将凸多边形分割成互不相交的三角形的弦的集合T。
    
    (2)最优剖分:给定凸多边形P,以及定义在由多边形的边和弦组成的三角形上的权函数w。要求确定该凸多边形的三角剖分,使得该三角剖分中诸三角形上权之和为最小。
    
     凸多边形三角剖分如下图所示:
    

    在这里插入图片描述

          2、最优子结构性质:
    
     若凸(n+1)边形P={V0,V1……Vn}的最优三角剖分T包含三角形V0VkVn,1<=k<=n,则T的权为三个部分权之和:三角形V0VkVn的权,多边形{V0,V1……Vk}的权和多边形{Vk,Vk+1……Vn}的权之和。如下图所示:
    

    在这里插入图片描述

          可以断言,由T确定的这两个子多边形的三角剖分也是最优的。因为若有{V0,V1……Vk}和{V0,V1……Vk}更小权的三角剖分,将导致T不是最优三角剖分的矛盾。因此,凸多边形的三角剖分问题具有最优子结构性质。
    
         3、递推关系:
    
     设t[i][j],1<=i<j<=n为凸多边形{Vi-1,Vi……Vj}的最优三角剖分所对应的权值函数值,即其最优值。最优剖分包含三角形Vi-1VkVj的权,子多边形{Vi-1,Vi……Vk}的权,子多边形{Vk,Vk+1……Vj}的权之和。
    

    在这里插入图片描述

      因此,可得递推关系式:
    

    在这里插入图片描述

     凸(n+1)边形P的最优权值为t[1][n]。
    

    在这里插入图片描述
    在这里插入图片描述
    详细解析:
    (1)什么是凸多边形?

    如下图所示,是一个凸多边形
    在这里插入图片描述

    如下图所示,不是一个凸多边,因为v1v3连线落在了多边形的外部

    在这里插入图片描述

    凸多边形不相邻的两个顶点的连线称为凸多边形的弦

    (2)什么是凸多边形的三角剖分?

    凸多边形的三角剖分是指将一个凸多边形分割成互不相交的三角形的弦的集合。如下图所示,都是三角形的剖分,三角形的剖分有很多种:

    在这里插入图片描述

    如果我们在给定凸多边形及定义在边,弦上的权值,即任意两点之间定义一个数值作为i权值,如图所示:
    在这里插入图片描述

    三角形上权值之和是指三角形的3条边上的权值之和:

    w(vi vk vj)=|vi vk| + |vk vj | + |vi vj|

    如图所示,w(v0v1v4)=|v0v1| + |v1v4| + |v0v4| = 22+8+5=15.

    (3)什么是凸多边形最优三角剖分?

    一个凸多边形的三角剖分有很多种,最优三角剖分就是划分的各三角形上权函数之和最小的三角剖分。

    在这里插入图片描述

     凸多边形最优三角剖分满足动态规划的最优子结构性质,可以从自底向上逐渐推出整体的最优。
    
    (1)确定合适的数据结构
    
    采用二维数组weight[ ][ ]记录各个顶点之间的连接权值,二维数组t[ ][ ]存放各个子问题的最优值,二维数组s[ ][ ]存放各个子问题的最优策略。
    
    (2)初始化
    
    输入顶点数n,然后依次输入各个顶点之间的连接权值存储在二维数组weight[ ][ ]中,令n=n-1(顶点标号从v0开始),
    
    t[i][i]=0,s[i][i]=0,其中i=1,2,3,4……,n-1。
    
    (3)循环
    
    按照递归关系式计算3个顶点{v i-1,vi,vi+1}的最优三角剖分,j=i+1,将最优值存入t[i][j],同时将最优策略存入s[i][j],i=1,2,3,……,n-1。
    按照递归关系式计算4个顶点{v i-1,vi,vi+1,vi+2}的最优三角剖分,j=i+2,将最优值存入t[i][j],同时将最优策略存入s[i][j],i=1,2,3,……,n-2。
    以此类推,直到求出所有顶点{v0,v1,v2,……,vn}的最优三角剖分,并将最优值存入t[1][n],将最优策略记入s[1][n]
    (4)构造最优解
    
    根据最优决策信息数组s[ ][ ]递归构造最优解,即输出凸多边形的最优剖分的所有弦。s[1][n],表示凸多边形最优三角剖分位置。
    
    如果子问题1为空,即没有一个顶点,说明V0Vs[1][n]是一条边,不是弦,不需要输出,否则,输出该弦V0Vs[1][n]
    如果子问题2为空,即没有一个顶点,说明Vs[1][n]Vn是一条边,不是弦,不需要输出,否则,输出该弦Vs[1][n]Vn
    递归构造两个子问题{ v0,v1,v2,……,Vs[1][n] }{ Vs[1][n] ,v1,v2,……,vn },一直递归到子问题为空停止。
    

    在这里插入图片描述
    源代码:

    #include<bits/stdc++.h>
    using namespace std;
     
    const int M =1111;
    int n; //顶点数
    int s[M][M];//记录最优策略二维数组
    double t[M][M];//记录最优值二维数组
    double weight[M][M];//记录各顶点之间权值的二维数组
     
    void MinWeightTriangulation()
    {
        for (int i=1;i<=n;i++) //初始化
        {
            t[i][i]=0;
            s[i][i]=0;
        }
        for(int r=2;r<=n;r++)//r为问题规模,r=2实际上有三个点 r为当前计算的链长(子问题规模)  
        {
            for (int i=1;i<=n-r+1;i++)//n-r+1为最后一个r链的前边界  
            {
                int j=i+r-1; //计算前边界为r,链长为r的链的后边界  
                t[i][j]=t[i+1][j]+weight[i-1][i]+weight[i][j]+weight[i-1][j];//将链ij划分为A(i) * ( A[i+1:j] )这里实际上就是k=i
                //策略为k=i的情况
                s[i][j]=i;
                for (int k=i+1;k<j;k++) //枚举划分点i到j所有情况
                {
                	//将链ij划分为( A[i:k] )* (A[k+1:j])
                    double u=t[i][k]+t[k+1][j]+weight[i-1][k]+weight[k][j]+weight[i-1][j];
                    if(t[i][j]>u)
                    {
                        t[i][j]=u;
                        s[i][j]=k;
                    }
                }
            }
        }
    }
     
    void Traceback(int i,int j)  //递归求解所有子问题的弦。
    {
        if(i==j)
            return ;
        Traceback(i,s[i][j]);
        Traceback(s[i][j]+1,j);
        cout<<"三角剖分顶点:V"<<i-1<<",V"<<j<<",V"<<s[i][j]<<endl;
    }
     
    int main()
    {
        int i;
        int j;
        cout << "请输入顶点个数n:"<< endl;
        cin >> n;
        n--;
        cout << "请依次输入各顶点的连接权值:" << endl;
        for (i=0;i<=n;++i)
        {
            for (j=0;j<=n;++j)
            {
                cin >> weight[i][j];
            }
        }
        MinWeightTriangulation();
        cout << "最优三角剖分的权值和是:" << endl;
        cout << t[1][n]<< endl;
        cout << "三角剖分顶点:"<< endl;
        Traceback(1,n);
        return 0;
    }
    

    在这里插入图片描述
    在这里插入图片描述
    运行效果1:
    在这里插入图片描述
    运行效果2:在这里插入图片描述

    展开全文
  • 多边形内角和与多边形的面积公式

    千次阅读 2014-11-22 10:38:00
    多边形内角计算公式与半径无关 要已知正多边形边数为N 内角和=180(N-2) ...圆的内接三角形面积公式:(3...五边形以上的就分割成等边三角形再算 内角和公式——(n-2)*180` 我们都知道已知A(x1,y1)、B(x2,y2
    正多边形内角计算公式与半径无关
    要已知正多边形边数为N 内角和=180(N-2)
    半径为R
    圆的内接三角形面积公式:(3倍根号3)除以4再乘以R方
    外切三角形面积公式:3倍根号3 R方
    外切正方形:4R方
    内接正方形:2R方
    五边形以上的就分割成等边三角形再算
    内角和公式——(n-2)*180`
    我们都知道已知A(x1,y1)、B(x2,y2)、C(x3,y3)三点的面积公式为
    |x1 x2 x3|
    S(A,B,C) = |y1 y2 y3| * 0.5 = [(x1-x3)*(y2-y3) - (x2-x3)*(y1-y3)]*0.5
    |1 1 1 |
    (当三点为逆时针时为正,顺时针则为负的)
    对多边形A1A2A3、、、An(顺或逆时针都可以),设平面上有任意的一点P,则有:
    S(A1,A2,A3,、、、,An)
    = abs(S(P,A1,A2) + S(P,A2,A3)+、、、+S(P,An,A1))
    P是可以取任意的一点,用(0,0)时就是下面的了:
    设点顺序 (x1 y1) (x2 y2) ... (xn yn)
    则面积等于
    |x1 y1| |x2 y2| |xn yn|
    0.5 * abs( | | + | | + ...... + | | )
    |x2 y2| |x3 y3| |x1 y1|
    其中
    |x1 y1|
    | |=x1*y2-y1*x2
    |x2 y2|
    因此面积公式展开为:
    |x1 y1| |x2 y2| |xn yn|
    0.5 * abs( | | + | | + ...... + | | )=0.5*abs(x1*y2-y1*x2+x2*y3-y2*x3+...+xn*y1-yn*x1)
    |x2 y2| |x3 y3| |x1 y1| 
    下面贴一个水题

    改革春风吹满地

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 19760    Accepted Submission(s): 10100


    Problem Description
    “ 改革春风吹满地,
    不会AC没关系;
    实在不行回老家,
    还有一亩三分地。
    谢谢!(乐队奏乐)”

    话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题目,也是云里雾里,而且,还竟然来这么几句打油诗。
    好呀,老师的责任就是帮你解决问题,既然想种田,那就分你一块。
    这块田位于浙江省温州市苍南县灵溪镇林家铺子村,多边形形状的一块地,原本是linle 的,现在就准备送给你了。不过,任何事情都没有那么简单,你必须首先告诉我这块地到底有多少面积,如果回答正确才能真正得到这块地。
    发愁了吧?就是要让你知道,种地也是需要AC知识的!以后还是好好练吧...
     

    Input
    输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1, y1, x2, y2... xn, yn),为了简化问题,这里的所有坐标都用整数表示。
    输入数据中所有的整数都在32位整数范围内,n=0表示数据的结束,不做处理。
     

    Output
    对于每个测试实例,请输出对应的多边形面积,结果精确到小数点后一位小数。
    每个实例的输出占一行。
     

    Sample Input
       
    3 0 0 1 0 0 1 4 1 0 0 1 -1 0 0 -1 0
     

    Sample Output
       
    0.5 2.0
     
    代码如下:
    #include<stdio.h>
    #include<math.h>
    int main(void)
    {
        int n;
        int a[100],b[100],i,j,k;
        double s;
        while(scanf("%d",&n)!=EOF&&n)
        {
            s=0;
            i=0;
            k=n;
            while(n--)
            {
                scanf("%d%d",&a[i],&b[i]);
                i++;
            }
            a[k]=a[0];
            b[k]=b[0];
            for(i=0;i<k;i++)
                s+=(a[i]*b[i+1]-a[i+1]*b[i]);
            printf("%.1lf\n",s/2);
        }
        return 0;
    }
    这个属于计算几何的基础部分。。务必记住啊



    展开全文
  • 多边形上的最优三角剖分问题也是动态规划经典题目,此类问题基本上都是在一个给定的凸多边形上规划三角形分割,使得剖分后得到的一系列三角形的某种结果最优,比如三角形的面积之和最大(或最小),或者是三角形的...
  • 传说是古代的叙拉古国王 希伦(Heron,也称海龙)二世发现的公式,利用三角形的三条边长来求取三角形面积。但根据Morris Kline在1908年出版的著作考证,这条公式其实是阿基米德所发现,以托希伦二世的名发表(未查证)。 ...
  • 一.题目描述 通常,用多边形顶点的序列来表示一个凸多边形,即P=<v0 ,v1 ,… ,vn-1>...多边形的三角剖分是一个将多边形分割成互不重迭的三角形的弦的集合T。 如上图为一个凸多边形的两个不同
  • 给定凸多边形P,以及定义在由多边形的边和弦组成的三角形上的权函数w。要求确定该凸多边形三角剖分, 使得即该三角剖分中诸三角形上权之和为最小。 解题思路:   若凸(n+1)边形P={v0,v1,…,vn-1}的最优...
  • (1)欧拉给出的公式(n代表正多边形的边数): (2)塞格纳(Johann Andreas Segner)的公式(其中规定E2=1): 请您自行验证一下正六边形内划分出三角形的方法共有多少种(n取6时)。上面是对正多边形...
  • 我们知道任意的多边形都可以分割成多个三角形,根据以上三角形面积公式就可以求出任意多边形的面积。如图2所示的六边形顶点坐标分别为O(x0, y0),A(x1, y1),B(x2, y2),C(x3, y3),D(x4, y4), E(x5, y5...
  • 上一章虽然已经能够将纹理碎片化,但是也说了,因为算法关系,简单的固定一条边,然后依次匹配第三个顶点的作法是无法适用于凹多边形的。 作为一个阿里眼里的菜逼,之前想着这个算法应该很简单,结果网上的各种引用...
  • 思路 分治算法中的最优子结构 对输入的n个顶点来说,只用得到这n个顶点中的三个顶点,使其构成的三角形周长之和最小,其他的就啥也不用管,进行下...分割的情况1:分成了一个三角形和一个多边形 分割的情况2:分成...
  • —【动态规划】凸多边形最优三角剖分

    万次阅读 多人点赞 2013-08-04 21:15:41
    0014算法笔记——【动态规划】凸多边形最优三角剖分 ... (1)凸多边形的三角剖分:将凸多边形分割成互不相交的三角形的弦的集合T。  (2)最优剖分:给定凸多边形P,以及定义在由多边形的边和弦组成的三角形
  • 五年级数学多边形面积常错经典题 一、填空(每空1分,共13分) 1.一个平行四边形的底是14厘米,高是9厘米,它的面积是( );与它等底等高的三角形面积是( ). 2.工地上有一堆钢管,横截面是一个梯形,已知最...
  • 转载说明:本文由 风仲达 原创,如有侵权立刻删除  ... (1)凸多边形的三角剖分:将凸多边形分割成互不相交的三角形的弦的集合T。   &nbs...
  • 多边形的质心计算

    千次阅读 2019-09-27 11:41:42
    OK,第7篇运用了多边形三角剖分+向量叉积的方式计算多边形面积。初步见到了三角形剖分化繁为简的能力,这一篇算是此种算法思想的延伸——质心计算。 质心坐标怎么能和面积计算扯上关系呢? 下面来一一分解。 质心 ...
  • 给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积。 示例: 输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]] 输出: 2 解释: 这五个点如下图所示。组成的橙色三角形是最大的,面积为2...
  • 多边形分割三角形容易证得上述公式 计算面积用叉积,计算边上格点数用欧几里德算法gcd(a,b) 对于线段(x1,y1)(x2,y2)线段上的格点数为gcd(x2-x1,y2-y1) 类似的一个题 用到了欧拉函数 求坐标系内的不同整数...
  • 给定一个n边形,可以用不交叉的直线将多边形划分成多个三角形,给多边形顶点从1到n编号,问有多少种划分方法? 显然; 当n=3时,有一种划分方法 当n=4时,有两种划分方法 当n=5时,有5种划分方法 ........ ...
  • 三角形面积公式

    2014-04-29 17:22:25
    1.已知三角形底a,高h...已知三角形三边a,b,c,则 (海伦公式)(p=(a+b+c)/2) S=sqrt[p(p-a)(p-b)(p-c)] =sqrt[(1/2)(a+b+c)(a+b-c)(a+c-b)(b+c-a)] =√2/2sqrt[(a+b+c)(a+b-c)(a+c-b)(b+c-a)] 3.已知三角形两边a...
  • 多边形的面积

    2019-09-20 17:50:04
    这是一道典型的求一个凸多边形面积的题,对于求解凸多边形面积,通常的思路就是将该多边形分割成多个可解的简单多边形,例如三角形或者矩形。 对于连续和非连续的分布,分别可以采用积分法和三角形点分割的方式进行...
  • 它是利用三角形的三条边的边长直接求三角形面积的公式公式表述 海伦公式: 假设在平面内,有一个三角形,边长分别为a、b、c,三角形的面积S可由以下公式求得: 而公式里的p为半周长(周长的一半): ...
  • 海伦公式

    2021-05-24 02:16:00
    假设在平面内,有一个三角形,边长分别为a、b、c,三角形的面积S可由以下公式求得:S=√[p(p-a)(p-b)(p-c)]而公式里的p为半周长:p=(a+b+c)/2注:'Metrica'(《度量论》)手抄本中用s作为半周长,所以S=√[p(p-a)(p-b)...
  • 本文使用三角形面积累计法计算多边形面积,就是将多边形按照一个顶点,分割成多个三角形,计算三角形的面积,累加,得到多边形的面积。 当然,这个算法也有一些缺点,当这个多边形比较奇怪的时候,不能将多边形按照...
  • 计算多边形面积

    千次阅读 2019-08-11 02:52:06
    对于规则多边形,矩形、梯形、平行四边形、三角形(根据三边长度,利用公式计算),可以通过公式计算其面积,而对于一般意义的多边形(单一多边形、不包含“洞”),怎么计算面积呢,先想到是分割三角形,但是程序...
  • 本文通过Lagrange型形状函数回顾有限元的基本概念,并推导三角形单元上任意阶Lagrange元的几何节点坐标公式,和各自由度概念。 求解区域 求解区域即偏微分方程所定义的区域,或者说几何形状。 1. 一维 一维元素多是...
  • 多边形面积计算的演变推导过程

    千次阅读 2014-06-15 07:45:37
    多边形可以分割成多个三角形,

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,562
精华内容 1,024
关键字:

多边形分割三角形公式