精华内容
下载资源
问答
  • 简单多边形的相交、合并算法。...这个demo程序只是介绍了多边形相交、合并的算法,针对简单凹凸多边形可以正常处理。算法仅供参考! 如需要支持内部有环的复杂多边形相交合并,请使用boost::polygon。
  • 多边形 决策点,在多边形内,线、多边形相交包括在内
  • 多边形相交运算源码

    2012-08-04 21:27:58
    多边形相交运算源码-polygon intersection Operational source
  • 多边形相交面积模板

    2016-09-05 15:54:00
    2 类型:多边形相交面积模板 3 */ 4 5 #include<cstdio> 6 #include<iostream> 7 #include<algorithm> 8 #include<cstring> 9 #include<cmath&...
      1 /* 
      2     类型:多边形相交面积模板 
      3 */  
      4   
      5 #include<cstdio>  
      6 #include<iostream>  
      7 #include<algorithm>  
      8 #include<cstring>  
      9 #include<cmath>  
     10 using namespace std;  
     11 #define maxn 510  
     12 const double eps=1E-8;  
     13 int sig(double d){  
     14     return(d>eps)-(d<-eps);  
     15 }  
     16 struct Point{  
     17     double x,y; Point(){}  
     18     Point(double x,double y):x(x),y(y){}  
     19     bool operator==(const Point&p)const{  
     20         return sig(x-p.x)==0&&sig(y-p.y)==0;  
     21     }  
     22 };  
     23 double cross(Point o,Point a,Point b){  
     24     return(a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y);  
     25 }  
     26 double area(Point* ps,int n){  
     27     ps[n]=ps[0];  
     28     double res=0;  
     29     for(int i=0;i<n;i++){  
     30         res+=ps[i].x*ps[i+1].y-ps[i].y*ps[i+1].x;  
     31     }  
     32     return res/2.0;  
     33 }  
     34 int lineCross(Point a,Point b,Point c,Point d,Point&p){  
     35     double s1,s2;  
     36     s1=cross(a,b,c);  
     37     s2=cross(a,b,d);  
     38     if(sig(s1)==0&&sig(s2)==0) return 2;  
     39     if(sig(s2-s1)==0) return 0;  
     40     p.x=(c.x*s2-d.x*s1)/(s2-s1);  
     41     p.y=(c.y*s2-d.y*s1)/(s2-s1);  
     42     return 1;  
     43 }  
     44 //多边形切割  
     45 //用直线ab切割多边形p,切割后的在向量(a,b)的左侧,并原地保存切割结果  
     46 //如果退化为一个点,也会返回去,此时n为1  
     47 void polygon_cut(Point*p,int&n,Point a,Point b){  
     48     static Point pp[maxn];  
     49     int m=0;p[n]=p[0];  
     50     for(int i=0;i<n;i++){  
     51         if(sig(cross(a,b,p[i]))>0) pp[m++]=p[i];  
     52         if(sig(cross(a,b,p[i]))!=sig(cross(a,b,p[i+1])))  
     53             lineCross(a,b,p[i],p[i+1],pp[m++]);  
     54     }  
     55     n=0;  
     56     for(int i=0;i<m;i++)  
     57         if(!i||!(pp[i]==pp[i-1]))  
     58             p[n++]=pp[i];  
     59     while(n>1&&p[n-1]==p[0])n--;  
     60 }  
     61 //---------------华丽的分隔线-----------------//  
     62 //返回三角形oab和三角形ocd的有向交面积,o是原点//  
     63 double intersectArea(Point a,Point b,Point c,Point d){  
     64     Point o(0,0);  
     65     int s1=sig(cross(o,a,b));  
     66     int s2=sig(cross(o,c,d));  
     67     if(s1==0||s2==0)return 0.0;//退化,面积为0  
     68     if(s1==-1) swap(a,b);  
     69     if(s2==-1) swap(c,d);  
     70     Point p[10]={o,a,b};  
     71     int n=3;  
     72     polygon_cut(p,n,o,c);  
     73     polygon_cut(p,n,c,d);  
     74     polygon_cut(p,n,d,o);  
     75     double res=fabs(area(p,n));  
     76     if(s1*s2==-1) res=-res;return res;  
     77 }  
     78 //求两多边形的交面积  
     79 double intersectArea(Point*ps1,int n1,Point*ps2,int n2){  
     80     if(area(ps1,n1)<0) reverse(ps1,ps1+n1);  
     81     if(area(ps2,n2)<0) reverse(ps2,ps2+n2);  
     82     ps1[n1]=ps1[0];  
     83     ps2[n2]=ps2[0];  
     84     double res=0;  
     85     for(int i=0;i<n1;i++){  
     86         for(int j=0;j<n2;j++){  
     87             res+=intersectArea(ps1[i],ps1[i+1],ps2[j],ps2[j+1]);  
     88         }  
     89     }  
     90     return res;//assumeresispositive!  
     91 }  
     92 //hdu-3060求两个任意简单多边形的并面积  
     93 Point ps1[maxn],ps2[maxn];  
     94 int n1,n2;  
     95 int main(){  
     96     while(scanf("%d%d",&n1,&n2)!=EOF){  
     97         for(int i=0;i<n1;i++)  
     98             scanf("%lf%lf",&ps1[i].x,&ps1[i].y);  
     99         for(int i=0;i<n2;i++)  
    100             scanf("%lf%lf",&ps2[i].x,&ps2[i].y);  
    101         double ans=intersectArea(ps1,n1,ps2,n2);  
    102         ans=fabs(area(ps1,n1))+fabs(area(ps2,n2))-ans;//容斥  
    103         printf("%.2f\n",ans);  
    104     }  
    105     return 0;  
    106 }  

     

    转载于:https://www.cnblogs.com/fightfordream/p/5842569.html

    展开全文
  • 多边形相交计算

    2012-08-04 20:19:17
    用vc + mapobjects开发的源代码,用鼠标对多边形进行操作,实现了多边形相交计算功能。
  • 多边形相交 用Python实现的一种简单的2D相交二维凸多边形算法
  • 保护私有信息的计算几何是一类特殊的安全多方计算问题,在军事、商业等领域具有重要的应用前景。...基于该协议,提出保护私有信息的两多边形相交面积计算协议;分析和证明上述协议的正确性、安全性和复杂性。
  • 多边形相交面积计算模版

    千次阅读 2016-09-05 00:49:05
    类型:多边形相交面积模板 */ #include #include #include #include #include using namespace std; #define maxn 510 const double eps=1E-8; int sig(double d){ return(d>eps)-(d); } struct Point{ dou
    /*
        类型:多边形相交面积模板
    */
    
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace std;
    #define maxn 510
    const double eps=1E-8;
    int sig(double d){
        return(d>eps)-(d<-eps);
    }
    struct Point{
        double x,y; Point(){}
        Point(double x,double y):x(x),y(y){}
        bool operator==(const Point&p)const{
            return sig(x-p.x)==0&&sig(y-p.y)==0;
        }
    };
    double cross(Point o,Point a,Point b){
        return(a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y);
    }
    double area(Point* ps,int n){
        ps[n]=ps[0];
        double res=0;
        for(int i=0;i<n;i++){
            res+=ps[i].x*ps[i+1].y-ps[i].y*ps[i+1].x;
        }
        return res/2.0;
    }
    int lineCross(Point a,Point b,Point c,Point d,Point&p){
        double s1,s2;
        s1=cross(a,b,c);
        s2=cross(a,b,d);
        if(sig(s1)==0&&sig(s2)==0) return 2;
        if(sig(s2-s1)==0) return 0;
        p.x=(c.x*s2-d.x*s1)/(s2-s1);
        p.y=(c.y*s2-d.y*s1)/(s2-s1);
        return 1;
    }
    //多边形切割
    //用直线ab切割多边形p,切割后的在向量(a,b)的左侧,并原地保存切割结果
    //如果退化为一个点,也会返回去,此时n为1
    void polygon_cut(Point*p,int&n,Point a,Point b){
        static Point pp[maxn];
        int m=0;p[n]=p[0];
        for(int i=0;i<n;i++){
            if(sig(cross(a,b,p[i]))>0) pp[m++]=p[i];
            if(sig(cross(a,b,p[i]))!=sig(cross(a,b,p[i+1])))
                lineCross(a,b,p[i],p[i+1],pp[m++]);
        }
        n=0;
        for(int i=0;i<m;i++)
            if(!i||!(pp[i]==pp[i-1]))
                p[n++]=pp[i];
        while(n>1&&p[n-1]==p[0])n--;
    }
    //---------------华丽的分隔线-----------------//
    //返回三角形oab和三角形ocd的有向交面积,o是原点//
    double intersectArea(Point a,Point b,Point c,Point d){
        Point o(0,0);
        int s1=sig(cross(o,a,b));
        int s2=sig(cross(o,c,d));
        if(s1==0||s2==0)return 0.0;//退化,面积为0
        if(s1==-1) swap(a,b);
        if(s2==-1) swap(c,d);
        Point p[10]={o,a,b};
        int n=3;
        polygon_cut(p,n,o,c);
        polygon_cut(p,n,c,d);
        polygon_cut(p,n,d,o);
        double res=fabs(area(p,n));
        if(s1*s2==-1) res=-res;return res;
    }
    //求两多边形的交面积
    double intersectArea(Point*ps1,int n1,Point*ps2,int n2){
        if(area(ps1,n1)<0) reverse(ps1,ps1+n1);
        if(area(ps2,n2)<0) reverse(ps2,ps2+n2);
        ps1[n1]=ps1[0];
        ps2[n2]=ps2[0];
        double res=0;
        for(int i=0;i<n1;i++){
            for(int j=0;j<n2;j++){
                res+=intersectArea(ps1[i],ps1[i+1],ps2[j],ps2[j+1]);
            }
        }
        return res;//assumeresispositive!
    }
    //hdu-3060求两个任意简单多边形的并面积
    Point ps1[maxn],ps2[maxn];
    int n1,n2;
    int main(){
        while(scanf("%d%d",&n1,&n2)!=EOF){
            for(int i=0;i<n1;i++)
                scanf("%lf%lf",&ps1[i].x,&ps1[i].y);
            for(int i=0;i<n2;i++)
                scanf("%lf%lf",&ps2[i].x,&ps2[i].y);
            double ans=intersectArea(ps1,n1,ps2,n2);
            ans=fabs(area(ps1,n1))+fabs(area(ps2,n2))-ans;//容斥
            printf("%.2f\n",ans);
        }
        return 0;
    }
    

    展开全文
  • 需求:在Mapbox地图上绘制一个多边形,需要计算与多边形相交的村有哪些。 现状:地图上的村界市线图层 计算相交,在postgresql数据库里很简单,但是数据量大的时候就有点效率低了。使用Mapbox在前端直接计算屏幕内...

    需求:在Mapbox地图上绘制一个多边形,需要计算与多边形相交的村有哪些。

    现状:地图上的村界市线图层

    计算相交,在postgresql数据库里很简单,但是数据量大的时候就有点效率低了。使用Mapbox在前端直接计算屏幕内要素的相交,计算量就比较小了。

    这里采用的是先把屏幕内的目标要素全查出来,然后使用turf进行相交的判断

    具体实现

    1.添加村界面图层

                 //村界转polygon
                    map.addLayer(
                        {
                            "id": "村域面",
                            "source": "dt_cy",
                            "type": "fill",
                            "minzoom": 12,
                            "maxzoom": 18,
                            "layout": {},
                            "paint": {
                                "fill-outline-color": "#08cc53",
                                "fill-opacity":0,
                                "fill-color": "#08cc53"
                            },
                            "source-layer": "dt_cy",
                            "metadata": {
                                "mapbox:group": "b9f7ce9068f6a"
                            }
                        },
                        "种植结构"
                    );

    2.计算相交与去重

     /**
       * 更新落图村信息
       */
      setLtQhdm(feature){
        console.log("计算外接矩形");
        //查出屏幕类所有村界
        let result=this.map.queryRenderedFeatures(null,{layers: ['村域面']});
        let intersectFeatures=[];
        //turf相交判断
        if(result&& result.length>0){
          for (let i = 0; i <result.length ; i++) {
            if (! (undefined === turf.intersect(result[i].geometry, feature.geometry))) {
              console.log(turf.area(turf.intersect(result[i].geometry, feature.geometry)));
              intersectFeatures.push(result[i]);
            }
          }
          //根据id去重
          if(intersectFeatures){
            intersectFeatures=this.unique(intersectFeatures);
            //大于1,按照相交面积降序
            if(intersectFeatures.length>1){
              intersectFeatures.sort(function(a, b){return turf.area(turf.intersect(b.geometry, feature.geometry)) - turf.area(turf.intersect(a.geometry, feature.geometry))});
            }
          }
        }
       //相交结果
        return feature;
      }
    //根据要素属性去重
      unique(features){
        let newArr = [];
        let newFeature = [];
        for(let i = 0; i < features.length; i++){
          if(newArr.indexOf(features[i].properties.qhdm) == -1){
            newFeature.push(features[i])
            newArr.push(features[i].properties.qhdm)
          }
        }
        return newFeature;
      }
    
    map.queryRenderedFeatures这里第一个参数传的是空,会把当前屏幕内所有符合条件的图层查出来。本来想的是将绘制的多边形的bbox查出来,当作第一个参数,结果发现查询的结果根本不对。最后直接改成null了。

    注意事项

    1. 目标图层的type一定是fill
    2. queryRenderedFeatures的第一个参数要设置成空,相交关系用turf去判断

     

     

    展开全文
  • 总结图形学方法处理多边形相交问题

    前言

    继续总结关于图形学的问题,这次总结下多边行的相交问题,同样可以自行阅读参考文献了解,以下是本人的自行总结内容。

    参考文献:《计算机图形学——用OpenGL实现(第2版)》 清华大学出版社

    平面直线与多边形相交

    首先要说明一个定义——外法向量,指的是多边形的边指向多边形外部的法向量。要想确立多边形每条边的外法向量,简单的方法就是顺时针记录多边形的顶点集合PiP_i,对应边的集合Ei=Pi+1PiE_i = P_{i+1} - P_i,边的外法向量集合EiE^\perp_i便是EiE_i的逆时针法向量
    具体步骤便是,依次对多边形的每一条边做直线与线段的相交检测(具体请参考前面的章节平面图形原理总结(1):直线相交

    平面线段与多边形相交

    步骤大致与直线与多边形相交的方法相似,可用两直线相交的方法,但是要记录下所有线段所在直线与多边形边所在直线的相交点的t值,同时要区分入点与出点。出入点区分方法是用线段的向量n\vec n与多边形边的外法向量EiE^\perp_i做点乘:
    nEi&lt;0\vec n \cdot E^\perp_i &lt; 0,则为入点;
    nEi&gt;0\vec n \cdot E^\perp_i &gt; 0,则为出点;
    nEi=0\vec n \cdot E^\perp_i = 0,则线段与多边行的边平行(考虑重合问题);
    取入点所有记录t与0的最大值,出点所有记录t与1的最小值;
    若存在0t10 \le t \le 1,则线段与多边形相交。

    平面多边形与多边形相交

    以上述线段与多边形相交为单元步骤,对多边形的每一条边做与另一多边形的相交判断,即可得到多边形与多边形的相交检测。

    平面圆与多边形相交

    具体步骤便是,依次对多边形的每一条边做圆与线段的相交检测(具体请参考前面的章节平面图形原理总结(2):点与直线

    补充:凸多边形的投影法相交检测

    具体步骤为:检测图形对多边形每条边的法向量形成的坐标系做投影,若其中一边的检测中,存在图形的投影与多边形自身的投影范围没有重合部分,则图形与多边形不相交;反之,则相交。
    注意:投影法只适用于凸多边形,凹多边形不适用。
    【投影法没有参考书籍中记载,具体描述,可自行上网查找】

    展开全文
  • 自己用VC++作的多边形程序,包括求面积、凹凸性、凸包、两多边形相交等。
  • 多边形相交检测demo

    2019-03-02 14:42:51
    本资源对应的博文地址:https://blog.csdn.net/StevenKyleLee/article/details/88075814
  • 两个多边形相交区域面积求解的算法网上找到的有些层次不齐,但算法都大致相同,就是计算多边形线段相交求取交点,然后找到交叠区域。在查找算法和代码中发现一些好的程序,一并整理在此。 1、...
  • 用JS代码实现了多边形之间的相交关系判断,包含了线与多边形多边形多边形相交判断
  • 本文接前文点、线段、多边形相交判断以及在游戏中常见的物理应用 前文主要讲解点、线段、凸包之间的相交判断算法,本文主要解释凹多边形(简称凹包)的判断方法。 一、简单多边形 由于以下论述都是基于简单多边形...
  • 三角形为凸多边形,因此可以直接用凸多边形相交求面积的模板。 凸多边形相交后的部分肯定还是凸多边形,所以只需要判断哪些点是相交部分上的点,最后求下面积。 1 #include <iostr...
  • 判断2个多边形相交

    千次阅读 2020-03-06 15:21:32
    2个多边形的边是否相交。 点在内部。2个多边形的顶点是否在另一个多边形的内部。 关于这2个条件的判断: 《碰撞检测:判断点是否在多边形内部》 https://blog.csdn.net/StevenKyleLee/article/details/88044589 ...
  • = pa * k时p所占区域与多边形相交面积 设p(x,y), (x - xb)^2+(y - yb)^2 /(x - xa)^2+(y - ya)^2 = k^2 所以可以化成圆的一般式x^2 + y^2 + dx + ey + f = 0; 推公式: 圆心:(-d/2,-e/2) 半径:(sqrt(d...
  • 题意:给你一些多边形的点,判断每个多边形和那些多边形相交,编号按照字典序输出 思路:枚举每个多边形的每条边看是否相交,这里的相交是包括端点的,关键是给你正方形不相邻两个点求另外两个点怎么求,长方形给你...
  • POJ 3449 Geometric Shapes(判断多边形相交情况) http://poj.org/problem?id=3449 题意:  给你n个多边形,这些多边形包括线段,三角形,矩形,正方形,和其他多边形. 然后要你输出他们之间相交的情况. 且多边形自己的...
  • 原文地址 http://www.cnblogs.com/topcss/p/3575248.html ,基于该作者的代码基础上进行简单修改,使其在openlayers3上可用,有兴趣可以去看一下
  • 可移动多边形,可改变多边形形状、顶点数量,最主要的是检测相交情况。
  • 任意两个凸多边形A,B的相交区域面积计算,这里采用如下两步进行计算: 一、 计算相交区域对应的多边形,记为intersect 大体分为下面几个步骤: 1.记录A位于B中的所有顶点 2.记录B位于A中的所有顶点 3.记录A与B每一条...
  • 2 个多边形的关系无非: 相交(一处交集) 相交(多处交集) 相切(相交的一种,交集为线) 包含(相交的一种,交集为面积较小多边形) 相等(相交的一种,交集为 2 多边形本身) 相离(无交集) 先向大...
  • 不规则多边形相交切割逻辑

    千次阅读 2019-03-22 18:24:04
    之前基本上遇到的多边形切割问题都是凸多边形问题,而针对凹多边形的切割问题却很少。偶然发现一个做得特别棒的滑动切割的游戏,游戏中主要是使用多边形切割以及多边形碰撞算法。针对多边形切割的实现做了一下研究,...
  • C#多边形相交、合并等操作

    千次阅读 2020-04-21 11:13:51
    最近在做项目时遇到需要对二维的多边形进行相交及合并的操作,自己也写了很多方法,但是效果都不是很理想,最终决定使用GPC库,此库中有很多复杂的多边形裁剪方法,现对此库的使用方法做简单描述,源码在文末贴出。...
  • 碰撞检测:判断2个多边形相交

    千次阅读 2019-03-02 14:41:09
    演示demo: 需要判断2个条件 边相交。2个多边形的边是否相交。 点在内部。2个多边形的顶点是否在另一个多边形的内部。 关于这2个条件的判断: 《碰撞检测:判断点是否在多边形内部》 ...
  • 并行计算 多边形相交 OpenMP MPI Java(Thread、Runnable) Windows(win32、MFC、.Net)
  • poj3675求圆心在原点的园与多边形相交的面积表示不懂以后慢慢理解吧; #include #include #include #include #include const double eps=1e-10; const double PI=acos(-1.0); using namespace std; struct Point...

空空如也

空空如也

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

多边形相交