精华内容
下载资源
问答
  • 使用gdal计算点与圆相交的条件:   注意:以下方法以WKT格式为准。 1.圆形在GDAL中无法直接通过两个点位信息以及半径描述出来,需要自己通过构建圆形的方式才能拼凑出符合GDAL的图形描述,其中参数graph为图形...

    使用gdal计算点与圆相交的条件:

     

    注意:以下方法以WKT格式为准。

    1.圆形在GDAL中无法直接通过两个点位信息以及半径描述出来,需要自己通过构建圆形的方式才能拼凑出符合GDAL的图形描述,其中参数graph为图形描述信息
    eg:

        String graph="105.4471206665039,28.889448344707493,105.45038223266602,28.88773173093796"


     /**
         * 获得圆形的图形描述
         * @param graph

         * @return
         */
        protected String getCircle(String graph ){
            String[] points=graph.split(",");
            if (points.length==4){
                CirclePoint centerPoint=new CirclePoint();
                centerPoint.setLng(Double.parseDouble(points[0]));
                centerPoint.setLat(Double.parseDouble(points[1]));
                CirclePoint endPoint=new CirclePoint();
                endPoint.setLng(Double.parseDouble(points[2]));
                endPoint.setLat(Double.parseDouble(points[3]));
                centerPoint.setDistance(getRadius(centerPoint,endPoint));
                double sin=0.0;double cos=0.0; double x=0.0;double y=0.0;
                List<CirclePoint> list= new ArrayList<>();
                for (int i = 0; i <100 ; i++) {
                    sin=Math.sin((6.2831853071795862 * i) / 100.0);
                    cos = Math.cos((6.2831853071795862 * i) / 100.0);
                    x = centerPoint.getLng() + (centerPoint.getDistance() * sin);
                    y = centerPoint.getLat() + (centerPoint.getDistance() * cos);
                    CirclePoint point =new CirclePoint();
                    point.setLng(x);
                    point.setLat(y);
                    list.add(point);
                }
                String graphinfo="POLYGON((";
                for (int i = 0; i < list.size() ; i++) {
                    if (i<list.size()-1){
                        CirclePoint circle =list.get(i);
                        graphinfo+=""+circle.getLng()+" "+circle.getLat()+",";
                    }else if (i==list.size()-1){
                        CirclePoint circle =list.get(i);
                        CirclePoint firstCircle=list.get(0);
                        graphinfo+=""+circle.getLng()+" "+circle.getLat()+","+firstCircle.getLng()+" "+firstCircle.getLat()+"))";
                    }
                }
                return graphinfo;
            }
            return "";
        }
         /**
         * 获取圆的半径
         * @param centerPoint
         * @param endPoint
         * @return
         */
        protected double getRadius(CirclePoint centerPoint,CirclePoint endPoint){
            double x1=centerPoint.getLng();
            double y1=centerPoint.getLat();
            double x2=endPoint.getLng();
            double y2=endPoint.getLat();
            double radius=Math.sqrt(Math.pow((x1-x2),2)+Math.pow((y1-y2),2));
            return radius;
        }
        
        
        
        
        
        2.多边形也需要拼装成符合wkt格式,其中该方法的参数golygon为图形描述信息
        eg:
        String golygon="105.43652057647705,28.886371180415154,105.44085502624512,28.8847403973341,105.43368816375732,28.88375334441662“
         /**
         * 拼装多边形wkt格式
         * @param golygon
         * @return
         */
        protected String dealWithPolygon(String golygon){
            String[] points=golygon.split(",");
            String graph="";
            for (int i = 0; i <points.length ; i++) {
                if(i==0){
                    graph="POLYGON(("+points[0]+" ";
                }else if (i>0&&(i%2==0)){
                    graph+=points[i]+" ";
                }else if(i>0&&(i%2)==1){
                    if (i!=points.length-1){
                        graph+=points[i]+",";
                    }else {
                        graph+=points[i]+"))";
                    }
                }
            }
            return graph;
        }

        3.如何在拼装好WKT格式后使用gdal,调用Geometry的Intersect方法判断是否相交
        //根据判断图形是多边形还是圆形来判断多边形 拼装wkt
          if ("POLYGON".equals(graphinfo.getType())){
                        ploygonStr=dealWithPolygon(graphinfo.getGraph());
                    }
                    if ("POINT".equals(graphinfo.getType())){
                        ploygonStr=getCircle(graphinfo.getGraph());
                    }
                    try {
                        Geometry ploygon =Geometry.CreateFromWkt(ploygonStr);
                        if (ployPoint.Intersect(ploygon)){
                            source.setPassuuid(graphinfo.getUuid());
                            resultList.add(source);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

    展开全文
  • 判断图形相交 一个简单的例子:在平面坐标里有四个圆分别以(2,2),(2,-2),(-2,-2),(-2,2)为圆心,现取平面内任意一点,问其是否落于圆内。 算法思路:四个圆关于原点中心对称,可以对所求点取绝对值,...

    判断图形相交
    一个简单的例子:在平面坐标里有四个圆分别以(2,2),(2,-2),(-2,-2),(-2,2)为圆心,现取平面内任意一点,问其是否落于圆内。
    算法思路:四个圆关于原点中心对称,可以对所求点取绝对值,放在第一象限内求解,若所求点与圆心距离小于半径,则其落于圆上。
    伪代码:
    double a,b;
    scanf("%d%d",&a,&b);
    a=fabs(a);
    b=fabs(b);
    if((a-2)(a-2)+(b-2)(b-2)<=1)
    printf(”所取的点落于圆上”);
    else
    printf(“所取的点落于圆外”);

    如何判断两个矩形是否相交可以采取类似的思想,用easyx所做的矩形有四个参数,分别代表矩形左上角和右下角的点。当两矩形相交(相切也算在内)则两个矩形x轴两点最大距离之差小于等于其长度之和,同理y轴坐标之差也小于等于其长度之和。
    例如:
    rectangle(a,b,c,d);
    rectangle(w,x,y,z);
    if(fab(c-a)+fab(y-w)<=fab(y-a)&&fab(d-b)+fab(z-x)<=fab(z-b))
    printf(”两矩形相交”);

    展开全文
  • //将直线写成y=kx+b的形式,将图形的所有顶点坐标带入y-kx-b, //如果得到的结果同时大于零或者同时小于零,说明图形的所有顶点都在直线的同侧,即直线不过图形。否则说明图形的顶点分布在直线两侧,直线过图形 ...

    之前遇到一个数学问题,如何判断某一线段是否穿过封闭区域?由于很急,在网上胡乱找了一下解决方案,但是没有解决到实际问题。

    已知:矩形的四个顶点,线段的起始点,

    求:判断线段是否经过改矩形。(如图,红线穿过封闭区域,绿线不穿过封闭区域。)

     

     问题类似于 如何判断某一线段是否穿过封闭区域?  道理就是那个道理,我在那里拿的图。

    由于时间关系,我就叫同事帮我写个通用方法,他略微思索,百度了一下,觉得用中学知识就可以解决这个问题,欣然就答应了。代码如下:

        public static bool IsPassThroughRect(List<Vector2> VectList, Vector2 begin, Vector2 end)
        {
            //求直线公式
            double k, b;
            k = (begin.y - end.y) / (begin.x - end.x);
            b = begin.y - begin.x * k;
            int count = 0;
            for (int i = 0; i < VectList.Count; i++)
            {
                if ((VectList[i].y - k * VectList[i].x - b) > 0)
                    count++;
                else
                    count--;
            }
            if (count == 4 || count == -4)
                return false;
            else
                return true;
        }

      他给我解释了一下:

        将直线写成y=kx+b的形式,将图形的所有顶点坐标带入y-kx-b。

        如果得到的结果同时大于零或者同时小于零,说明图形的所有顶点都在直线的同侧,即直线不过图形。否则说明图形的顶点分布在直线两侧,直线过图形。

        主要是思想就是中学知识:

    (1)y-kx-b=0  点刚好在直线上。

    (2)y-kx-b>0  点在直线上方。

    (3)y-kx-b<0  点在直线下方。

    我看了一下,好像是这个道理,直接将参数传进去,测试了一下,结果发现,这个道理虽然是这个道理,但是所用的知识是点与线的关系。这里的需求是线段与矩形的关系,如果是线段的话,这样是不满足需求的。

    发现这个问题的时候,都十点半了,其他同事都下班了,看见主程还在,遂问了一下是否有类似的通用方法,结果真有!

    代码如下:

     /// <summary>
        /// 线段与矩形是否相交
        /// </summary>
        /// <param name="linePointX1"></param>
        /// <param name="linePointY1"></param>
        /// <param name="linePointX2"></param>
        /// <param name="linePointY2"></param>
        /// <param name="rectangleLeftTopX"></param>
        /// <param name="rectangleLeftTopY"></param>
        /// <param name="rectangleRightBottomX"></param>
        /// <param name="rectangleRightBottomY"></param>
        /// <returns></returns>
        public static bool isLineIntersectRectangle(float linePointX1,
                                          float linePointY1,
                                        float linePointX2,
                                         float linePointY2,
                                         float rectangleLeftTopX,
                                          float rectangleLeftTopY,
                                          float rectangleRightBottomX,
                                          float rectangleRightBottomY)
        {
            float lineHeight = linePointY1 - linePointY2;
            float lineWidth = linePointX2 - linePointX1;  // 计算叉乘 
            float c = linePointX1 * linePointY2 - linePointX2 * linePointY1;
            if ((lineHeight * rectangleLeftTopX + lineWidth * rectangleLeftTopY + c >= 0 && lineHeight * rectangleRightBottomX + lineWidth * rectangleRightBottomY + c <= 0)
                || (lineHeight * rectangleLeftTopX + lineWidth * rectangleLeftTopY + c <= 0 && lineHeight * rectangleRightBottomX + lineWidth * rectangleRightBottomY + c >= 0)
                || (lineHeight * rectangleLeftTopX + lineWidth * rectangleRightBottomY + c >= 0 && lineHeight * rectangleRightBottomX + lineWidth * rectangleLeftTopY + c <= 0)
                || (lineHeight * rectangleLeftTopX + lineWidth * rectangleRightBottomY + c <= 0 && lineHeight * rectangleRightBottomX + lineWidth * rectangleLeftTopY + c >= 0))
            {
    
                if (rectangleLeftTopX > rectangleRightBottomX)
                {
                    float temp = rectangleLeftTopX;
                    rectangleLeftTopX = rectangleRightBottomX;
                    rectangleRightBottomX = temp;
                }
                if (rectangleLeftTopY < rectangleRightBottomY)
                {
                    float temp1 = rectangleLeftTopY;
                    rectangleLeftTopY = rectangleRightBottomY;
                    rectangleRightBottomY = temp1;
                }
                if ((linePointX1 < rectangleLeftTopX && linePointX2 < rectangleLeftTopX)
                    || (linePointX1 > rectangleRightBottomX && linePointX2 > rectangleRightBottomX)
                    || (linePointY1 > rectangleLeftTopY && linePointY2 > rectangleLeftTopY)
                    || (linePointY1 < rectangleRightBottomY && linePointY2 < rectangleRightBottomY))
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
            else
            {
                return false;
            }
    
        }

    他说他也是在网上扒下来的,我没细想,直接改成通用方法,传入我的参数,测试了几次,发现问题解决了。愉快下班!!!

    今天发现(判断线段和矩形是否相交 )这篇文章好像就是原文,只是他是用JavaScript写的。大概就是扒的他了吧!

     

    展开全文
  • 前几天面试的时候被问到了,如何随机在三角形内生成点,我...1.判断一个点是否在多边形内首先先说一下输入的内容,多边形的顶点是一个数组输入进来,其中每个相邻点之间对应着多边形上有边相连POINT p1 = ptPolygon[i

    前几天面试的时候被问到了,如何随机在三角形内生成点,我按照我的想法回答了一遍,但觉得回答的不够好。最后面试官说了一个最优的方法。觉得不错,顺带总结一下最近看到的一些关于计算机图形学方面的经典小题,知乎上看到的还有Leetcode上的

    1.判断一个点是否在多边形内

    首先先说一下输入的内容,多边形的顶点是一个数组输入进来,其中每个相邻点之间对应着多边形上有边相连

    POINT p1 = ptPolygon[i];
    POINT p2 = ptPolygon[(i + 1) % nCount];

    即上面两个点之间存在边相连

    判断是否在凸多边形内部

    这个方法我记得是在编程之美上看到的,即计算该点与多边形点之间向量的叉积,如果叉积同向则说明在内部,如果有反向则说明在外部。
    这里写图片描述
    比如上面这个图,分别计算PA,PB 的叉积 PB,PC 的叉积 PC,PA的叉积
    如果其都是同向的,则说明其在内部,如果不是同向的,则说明在外部。
    这个算法复杂度是O(n)的,n是多边的顶点数

    判断是否在任意多边形内部

    一个经典的算法是射线法

    • 从该点P出发向任意方向射出一条射线, 如果与多边形的边相交的数量为奇数个,则说明其在内部,如果相交个数为偶数个则在内部
    • 一般为了计算方便就选择从P点向x轴向右方向上的射线,而判断相交只用求出交点的横坐标看起是否大于P.x的坐标就好

      具体的算法实现见这个判断点是否在多边形内的算法和C语言程序

    2.随机生成三角形内的点

    这个是被面试官问到的题目,我的做法是先将三角形的外围用一个矩形给括起来,然后对矩形内的点进行随机采样,采样出来的点用上面1中的方法判断是否在三角形内。如果不在则继续采样。
    面试官对此不是很满意,后来我想出来可以通过左边轴变换的方式进行,但是回答的也不好
    最后面试官说了自己的方法:
    这里写图片描述
    网上找了一个图将就着看吧
    其实这个方法也是坐标轴转换的思想,我之前想到的已经比较接近了,只不过没有往向量这块去考虑。
    即由之前的xy坐标系转换为以三角形的两条边为基底的坐标系,如上图所示转换为OA,OB作为坐标的表示,所以OP=tOA+kOB如果0<t,k<1的话其在OA,OB组成的平行四边形内,判断P点是否在三角形内只用判断t+k<1即可,如果在三角形内则采样成功,如果不在三角形内则可以再次采样,还有更精妙的算法,就是将超出的点重新映射到这个三角形内即可将其变为OP=(1t)OA+(1k)OB即可,推导非常简单,可以自己尝试一下,思路是如果超出三角形的话,可以将其看成O点对应平行四边形的顶点C点进行生成的落在ΔOAB内的的点,而C点本身可以看成OA+OB得到

    一个非常容易的易错点

    这道题一个非常经典的易错思路是:比如上面的方法先随机生成t,然后再在(0,1-t)的区间内生成k点。
    因为这种不随机:
    比如假设t生成的结果非常接近于1,如果按照原始的方法则会出现大概率出现采样超过原来三角形的情况,而在这种采样的方式之下,必然会采样成功。

    3.判断一个圆形和矩形是否相交

    这道题是今天知乎上看到的:
    怎样判断平面上一个矩形和一个圆形是否有重叠?
    具体的算法也非常简单易懂,但是非常的巧妙。
    我总结一下巧妙的地方在于:

    1. 先通过一个变换,将圆形变到了矩形的右上角,
    2. 通过向量,外加取最大值来巧妙的求得了圆形到矩形的最短距离【所以这个题目的简化版本可以用来求解圆形到矩形的最短距离】

    4.判断两个矩形是否相交并求相交部分面积

    Leetcode上有这道题:
    223. Rectangle Area
    我一开始的思路是,类比与上面那道题,将第二个矩形换到第一个矩形右上角,然后判断以第一个矩形右顶点为坐标原点时,第二个矩形的左下角是否落在了第三象限。这样用来判断是否相交还是不错的,但是求面积就不行了,比如如下的图
    这里写图片描述

    然后翻Leecode的discuss,底下最高票答案给的方法一时没看明白

    int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
        int left = max(A,E), right = max(min(C,G), left);
        int bottom = max(B,F), top = max(min(D,H), bottom);
        return (C-A)*(D-B) - (right-left)*(top-bottom) + (G-E)*(H-F);
    }

    后来查到了另外一个人的博客,我觉得它讲的挺明白的: 判断两矩形是否相交
    这道题本质上相当于求两个矩形相交区域的横纵坐标

    int left = max(A,E);
    int bottom = max(B,F);

    这个是求得相交区域左下角的坐标的。如果不相交也是没有问题的
    这个可以这么看,即两个矩形的左边和下面两条边做直线延长,然后得到的相交区域一定是一个矩形,然后上面求得的坐标就是这个矩形的右上角
    同理,右边和上面四条边所在直线相交点的左下角为:

    int right = min(C,G);
    int top = min(D,H);

    在判断一下以上两个坐标点的相对位置,如果第一个在第二个左下角的话,则能够构成矩形,如果不是这种情况则不能构成矩形。

    展开全文
  • 用矢量的叉积判断直线段是否有交 矢量叉积计算的另一个常用用途是直线段求交。求交算法是计算机图形学的核心...直线(段)的求交算法相对来说是比较简单的,首先来看看如何判 断两直线段是否相交。 常规的代数...
  • 3.6 用矢量的叉积判断直线段是否有交 矢量叉积计算的另一个常用用途是直线段求交。求交算法是计算机图形学的核心算法...直线(段)的求交算法相对来说是比较简单的,首先来看看如何判断两直线段是否相交。 常规的代数
  • 图形学算法2

    千次阅读 2011-12-26 18:14:02
    3.6 用矢量的叉积判断直线段是否有交   矢量叉积计算的另一个常用用途是直线段求交。求交算法是计算机图形学的核心算法,...直线(段)的求交算法相对来说是比较简单的,首先来看看如何判断两直线段是否相交。  常
  • 3.6 用矢量的叉积判断直线段是否有交   矢量叉积计算的另一个常用用途是直线段求交。求交算法是计算机图形学的核心算法,也是...直线(段)的求交算法相对来说是比较简单的,首先来看看如何判断两直线段是否相交
  • 原文链接 3.6 用矢量的叉积判断直线段是否有交   矢量叉积计算的另一个常用用途是直线段求交。求交算法是计算机图形学的...直线(段)的求交算法相对来说是比较简单的,首先来看看如何判断两直线段是否相交
  • 使用图形界面描述矩形

    千次阅读 2014-06-04 17:56:07
    最近一直在想一些问题,如何在实例中运用算法,在网上看到许多人...我使用一个矩形结构,处理一些矩形中的参数,可以计算矩形的面积、判断两个矩形是否相交 首先搭建成下图所示的图形界面 然后修改控件的ID: 控
  • 3.6 用矢量的叉积判断直线段是否有交   矢量叉积计算的另一个常用用途是直线段求交。求交算法是计算机图形学的核心算法,也是...直线(段)的求交算法相对来说是比较简单的,首先来看看如何判断两直线段是否相交
  • 书中特别强调了使用每种符号或技术的原因,以及如何利用这些数学符号合理地描述图形程序中感兴趣的对象。  对编程水平的要求  一般情况下,读者应具有至少一个学期使用C、C++或Java编写程序的经验。相当多有关图形...
  • 所以一开始想的是要不就根据这些坐标判断是否相交得出拓扑关系,再组织一下形成矩阵。 同时问了下学计算机的朋友和老师,他们虽然不进行CAD二次开发,但是一致表示这些图形的拓扑信息就是以矩阵...
  • 游戏开发基础--碰撞检测

    千次阅读 2016-12-09 11:01:07
    碰撞就是游戏中的元素是否碰到一起,比如打飞机游戏,没躲避炮弹就算碰撞,要检测出来,要game over的。...那么如何判读两个矩形是否相交呢?   相交 == !(不相交),不相交较好判断,优先判读不相交再取反
  • 1.判断是否在多边形内部 判断p是否在多边形内部? 从p连一条到多边形外部的点的直线 看与所有多边形的边相交几次 若为奇数 则在内部 如何找外部的点? 找一个点x值比多边形的所有点x...
  • Spatialite操作Sql语句

    2019-11-08 16:27:39
    最近学习了Spatialite,如何使用Sql语句去操作空间数据,Sqlite属于轻量级的数据库,但也能满足我们正常简单的数据查询等操作,接下来我将会附上我这几天操作的心得和代码分享:...判断是否在线内查询相交: sele...
  • 方式:检测2鱼(圆)之间是否相切或相交判断2圆心之间的距离小于2圆半径之和。此处判断小于大嘴鱼的半径即可。让大嘴鱼可以吃掉小鱼。 类名称 RandomUtil 类描述 数学类-随机数生成类 包描述 tools 函数描述 public...
  • 于是,我们现在面临经济学中经常遇到的一个难题:如何使用二维的图形表达一个多维的函数关系?方程式212就是应用这种分析技巧进行简化的结果:  Qd=f(P,Ps,Pc,I,N,…) (2.1.2) 决定需求量的参数可分为两...

空空如也

空空如也

1 2
收藏数 25
精华内容 10
关键字:

如何判断图形是否相交