精华内容
下载资源
问答
  • 空间拓扑关系判断方法的研究

    千次阅读 2010-04-01 08:22:00
    空间拓扑关系判断方法的研究 徐黎明 陈天滋(江苏大学计算机科学与通信工程学院 江苏镇江 212013) 【摘 要】空间拓扑关系是空间分析中的重要部分,如何有效地进行空间拓扑关系的生成和判断,将直接影响到GIS系统的...

    空间拓扑关系判断方法的研究

    徐黎明 陈天滋

    (江苏大学计算机科学与通信工程学院 江苏镇江 212013)

    空间拓扑关系是空间分析中的重要部分,如何有效地进行空间拓扑关系的生成和判断,将直接影响到GIS系统的有效性。本文在借助已有的拓扑关系识别规则,并分析其思路的基础上,提出了一种利用解析几何的思想来进行空间拓扑关系判断的新方法。

    关键词 解析几何 地理信息系统 拓扑关系 判断

    1 引言

    地理信息系统(GIS,Geographic Information System)是以采集、存储、管理、分析、描述和应用整个或部分地球表面(包括大气层在内)与空间和地理分布有关的数据的计算机系统。它由硬件、软件、数据和用户有机结合而构成。它的主要功能是实现地理空间数据的采集、编辑、管理、分析、统计、制图。由于地球是人们赖以生存的基础,所以GIS是与人类的生存、发展、进步密切关联的一门信息科学与技术,并愈来愈受到人们的重视。

    GIS实现技术的核心之一就是空间数据库的建立,以及在此基础上实现的空间查询和空间分析。空间数据库不仅对空间目标进行描述,而且对目标间的空间关系进行显式表达。完备和形式化的空间关系描述与表达是设计空间查询语言的关键,是实现有效空间查询的前提,同时也是空间分析的基础,它直接影响到空间分析获取的信息量及其有效性。传统GIS着重于目标间拓扑空间关系的描述与表达,点集拓扑学、代数拓扑学和图论是目前用得比较多的描述空间关系的理论基础,很多著名学者在此方面做了大量的研究工作,提出了基于点集拓扑理论的识别规则,但这类算法往往比较复杂。本文借助于解析几何的思想,提出了一种利用代数方程来解决几何对象之间关系的新思路,通过直线的单调性及斜率等性质,只须经过简单的运算,便可给出空间拓扑关系的具体判断。

    2 相关知识

    2.1 定理 

    xoy平面上的任意一条直线,其方程都是关于x、y的一次方程。

    ⑵ 任意一个关于x、y的一次方程Ax+Bx+C=0(A、B不同时为零),都表示xoy平面上的一条直线。

    2.2 公式  

    到直线的距离为:

      ,

    2.3 定义

    ⑴ 斜率:在坐标平面上,如果已知两个点 ,那么过 的直线 就是确定的。 此时直线的斜率为:

                (当

                   不存在    (当

     ⑵ 两点式直线方程:对于空间关系中的线段,它是由两个结点组成的,故可通过已知的两点的点坐标来写出直线方程。现设直线段 通过两点 ,求 的方程时,我们应考虑横坐标 的关系:

    时, 轴, 的方程是

    时,可转化为点斜式处理。此时 的斜率 ,所以 的方程可写成 ,从而化简可得一般式:    

    上述定理和定义揭示了坐标平面上的直线与关于x、y的一次方程上的联系,根据这种联系,研究直线的几何问题就可以和研究一次方程的代数问题互化了。这也是本文利用此方法来解决线与其他对象相关关系的理由。

    3 拓扑关系判断的具体方法

    3.1点与点的关系

    现实世界中,具有物理意义的点与点之间的关系有二种,可通过点之间的距离来判断

    (1)重合 对于点 ,若有 且有 ,则可认为两点是重合的。

    (2)分离 对于不满足以上条件的两点则认为是分离的。

    3.2 点与线的关系

    点与线之间的基本关系有以下三种:

    (1)相接:点与直线段两端点之一重合。

    (2)包含:若点到线的距离d为0,且根据线的单调性,此点的点坐标位于两端点之间,则此时为包含的关系,即线包含了点。

    (3)分离:点到线的距离d不等于0。

    点与线的距离为0,但排除点包含于线段的情况,即此点的点坐标不在两端点之外,则此时点与直线段也是分离的。

    若涉及的是不确定坐标值的点与线,可以根据比例尺的大小及视觉效果,利用隶属函数来进行其中相关拓扑关系的模糊判断。

    3.3 点与多边形的关系

    下面的方法既适用P是凸多边形的情况,又适用于P是凹多边形的情况,甚至还可适用于P内部有孔的情况。具体方法是,从 向右作一水平射线至无穷远,则:

         (其中t指大于等于0的任意数)

      

    然后求射线与多边形P的交点个数,进而根据交点个数来判断 是位于P外还是位于P内。若有奇数个交点,则 位于P内;若有偶数个交点,则 位于P外。

      (1)分离:若 位于P外,则点与多边形的关系是分离的。

      (2)包含:若 位于P内,则多边形包含点。

      (3)点在多边形上(相邻):由于多边形P由 组成,故多边形是由直线段 组成,若此点落在组成多边形的某一条直线段上(可参照点与线的关系),则可认为点在多边形上,即两者为相邻关系。

    3.4 线与线的关系

    在解析几何中,线和线的关系可以通过两点式分别求其直线方程后,通过比较两者的斜率以及相应的系数,来判断其相互的关系。

    设直线段 的直线方程为

    设直线段 的直线方程为

    (1)重合:若 ,则可判断两直线相互重合,此时,对两线段的关系关键看彼此两端点之间的关系。现设直线 的两端点为 ,直线 的两端点为 ,根据直线上的点坐标是单调增或单调减的,则有 ,不妨设直线 是单调增的(此时直线 也是单调增的),则有 ,若对直线 上的两端点有 则可得两直线是重合的。

    (2)交叠:对同样满足上述条件的两直线上的直线段,若有 ,就可以判断这两直线是交叠的。其中有包含于和包含两种情况:对于满足直线方程一样的两线段,若有 ,则称 包含 ,即 包含于 ,因为包含和包含于是一个对应的关系

    (3)相接:对于上述两线段若直线方程一样,那么如有 中之一情况,则可推得两直线是相接的。

    若两线段的直线方程不一样,但其中的一条线段的一个端点到另一条直线段的距离为0,即此端点在另外一个直线段上,则也是相接的。

    (4)分离:对于直线方程相同的两个线段,若有 ,则两直线段是分离的。

    若由两线段的直线方程比较出斜率不等(通过点斜式很容易就能发现斜率的相等与否),则这两条直线有相交的趋势。但因为这是个直线段,则可由两直线方程求出的交点坐标,来判断交点是否落在其一的延长线上,若是则是分离的。

    (5)相交:对相离中的第2种情况,若交点属于两直线段,则可判断是相交的。具体可见图1所示。

    3.5 线与多边形的关系

    线与多边形的关系可通过点与多边形的关系及直线段的连续性来进行判断。

    (1)相交:若直线段的一个端点落在多边形内,但另一个端点不在多边形内,则可判断其是相交的。  

            

    1 线与线之间的拓扑关系示意图                  图2 线与多边形之间的拓扑关系示意图

    包含于:若直线段的两个端点皆落在多边形的内部,则可判断直线是包含于多边形。

    (3)相接:若直线段的一个端点落在多边形的一个边上,因为直线上的点坐标呈现单调性,不妨设单调增,

    展开全文
  • 通过官网http://turfjs.org/或者github https://github.com/Turfjs/turf了解 第一步:先引用js文件 <...gt;</script&...第二步:调用函数,判断关系 booleanClockwise(line) //线是否...

    通过官网http://turfjs.org/或者github https://github.com/Turfjs/turf了解

    第一步:先引用js文件

    <script src='https://npmcdn.com/@turf/turf/turf.min.js'></script>
    

    第二步:调用函数,判断关系

    booleanClockwise(line) //线是否闭合

    var clockwiseRing = turf.lineString([[0,0],[1,1],[1,0],[0,0]]);
    var counterClockwiseRing = turf.lineString([[0,0],[1,0],[1,1],[0,0]]);
    
    turf.booleanClockwise(clockwiseRing)
    //=true
    turf.booleanClockwise(counterClockwiseRing)
    //=false
    

    booleanContains(feature1,feature2) //feature2是否完全包含在feature1中

    var line = turf.lineString([[1, 1], [1, 2], [1, 3], [1, 4]]);
    var point = turf.point([1, 2]);
    
    turf.booleanContains(line, point);
    //=true
    

    booleanCrosses(feature1,feature2) //feature1,feature2是否相交

    var line1 = turf.lineString([[-2, 2], [4, 2]]);
    var line2 = turf.lineString([[1, 1], [1, 2], [1, 3], [1, 4]]);
    
    var cross = turf.booleanCrosses(line1, line2);
    //=true
    

    booleanDisjoint(feature1,feature2) //feature1,feature2是否相离

    var point = turf.point([2, 2]);
    var line = turf.lineString([[1, 1], [1, 2], [1, 3], [1, 4]]);
    
    turf.booleanDisjoint(line, point);
    //=true
    

    booleanEqual(feature1,feature2) //feature1,feature2是否重合

    var pt1 = turf.point([0, 0]);
    var pt2 = turf.point([0, 0]);
    var pt3 = turf.point([1, 1]);
    
    turf.booleanEqual(pt1, pt2);
    //= true
    turf.booleanEqual(pt2, pt3);
    //= false
    

    booleanOverlap(feature1,feature2) //feature1,feature2是否重叠 ,feature1,feature2类型为Polygon、LineString、 Multipoint、MultiLineString、MultiPolygon,且相同

    var poly1 = turf.polygon([[[0,0],[0,5],[5,5],[5,0],[0,0]]]);
    var poly2 = turf.polygon([[[1,1],[1,6],[6,6],[6,1],[1,1]]]);
    var poly3 = turf.polygon([[[10,10],[10,15],[15,15],[15,10],[10,10]]]);
    
    turf.booleanOverlap(poly1, poly2)
    //=true
    turf.booleanOverlap(poly2, poly3)
    //=false
    

    booleanParallel(line,line) //两条线是否平行

    var line1 = turf.lineString([[0, 0], [0, 1]]);
    var line2 = turf.lineString([[1, 0], [1, 1]]);
    
    turf.booleanParallel(line1, line2);
    //=true
    

    booleanPointInPolygon(point,polygon) //点是否在面中

    var pt = turf.point([-77, 44]);
    var poly = turf.polygon([[
      [-81, 41],
      [-81, 47],
      [-72, 47],
      [-72, 41],
      [-81, 41]
    ]]);
    
    turf.booleanPointInPolygon(pt, poly);
    //= true
    

    booleanPointOnLine(point,line) //点是否在线上

    var pt = turf.point([0, 0]);
    var line = turf.lineString([[-1, -1],[1, 1],[1.5, 2.2]]);
    var isPointOnLine = turf.booleanPointOnLine(pt, line);
    //=true
    

    booleanWithin(feature1,feature2) //feature1是否完全在feature2中

    var line = turf.lineString([[1, 1], [1, 2], [1, 3], [1, 4]]);
    var point = turf.point([1, 2]);
    
    turf.booleanWithin(point, line);
    //=true
    
    展开全文
  • 【华为笔试】模块依赖关系判断

    千次阅读 2017-08-17 00:43:49
    题目描述: 一个系统的若干模块之间存在互相依赖的关系,如果A模块调用了B模块的接口,那么成为A依赖B...先输入若干模块之间的关系判断某模块是否存在循环依赖。模块ID范围为0--0xffffffff 调用者保证相同的关系
    题目描述:
    一个系统的若干模块之间存在互相依赖的关系,如果A模块调用了B模块的接口,那么成为A依赖B,记为A->B
    如果A->B,B->A,那么称A和B模块都存在循环依赖。
    如果A->B,B->C,C->D,D->B,那么BCD存在循环依赖,A不存在循环依赖,以此类推
    先输入若干模块之间的关系,判断某模块是否存在循环依赖。模块ID范围为0--0xffffffff

    调用者保证相同的关系不重复输入

    输入描述:

    模块间关系,注意最后一行没有“,”结尾

    输出描述:
    模块是否循环依赖,注意最后一行没有“,”结尾


    输入用例:
    {0x00, 0x01},
    {0x02, 0x03},
    {0x03, 0x04}

    输出:
    {0x00, false},
    {0x01, false},
    {0x02, false},
    {0x03, false},
    {0x04, false}

    从题目的描述可以简化为,从一个已存在的链表中,找出并标记其中自行成环的节点,结果每个节点的状态作为输出。参考静态链表的存储方式,建立映射表map,以键值的方式将输入的依赖关系进行存储。

    由于输入的数据以固定的格式输入,且ID是以十六进制的方式输入,由于题目并未给予输入行数作为输入条件,而是以最后一行最后是否有“,”作为终止输入条件,因此采用getline()函数读取每一行,对每一行中的数字进行解析,以键值的方式建立map表,其中第一个数字为first,第二个数字为second。每次读取一行解析到最后,判断最后一个字符释放为“,”。如果最后一个字符是“}”而不是“,”,即表明输入已经结束,必须break。至此读取数据完毕。

    在读取每对依赖关系的过程中,把每个数字都建立另外的一个map表,用于记录其是否在某个环内,同时为了最后结果输出。由于输入的ID可能为0x00,因此存在着某个非0值的ID指向了0值的依赖关系。由于使用的是map存储,其second表示的是下一个ID值。当某个值在map表中查找,如果该值在表中不存在,返回了0,同时会在表中建立该值,并赋值为0,如此一来会导致原来的存储改变而混乱。因此另外建立一个表,记录每对依赖关系的第一个ID,在数据输入中,每对依赖关系的第一个ID在map表中的值都1,如果不是第一个ID,即使后来查找中被建立,但初始值为0,不影响判断。综上,需要建立三个map表:一个记录原有依赖关系【data】,一个记录每对依赖关系的起点ID【dlog】,一个记录其状态(即是否存在环中)【out】。

    在环形判断中,由于map表会根据键值在建立时进行排序,因此保证了每个键值都是有序的。在data上从某个ID开始,判断out[id]1是否为1,如果为1,说明其已经在某个环内,无须重复判断,进入其下一个;如果不在某个环中,则进入循环检测过程:首先将不存在环形中的ID记录在一个临时数组中,检查该ID所指向的下一个ID是否存在于该临时数组中,由于该数组保存在历史路径,如果当前的下一个ID能在临时数组中找到,那么说明历史数字中的所有节点已经构成了一个环,把该临时数组中的ID,在out这个map表上做标记,记录这些ID是在环中。如果下一个ID在临时数组中找不到,进入下一个循环。循环判断上,首先判断下一个ID是否存在着链路,检查dlog这个map表中,dlog[id]是否为1,如果为1,继续上述判断过程;如果不为0,那么说明到了该节点,已经不存在下一条链路,退出本次循环。

    例如存在着下面的依赖关系:

    0     ---      1

    1     ---      3

    2     ---      4

    3     ---      0

    从data这个map表第一个开始,取出0,由于0在out表上此刻还不是在某个环中,进入环形判断过程。将0放入临时数组中,检查下一个ID1是否在临时数组中,返回不存在,进入下一个循环。循环中检查1在dlog中是否为1,即是否存在下一条通路,返回为1,再将1放入临时数组中,检查下一个ID3是否已在临时数组中,返回不存在,进入下一个循环。继续检查3是否存在下一条通路,返回1即存在,检查下一个ID0是否已在临时数组中,返回结果为存在,此时表明,0,1,3这三个节点构成了一个环形,通过把临时数组中的所有节点在out这个map表上做结果标记,之后退出循环体。因为前面是临时数组,在退出本次循环后会自动清楚,不会影响下一个判断。

    当判断下一个ID1时,检查其out表发现为1,表明其已经在某个环中当中,那么不进入环形判断,继续下一个。

    当判断下一个ID2时,检查其out表发现为0,说明不在环形中,进入内循环判断,当检查到4不在临时数组中,进入下一个循环,通过判断dlog[id]得知4该节点不存在下一个指向,那么说明这两个不在环中,结束本次循环,继续下一个;

    当判断下一个ID3时,由于已经是在某个环中,故而不进入内循环判断,此时所有依赖关系判断完毕,其结果都在out这个map表中。

    具体程序如下:

    #include <iostream>
    #include <vector>
    #include <string>
    #include <map>
    #include <algorithm>
    using namespace std;
    
    int main()
    {
    	while (1)
    	{
    		map<long long, long long> data;
    		map<long long, int> out, dlog;
    		string s;
    		//输入数据,并对数据定位,建立map表
    		while (getline(cin, s))
    		{
    			long long a = 0, b = 0;
    			int i = 3;
    			for (; s[i] != ','; i++)
    				a += a * 16 + s[i] - '0';
    			
    			i += 4;
    			for (; s[i] != '}'; i++)
    				b += b * 16 + s[i] - '0';
    
    			data[a] = b;
    			dlog[a] = 1;
    			out[a] = 0;
    			out[b] = 0;
    			if (i == s.length() - 1)
    				break;
    		}
    		
    		map<long long, long long>::iterator it = data.begin();
    		for (; it != data.end(); it++)
    		{
    			if (0 == out[it->first])
    			{
    				vector<long long> tmp;
    				long long t = it->first;
    				while (1 == dlog[t])
    				{
    					tmp.push_back(t);
    					if (find(tmp.begin(), tmp.end(), data[t]) != tmp.end())
    					{
    						for (vector<long long>::iterator k = tmp.begin(); k != tmp.end(); k++)
    							out[*k] = 1;
    						
    						break;
    					}
    					t = data[t];
    				}
    			}
    		}
    		int sum=out.size();
    		for (map<long long, int>::iterator kk = out.begin(); kk != out.end(); kk++)
    		{
    			sum--;
    			cout<<"{0x"<<hex<<kk->first<<", ";
    			if(k->second==1)
    				cout<<"ture}";
    			else
    				cout<<"false}";
    			
    			if(sum==0)
    				cout<<endl;
    			else
    				cout<<","<<endl;
    		}
    	}
    
    	return 0;
    }




    展开全文
  • 实例、类、父类的关系判断

    千次阅读 2013-09-27 10:47:31
    isinstance(a,A) 判断a是否是类A的实例 issubclass(A,AA) #判断AA是否是类A的父类 A.__bases__ 输出A的父类,以元组形式返回,因为可能有多个父类。 class Person:  pass class p(Person):  pass ...

    __class__.__name__   得到实例的类名称

    isinstance(a,A) 判断a是否是类A的实例


    issubclass(A,AA)   #判断AA是否是类A的父类

    A.__bases__ 输出A的父类,以元组形式返回,因为可能有多个父类。


    class Person:

        pass
    class p(Person):
        pass

    pinstance =p()
    print pinstance.__class__.__name__ # 输出实例的类名称 p
    print isinstance(pinstance,p) #判断某实例是否是该类的实例

    print issubclass(p,Person) #判断某类是否是类的子类
    print p.__bases__ #输出类的父类,如果是,则返回父类元组,如(<class __main__.Person at 0x01D57260>,);如果不是,则输出()
    展开全文
  • 求:一棵完全二叉树中两个结点u和v是否具有祖先后代关系? 分析: 树的深度由根所在层从0开始,例如结点a的深度为0,结点c的深度为2。树总的深度为D。 解: 方法一:对节点进行二进制编码。若u结点是v结点的祖先,则v...
  • 各位朋友们,这段时间没有经常更新我的博客,抱歉! 几何数据访问是编写Revit...§第二部分:对象几何关系判断 §射线法 §相交法 §已有API判断对象关系   Enjoy it,希望对大家的学习有帮助!祝大家工作愉快!
  • 二元关系关系性质判断

    千次阅读 多人点赞 2018-06-08 22:00:19
    今天离散老师布置了一个编程作业:用代码实现关系性质的判断。然后我就结合所学知识写了写,如果哪里有不足欢迎批评指正。自反性:∀x∈A,有&lt;x,x&gt;∈R。关系矩阵特点:主对角线元素全为1.关系图的特点...
  • JAVA isAssignableFrom 判断父子关系

    千次阅读 2017-04-12 14:18:58
    Java.lang.Class 全类名 isAssignableFrom针对class对象,可以用来校验一个类... 是用来判断一个类Class1和另一个类Class2是否相同或是另一个类的超类或接口。  通常调用格式是 Class1.isAssignableFrom(Class2)
  • C语言判断关系R是否为自反关系

    千次阅读 2020-03-19 21:58:19
    判断关系R是否为自反关系。键盘输入R的关系序偶,程序输出判断结果 #include <stdio.h> #include <stdlib.h> //输入关系 void input(char **a,int n) { int x,y; printf("输入关系,使用1~n之间的整数,...
  • java面向对象-判断点和圆的关系

    千次阅读 2018-03-09 16:38:19
    20180308 java java面向对象-判断点和圆的关系判断点和圆的关系(在圆外、在圆周上、在圆内)//练习程序//点对象class Point{ private int x;//横坐标 private int y;//纵坐标 Point(int x,int y) { this.x = x;...
  • 因果关系判断

    千次阅读 2020-06-29 15:56:45
    最简单的方法是从相关性,先后顺序,排除干扰因素三个方面下手 ...所以可以看出,判断因果其实是个逻辑过程。 ----------------------------------------------------------------------------------------------
  • 离散数学实验:关系性质判断

    千次阅读 2020-05-08 19:23:35
    熟悉关系的性质,掌握求判断关系性质的方法。 二、实验内容 本实验要求从键盘输入一个关系关系矩阵,判断关系是否是自反的、对称的、传递的、反自反的、反对称的。用C语言或MATLAB实现。 三、实验源程序 #...
  • JTS Geometry空间关系判断

    千次阅读 2018-11-06 09:51:31
    几何信息和拓扑关系是地理信息系统中描述地理要素的空间位置和空间关系的不可缺少的基本信息。其中几何信息主要涉及几何目标的坐标位置、方向、角度、距离和面积等信息,它通常用解析几何的方法来分析。而空间关系...
  • 判断点与向量位置关系

    千次阅读 2018-06-27 14:37:28
    工作中需要判断点与矢量的位置关系,即点在矢量左侧或者右侧,找了看了一下理论,其实就是简单的高中知识,只不过都忘差不多了,不过不难,直接上代码(JAVA)。package cn.xue.Algorithm; public class ...
  • 根据候选码判断关系F中的函数关系是否满足第二范式,若不满足则为关系模式的规范化最高为第一范式 然后判断是否存在非主属性传递依赖,如果存在则不满足第二范式,如果不存在则关系模式的规范化最高为第三范式. 通俗...
  • C++判断点和平面的位置关系

    千次阅读 2019-07-10 21:40:07
    点与平面的位置关系 ...判断某点和某平面的位置关系可以依照上面三个判断式,如下: 判断式 位置关系 Ax+By+Cz+D=0 点(x,y,z)在平面上 Ax+By+Cz+D>0 点(x,y,z)在正半空间 Ax+B...
  • 关于如何求数据库里的关系模式,教你 学会关系模式中的范式求解。
  • 点与直线的位置关系 判断两线段重合并计算其重合部分 判断合并两条线段 说明全都在注释里了,有的方法可能不是最佳,欢迎大家提出建议~~ public class Line : MonoBehaviour { Vector2 ...
  • c语言程序判断关系R在集合A是否等价、相容、偏序

    千次阅读 多人点赞 2019-11-11 21:51:53
    这是我们离散老师布置的第二次程序作业,...判断关系R在集合A是否等价、相容、偏序,也就是判断关系R是否满足自反,对称,反对称,传递这些性质。 等价:自反,对称,传递 相容:自反,对称 偏序:自反,反对称,传...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,140,814
精华内容 456,325
关键字:

关系判断