GEOS学习之四:几何关系判断

原理上一篇已经介绍过了,这篇就直接进行程序练习

#include "geos.h"

GeometryFactory factory;

//创建一条环线,与线的区别就是环线是闭合的。即第一个点和最后一点重合
LinearRing* createGeosRing(double x,double y,double offset)
{
     CoordinateArraySequenceFactory csf;
    CoordinateSequence* cs = csf.create(6,2);
    cs->setAt(Coordinate(x,y),0);
    cs->setAt(Coordinate(x,y+offset),1);
    cs->setAt(Coordinate(x+offset,y+offset),2);
    cs->setAt(Coordinate(x+2*offset,y+2*offset),3);
    cs->setAt(Coordinate(x+2*offset,y),4);
    cs->setAt(Coordinate(x,y),5); //与第一个点相等
    LinearRing *lr=factory.createLinearRing(cs);
    return lr;
}

//创建一个多边形,如果多边形内部没有孔洞实际上与环线是一样的
Polygon* createGeosPolygon(double x,double y,double offset)
{
    LinearRing *lr=createGeosRing(x,y,offset);
    Polygon *poly=factory.createPolygon(lr,NULL); //如果多边形中间没有孔洞,第二个参数设为NULL
    return poly;
}

int main()
{
       Polygon *p1=createGeosPolygon(12,12,5); //创建第一个多边形

    for(int i=0;i<=20;i++)
    {
        cout<<i<<":   ";
        Polygon *p2=createGeosPolygon(0,0,i); //创建第二个多边形
        IntersectionMatrix *im=p2->relate(p1);
        cout<<*im<<"    ";    //返回DE-9IM交叉矩阵
        if(p2->disjoint(p1))
            cout<<"不相交"<<endl;
        else
        {
            if(p2->touches(p1))
                cout<<"接触"<<endl;
            else if(p2->overlaps(p1))
                cout<<"部分重叠"<<endl;
            else if(p2->covers(p1))
                cout<<"覆盖"<<endl;
            else
                cout<<*im<<endl;
        }
    }
    system("pause");
    return 1;
}

结果如下:

时间: 2024-10-03 20:08:17

GEOS学习之四:几何关系判断的相关文章

POJ1269_Intersecting Lines(几何/叉积判断直线位置关系)

解题报告 题目传送门 题意: 判断直线的位置关系(平行,重合,相交) 思路: 两直线可以用叉积来判断位置关系. AB直线和CD直线 平行的话端点C和端点D会在直线AB的同一侧. 重合的话在直线AB上. 剩下就是相交. 求两直线交点可以用面积比和边长比来求. 看下面的图就知道了,推导就比较容易了 #include <iostream> #include <cstring> #include <cstdio> #define eps 1e-6 #define zero(x)

学习总结-几何.向量叉积

学习总结-几何.向量叉积 假设有向量P(x1,y1)和Q(x2,y2) 那么向量P和Q的叉积表示为P×Q 并且P×Q=x1?y2?x2?y1 叉积的性质: 一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系: 若 P×Q>0, 则P在Q的顺时针方向; 若 P×Q<0, 则P在Q的逆时针方向; 若 P×Q=0, 则P与Q共线,但可能同向也可能反向. ·顺时针 ·逆时针 应用,给出一个序列的点,判断它是顺时针还是逆时针:计算连续两个点的叉积,包括第一个和最后一个,求他们的和,大于0

puppet学习之四 编写模块

puppet学习之四 编写模块 这里不赘述编写的语法,只是简单记录下一个模块编写的简单流程 [[email protected] ~]# cd /etc/puppet/modules/ [[email protected] modules]# mkdir puppet [[email protected] modules]# cd puppet/ [[email protected] puppet]# mkdir files manifests templates #创建模块目录结构 [[ema

简单读懂人工智能:机器学习与深度学习是什么关系

引言:随着AlphaGo战胜李世石,人工智能和深度学习这些概念已经成为一个非常火的话题.人工智能.机器学习与深度学习这几个关键词时常出现在媒体新闻中,并错误地被认为是等同的概念.本文将介绍人工智能.机器学习以及深度学习的概念,并着重解析它们之间的关系.本文将从不同领域需要解决的问题入手,依次介绍这些领域的基本概念以及解决领域内问题的主要思路.本文选自<Tensorflow:实战Google深度学习框架>. 从计算机发明之初,人们就希望它能够帮助甚至代替人类完成重复性劳作.利用巨大的存储空间和超

PGM学习之四 Factor,Reasoning

通过上一篇文章的介绍,我们已经基本了解了:Factor是组成PGM模型的基本要素:Factor之间的运算和推理是构建高维复杂PGM模型的基础.那么接下来,我们将重点理解,Factor之间的推理(Reasoning Patterns).Factor之间的推理分为以下几类: 1. Causal Reasoning , 因果推理: 2. Evidential Reasoning,证据推理: 3. Intercausal Reasoning 本文将详细描述上述三种推理模式. 一 Casual Reaso

JTS Geometry关系判断和分析

关系判断 Geometry之间的关系有如下几种: 相等(Equals): 几何形状拓扑上相等. 脱节(Disjoint): 几何形状没有共有的点. 相交(Intersects): 几何形状至少有一个共有点(区别于脱节) 接触(Touches): 几何形状有至少一个公共的边界点,但是没有内部点. 交叉(Crosses): 几何形状共享一些但不是所有的内部点. 内含(Within): 几何形状A的线都在几何形状B内部. 包含(Contains): 几何形状B的线都在几何形状A内部(区别于内含) 重叠

Android FM模块学习之四源码解析(二)

上一章我们了解了FM主activity:FMRadio.java,若没查看的,请打开链接Android FM模块学习之四源码解析(一) 查看fmradio.java源码注释.接下来我们来看看FM重要的一个类:FMRadioService.java 由上一章我们已经知道,打开FM时,在OnStart函数中会bindToService来开启服务, public boolean bindToService(Context context, ServiceConnection callback) { L

OpenStack 入门学习之四:icehouse版本中Heat的简单介绍

Heat简介 Heat是OpenStack的负责编排计划的主要项目.它可以基于模板来实现云环境中资源的初始化,依赖关系处理,部署等基本操作,也可以解决自动收缩,负载均衡等高级特性.目前Heat自身的模板格式(HOT)正在不停的改进,同时也支持AWS CloudFormation 模板(CFN),HOT的目标是在不远的将来可以完全的替代CFN. Heat提供了一个OpenStack的原生REST API和CloudFormation兼容的查询API. Heat的工作原理 Heat主要是基于模板文件

mysql学习之四:sql语句学习2

创建数据库: CREATE DATABASE stefan; 删除数据库: DROP DATABASE stefan; 重命名数据库: 重命名数据库没有直接的办法. 已经不再使用的方法: RENAME DATABASE stefan TO LCDB; 创建表格语法: CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据类型, 列名称3 数据类型, .... )   查看一个表格结构: DESCRIBE Persons;     ALTER TABLE 语句用于在已有的表中添