基础算法--计算几何

计算几何算法精要:从基础到高级应用 理解几何性质:利用向量、叉积等几何概念选择合适算法:根据问题特点选择扫描线、分治等范式处理特殊情况:考虑共线、重合等边界条件优化计算效率:利用空间索引或特殊数据结构验证正确性:通过几何直观验证算法“计算几何是连接数学理论与工程实践的桥梁!通过本文的系统学习,相信你已经掌握了计算几何的核心算法和实现技巧。记住,精通计算几何的关键在于:1) 扎实的几何直观;2) 熟练的算法实现;3) 丰富的应用经验。继续探索和实践,你将成为解决复杂几何问题的专家! 阅读详情

 

  • 一、引言

    计算机的出现使得很多原本十分繁琐的工作得以大幅度简化,但是也有一些在人们直观看来很容易的问题却需要拿出一套并不简单的通用解决方案,比如几何问题。作为计算机科学的一个分支,计算几何主要研究解决几何问题的算法。在现代工程和数学领域,计算几何在图形学、机器人技术、超大规模集成电路设计和统计等诸多领域有着十分重要的应用。在本文中,我们将对计算几何常用的基本算法做一个全面的介绍,希望对您了解并应用计算几何的知识解决问题起到帮助。

    二、目录

    本文整理的计算几何基本概念和常用算法包括如下内容:

    矢量的概念

    矢量加减法

    矢量叉积

    折线段的拐向判断

    判断点是否在线段上

    判断两线段是否相交

    判断线段和直线是否相交

    判断矩形是否包含点

    判断线段、折线、多边形是否在矩形中

    判断矩形是否在矩形中

    判断圆是否在矩形中

    判断点是否在多边形中

    判断线段是否在多边形内

    判断折线是否在多边形内

    判断多边形是否在多边形内

    判断矩形是否在多边形内

    判断圆是否在多边形内

    判断点是否在圆内

    判断线段、折线、矩形、多边形是否在圆内

    判断圆是否在圆内

    计算点到线段的最近点

    计算点到折线、矩形、多边形的最近点

    计算点到圆的最近距离及交点坐标

    计算两条共线的线段的交点

    计算线段或直线与线段的交点

    求线段或直线与折线、矩形、多边形的交点

    求线段或直线与圆的交点

    凸包的概念

    凸包的求法

    三、算法介绍

    矢量的概念:

    如果一条线段的端点是有次序之分的,我们把这种线段成为有向线段(directed segment)。如果有向线段p1p2的起点p1在坐标原点,我们可以把它称为矢量(vector)p2。

    矢量加减法:

    设二维矢量P = ( x1, y1 ),Q = ( x2 , y2 ),则矢量加法定义为: P + Q = ( x1 + x2 , y1 + y2 ),同样的,矢量减法定义为: P - Q = ( x1 - x2 , y1 - y2 )。显然有性质 P + Q = Q + P,P - Q = - ( Q - P )。

    矢量叉积:

    计算矢量叉积是与直线和线段相关算法的核心部分。设矢量P = ( x1, y1 ),Q = ( x2, y2 ),则矢量叉积定义为由(0,0)、p1、p2和p1+p2所组成的平行四边形的带符号的面积,即:P × Q = x1*y2 - x2*y1,其结果是一个标量。显然有性质 P × Q = - ( Q × P ) 和 P × ( - Q ) = - ( P × Q )。一般在不加说明的情况下,本文下述算法中所有的点都看作矢量,两点的加减法就是矢量相加减,而点的乘法则看作矢量叉积。

    叉积的一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系:

    若 P × Q > 0 , 则P在Q的顺时针方向。

    若 P × Q < 0 , 则P在Q的逆时针方向。

    若 P × Q = 0 , 则P与Q共线,但可能同向也可能反向。

    折线段的拐向判断:

    折线段的拐向判断方法可以直接由矢量叉积的性质推出。对于有公共端点的线段p0p1和p1p2,通过计算(p2 - p0) × (p1 - p0)的符号便可以确定折线段的拐向:

    若(p2 - p0) × (p1 - p0) > 0,则p0p1在p1点拐向右侧后得到p1p2。

    若(p2 - p0) × (p1 - p0) < 0,则p0p1在p1点拐向左侧后得到p1p2。

    若(p2 - p0) × (p1 - p0) = 0,则p0、p1、p2三点共线。

    具体情况可参照下图:

       

     

    判断点是否在线段上:

    设点为Q,线段为P1P2 ,判断点Q在该线段上的依据是:( Q - P1 ) × ( P2 - P1 ) = 0 且 Q 在以 P1,P2为对角顶点的矩形内。前者保证Q点在直线P1P2上,后者是保证Q点不在线段P1P2的延长线或反向延长线上,对于这一步骤的判断可以用以下过程实现:

    ON-SEGMENT(pi,pj,pk)

    if min(xi,xj) <= xk <= max(xi,xj) and min(yi,yj) <= yk <= max(yi,yj)

    then return true;

    else return false;

    特别要注意的是,由于需要考虑水平线段和垂直线段两种特殊情况,min(xi,xj)<=xk<=max(xi,xj)和min(yi,yj)<=yk<=max(yi,yj)两个条件必须同时满足才能返回真值。

    判断两线段是否相交:

    我们分两步确定两条线段是否相交:

    (1)快速排斥试验

    设以线段 P1P2 为对角线的矩形为R, 设以线段 Q1Q2 为对角线的矩形为T,如果R和T不相交,显然两线段不会相交。

    (2)跨立试验

     

    如果两线段相交,则两线段必然相互跨立对方。若P1P2跨立Q1Q2 ,则矢量 ( P1 - Q1 ) 和( P2 - Q1 )位于矢量( Q2 - Q1 ) 的两侧,即( P1 - Q1 ) × ( Q2 - Q1 ) * ( P2 - Q1 ) × ( Q2 - Q1 ) < 0。上式可改写成( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) > 0。当 ( P1 - Q1 ) × ( Q2 - Q1 ) = 0 时,说明 ( P1 - Q1 ) 和 ( Q2 - Q1 )共线,但是因为已经通过快速排斥试验,所以 P1 一定在线段 Q1Q2上;同理,( Q2 - Q1 ) ×(P2 - Q1 ) = 0 说明 P2 一定在线段 Q1Q2上。所以判断P1P2跨立Q1Q2的依据是:( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0。同理判断Q1Q2跨立P1P2的依据是:( Q1 - P1 ) × ( P2 - P1 ) * ( P2 - P1 ) × ( Q2 - P1 ) >= 0。具体情况如下图所示:

       

     

    在相同的原理下,对此算法的具体的实现细节可能会与此有所不同,除了这种过程外,大家也可以参考《算法导论》上的实现。

    判断线段和直线是否相交:

    有了上面的基础,这个算法就很容易了。如果线段P1P2和直线Q1Q2相交,则P1P2跨立Q1Q2,即:( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) >= 0。

    判断矩形是否包含点:

    只要判断该点的横坐标和纵坐标是否夹在矩形的左右边和上下边之间。

        

    判断线段、折线、多边形是否在矩形中:

    因为矩形是个凸集,所以只要判断所有端点是否都在矩形中就可以了。

    判断矩形是否在矩形中:

    只要比较左右边界和上下边界就可以了。

    判断圆是否在矩形中:

    很容易证明,圆在矩形中的充要条件是:圆心在矩形中且圆的半径小于等于圆心到矩形四边的距离的最小值。

    判断点是否在多边形中:

    判断点P是否在多边形中是计算几何中一个非常基本但是十分重要的算法。以点P为端点,向左方作射线L,由于多边形是有界的,所以射线L的左端一定在多边形外,考虑沿着L从无穷远处开始自左向右移动,遇到和多边形的第一个交点的时候,进入到了多边形的内部,遇到第二个交点的时候,离开了多边形,……所以很容易看出当L和多边形的交点数目C是奇数的时候,P在多边形内,是偶数的话P在多边形外。

    但是有些特殊情况要加以考虑。如图下图(a)(b)(c)(d)所示。在图(a)中,L和多边形的顶点相交,这时候交点只能计算一个;在图(b)中,L和多边形顶点的交点不应被计算;在图(c)和(d) 中,L和多边形的一条边重合,这条边应该被忽略不计。如果L和多边形的一条边重合,这条边应该被忽略不计。

        

     

    为了统一起见,我们在计算射线L和多边形的交点的时候,1。对于多边形的水平边不作考虑;2。对于多边形的顶点和L相交的情况,如果该顶点是其所属的边上纵坐标较大的顶点,则计数,否则忽略;3。对于P在多边形边上的情形,直接可判断P属于多边行。由此得出算法的伪代码如下:

     

        count ← 0;

        以P为端点,作从右向左的射线L; 

        for 多边形的每条边s

         do if P在边s上 

              then return true;

            if s不是水平的

              then if s的一个端点在L上

                     if 该端点是s两端点中纵坐标较大的端点

                       then count ← count+1

                   else if s和L相交

                     then count ← count+1;

        if count mod 2 = 1 

          then return true;

        else return false;

     

     

    其中做射线L的方法是:设P'的纵坐标和P相同,横坐标为正无穷大(很大的一个正数),则P和P'就确定了射线L。

    判断点是否在多边形中的这个算法的时间复杂度为O(n)。

    另外还有一种算法是用带符号的三角形面积之和与多边形面积进行比较,这种算法由于使用浮点数运算所以会带来一定误差,不推荐大家使用。

    判断线段是否在多边形内:

    线段在多边形内的一个必要条件是线段的两个端点都在多边形内,但由于多边形可能为凹,所以这不能成为判断的充分条件。如果线段和多边形的某条边内交(两线段内交是指两线段相交且交点不在两线段的端点),因为多边形的边的左右两侧分属多边形内外不同部分,所以线段一定会有一部分在多边形外(见图a)。于是我们得到线段在多边形内的第二个必要条件:线段和多边形的所有边都不内交。

    线段和多边形交于线段的两端点并不会影响线段是否在多边形内;但是如果多边形的某个顶点和线段相交,还必须判断两相邻交点之间的线段是否包含于多边形内部(反例见图b)。

       

     

    因此我们可以先求出所有和线段相交的多边形的顶点,然后按照X-Y坐标排序(X坐标小的排在前面,对于X坐标相同的点,Y坐标小的排在前面,这种排序准则也是为了保证水平和垂直情况的判断正确),这样相邻的两个点就是在线段上相邻的两交点,如果任意相邻两点的中点也在多边形内,则该线段一定在多边形内。

    证明如下:

    命题1:

    如果线段和多边形的两相邻交点P1 ,P2的中点P' 也在多边形内,则P1, P2之间的所有点都在多边形内。

        

    证明:

    假设P1,P2之间含有不在多边形内的点,不妨设该点为Q,在P1, P'之间,因为多边形是闭合曲线,所以其内外部之间有界,而P1属于多边行内部,Q属于多边性外部,P'属于多边性内部,P1-Q-P'完全连续,所以P1Q和QP'一定跨越多边形的边界,因此在P1,P'之间至少还有两个该线段和多边形的交点,这和P1P2是相邻两交点矛盾,故命题成立。证毕。

    由命题1直接可得出推论:

    推论2:

    设多边形和线段PQ的交点依次为P1,P2,……Pn,其中Pi和Pi+1是相邻两交点,线段PQ在多边形内的充要条件是:P,Q在多边形内且对于i =1, 2,……, n-1,Pi ,Pi+1的中点也在多边形内。

     

    在实际编程中,没有必要计算所有的交点,首先应判断线段和多边形的边是否内交,倘若线段和多边形的某条边内交则线段一定在多边形外;如果线段和多边形的每一条边都不内交,则线段和多边形的交点一定是线段的端点或者多边形的顶点,只要判断点是否在线段上就可以了。

     

    至此我们得出算法如下:

     

        if 线端PQ的端点不都在多边形内 

          then return false;

        点集pointSet初始化为空;

        for 多边形的每条边s

          do if 线段的某个端点在s上

               then 将该端点加入pointSet;

             else if s的某个端点在线段PQ上

               then 将该端点加入pointSet;

             else if s和线段PQ相交 // 这时候已经可以肯定是内交了

               then return false;

        将pointSet中的点按照X-Y坐标排序;

        for pointSet中每两个相邻点 pointSet[i] , pointSet[ i+1]

          do if pointSet[i] , pointSet[ i+1] 的中点不在多边形中

               then return false;

        return true;

     

    这个过程中的排序因为交点数目肯定远小于多边形的顶点数目n,所以最多是常数级的复杂度,几乎可以忽略不计。因此算法的时间复杂度也是O(n)。

    判断折线是否在多边形内:

    只要判断折线的每条线段是否都在多边形内即可。设折线有m条线段,多边形有n个顶点,则该算法的时间复杂度为O(m*n)。

    判断多边形是否在多边形内:

    只要判断多边形的每条边是否都在多边形内即可。判断一个有m个顶点的多边形是否在一个有n个顶点的多边形内复杂度为O(m*n)。

    判断矩形是否在多边形内:

    将矩形转化为多边形,然后再判断是否在多边形内。

    判断圆是否在多边形内:

    只要计算圆心到多边形的每条边的最短距离,如果该距离大于等于圆半径则该圆在多边形内。计算圆心到多边形每条边最短距离的算法在后文阐述。

    判断点是否在圆内:

    计算圆心到该点的距离,如果小于等于半径则该点在圆内。

    判断线段、折线、矩形、多边形是否在圆内:

    因为圆是凸集,所以只要判断是否每个顶点都在圆内即可。

    判断圆是否在圆内:

    设两圆为O1,O2,半径分别为r1, r2,要判断O2是否在O1内。先比较r1,r2的大小,如果r1<r2则O2不可能在O1内;否则如果两圆心的距离大于r1 - r2 ,则O2不在O1内;否则O2在O1内。

    计算点到线段的最近点:

    如果该线段平行于X轴(Y轴),则过点point作该线段所在直线的垂线,垂足很容易求得,然后计算出垂足,如果垂足在线段上则返回垂足,否则返回离垂足近的端点;如果该线段不平行于X轴也不平行于Y轴,则斜率存在且不为0。设线段的两端点为pt1和pt2,斜率为:k = ( pt2.y - pt1. y ) / (pt2.x - pt1.x );该直线方程为:y = k* ( x - pt1.x) + pt1.y。其垂线的斜率为 - 1 / k,垂线方程为:y = (-1/k) * (x - point.x) + point.y 。

    联立两直线方程解得:x = ( k^2 * pt1.x + k * (point.y - pt1.y ) + point.x ) / ( k^2 + 1) ,y = k * ( x - pt1.x) + pt1.y;然后再判断垂足是否在线段上,如果在线段上则返回垂足;如果不在则计算两端点到垂足的距离,选择距离垂足较近的端点返回。

    计算点到折线、矩形、多边形的最近点:

    只要分别计算点到每条线段的最近点,记录最近距离,取其中最近距离最小的点即可。

    计算点到圆的最近距离及交点坐标:

    如果该点在圆心,因为圆心到圆周任一点的距离相等,返回UNDEFINED。

    连接点P和圆心O,如果PO平行于X轴,则根据P在O的左边还是右边计算出最近点的横坐标为centerPoint.x - radius 或 centerPoint.x + radius。如果PO平行于Y轴,则根据P在O的上边还是下边计算出最近点的纵坐标为 centerPoint.y -+radius或 centerPoint.y - radius。如果PO不平行于X轴和Y轴,则PO的斜率存在且不为0,这时直线PO斜率为k = ( P.y - O.y )/ ( P.x - O.x )。直线PO的方程为:y = k * ( x - P.x) + P.y。设圆方程为:(x - O.x ) ^2 + ( y - O.y ) ^2 = r ^2,联立两方程组可以解出直线PO和圆的交点,取其中离P点较近的交点即可。

    计算两条共线的线段的交点:

    对于两条共线的线段,它们之间的位置关系有下图所示的几种情况。图(a)中两条线段没有交点;图 (b) 和 (d) 中两条线段有无穷焦点;图 (c) 中两条线段有一个交点。设line1是两条线段中较长的一条,line2是较短的一条,如果line1包含了line2的两个端点,则是图(d)的情况,两线段有无穷交点;如果line1只包含line2的一个端点,那么如果line1的某个端点等于被line1包含的line2的那个端点,则是图(c)的情况,这时两线段只有一个交点,否则就是图(b)的情况,两线段也是有无穷的交点;如果line1不包含line2的任何端点,则是图(a)的情况,这时两线段没有交点。

     

    计算线段或直线与线段的交点:

    设一条线段为L0 = P1P2,另一条线段或直线为L1 = Q1Q2 ,要计算的就是L0和L1的交点。

     

    1. 首先判断L0和L1是否相交(方法已在前文讨论过),如果不相交则没有交点,否则说明L0和L1一定有交点,下面就将L0和L1都看作直线来考虑。

    2. 如果P1和P2横坐标相同,即L0平行于Y轴

    a) 若L1也平行于Y轴,

    i. 若P1的纵坐标和Q1的纵坐标相同,说明L0和L1共线,假如L1是直线的话他们有无穷的交点,假如L1是线段的话可用"计算两条共线线段的交点"的算法求他们的交点(该方法在前文已讨论过);

    ii. 否则说明L0和L1平行,他们没有交点;

    b) 若L1不平行于Y轴,则交点横坐标为P1的横坐标,代入到L1的直线方程中可以计算出交点纵坐标;

    3. 如果P1和P2横坐标不同,但是Q1和Q2横坐标相同,即L1平行于Y轴,则交点横坐标为Q1的横坐标,代入到L0的直线方程中可以计算出交点纵坐标;

    4. 如果P1和P2纵坐标相同,即L0平行于X轴

    a) 若L1也平行于X轴,

    i. 若P1的横坐标和Q1的横坐标相同,说明L0和L1共线,假如L1是直线的话他们有无穷的交点,假如L1是线段的话可用"计算两条共线线段的交点"的算法求他们的交点(该方法在前文已讨论过);

    ii. 否则说明L0和L1平行,他们没有交点;

    b) 若L1不平行于X轴,则交点纵坐标为P1的纵坐标,代入到L1的直线方程中可以计算出交点横坐标;

    5. 如果P1和P2纵坐标不同,但是Q1和Q2纵坐标相同,即L1平行于X轴,则交点纵坐标为Q1的纵坐标,代入到L0的直线方程中可以计算出交点横坐标;

    6. 剩下的情况就是L1和L0的斜率均存在且不为0的情况

    a) 计算出L0的斜率K0,L1的斜率K1 ;

    b) 如果K1 = K2 

    i. 如果Q1在L0上,则说明L0和L1共线,假如L1是直线的话有无穷交点,假如L1是线段的话可用"计算两条共线线段的交点"的算法求他们的交点(该方法在前文已讨论过);

    ii. 如果Q1不在L0上,则说明L0和L1平行,他们没有交点。

     

    c) 联立两直线的方程组可以解出交点来

     

    这个算法并不复杂,但是要分情况讨论清楚,尤其是当两条线段共线的情况需要单独考虑,所以在前文将求两条共线线段的算法单独写出来。另外,一开始就先利用矢量叉乘判断线段与线段(或直线)是否相交,如果结果是相交,那么在后面就可以将线段全部看作直线来考虑。需要注意的是,我们可以将直线或线段方程改写为ax+by+c=0的形式,这样一来上述过程的部分步骤可以合并,缩短了代码长度,但是由于先要求出参数,这种算法将花费更多的时间。

    求线段或直线与折线、矩形、多边形的交点:

    分别求与每条边的交点即可。

    求线段或直线与圆的交点:

    设圆心为O,圆半径为r,直线(或线段)L上的两点为P1,P2。

    1. 如果L是线段且P1,P2都包含在圆O内,则没有交点;否则进行下一步。

    2. 如果L平行于Y轴,

    a) 计算圆心到L的距离dis;

    b) 如果dis > r 则L和圆没有交点;

    c) 利用勾股定理,可以求出两交点坐标,但要注意考虑L和圆的相切情况。

     

    3. 如果L平行于X轴,做法与L平行于Y轴的情况类似;

    4. 如果L既不平行X轴也不平行Y轴,可以求出L的斜率K,然后列出L的点斜式方程,和圆方程联立即可求解出L和圆的两个交点;

    5. 如果L是线段,对于2,3,4中求出的交点还要分别判断是否属于该线段的范围内。

    凸包的概念:

    点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上或者在其内。下图中由红色线段表示的多边形就是点集Q={p0,p1,...p12}的凸包。

     

       

    凸包的求法:

    现在已经证明了凸包算法的时间复杂度下界是O(n*logn),但是当凸包的顶点数h也被考虑进去的话,Krikpatrick和Seidel的剪枝搜索算法可以达到O(n*logh),在渐进意义下达到最优。最常用的凸包算法是Graham扫描法和Jarvis步进法。本文只简单介绍一下Graham扫描法,其正确性的证明和Jarvis步进法的过程大家可以参考《算法导论》。

    对于一个有三个或以上点的点集Q,Graham扫描法的过程如下:

    令p0为Q中Y-X坐标排序下最小的点 

    设<p1,p2,...pm>为对其余点按以p0为中心的极角逆时针排序所得的点集(如果有多个点有相同的极角,除了距p0最远的点外全部移除

    压p0进栈S

    压p1进栈S

    压p2进栈S

        for i ← 3 to m

          do while 由S的栈顶元素的下一个元素、S的栈顶元素以及pi构成的折线段不拐向左侧

            对S弹栈

          压pi进栈S

        return S;

    此过程执行后,栈S由底至顶的元素就是Q的凸包顶点按逆时针排列的点序列。需要注意的是,我们对点按极角逆时针排序时,并不需要真正求出极角,只需要求出任意两点的次序就可以了。而这个步骤可以用前述的矢量叉积性质实现。

    四、结语

    尽管人类对几何学的研究从古代起便没有中断过,但是具体到借助计算机来解决几何问题的研究,还只是停留在一个初级阶段,无论从应用领域还是发展前景来看,计算几何学都值得我们认真学习、加以运用,希望这篇文章能带你走进这个丰富多彩的世界。

     

    源文档 <http://dev.gameres.com/Program/Abstract/Geometry.htm>

     

计算几何基础算法几何C++实现 This file is implementation of Common Common Computational Geometry Algorithms.Please please pay attention to input according to the specified data type. 个人实现的一些计算几何中常见的算法,包括点,线,多边形等;所有算法只依赖于C++标准库,不... 阅读详情

相关推荐

计算几何:基础算法和应用

如果两条线段的端点分别为A、B和C、D,则它们相交的充要条件是向量AB和向量AC的叉积与向量AB和向量AD的叉积异号,且向量CD和向量CA的叉积与向量CD和向量CB的叉积异号。本文将介绍计算几何的基础算法,包括点和向量的表示、线段相交判定、凸包算法等,并展示使用C++代码实现这些算法的示例。计算几何是计算机科学中的一个重要领域,它涉及处理和分析几何对象的算法和数据结构。本文介绍了计算几何的基础算法和常见应用,包括点和向量的表示、线段相交判定、凸包算法和点在多边形内部判定。凸包算法用于计算给定点集的凸包。

YOLO 233

计算几何算法

v/:* {behavior:url(#default#VML);}o/:* {behavior:url(#default#VML);}w/:* {behavior:url(#default#VML);}.shape {behavior:url(#default#VML);} Normal 0 7.8 磅 0 2

lzj888777的专栏 788

GIS算法基础:计算几何基础

判断两条线的位置关系也是计算几何中的常见问题之一。计算几何是地理信息系统(GIS)中的关键概念之一。它涉及到在地理空间中进行几何计算和分析的技术和算法。在本文中,我们将探讨一些常见的计算几何基础算法,并提供相应的源代码示例。以上是计算几何基础中的两个常见算法示例。通过这些算法,我们可以判断点与线以及线与线之间的位置关系。这些算法在地理信息系统中的应用广泛,可以用于空间分析、地理数据处理等方面。判断一个点和一条线之间的关系是计算几何中常见的问题。希望本文对你理解GIS算法基础中的计算几何有所帮助。

MXMIMM的博客 328

[射线法]判断一个点是否在多边形内部

射线法判断一个点是否在多边形内部

0123 's blog 1万+

CGAL——C++计算几何算法库基础知识

CGAL(Computational Geometry Algorithms Library)是一个开源的C++计算几何算法库,其目的是为计算几何领域的算法和数据结构提供可靠的实现。本文将为大家介绍CGAL库的基础知识,并提供一些使用CGAL库实现常见计算几何算法的示例代码。本文介绍了CGAL库的基础知识,并提供了一些使用CGAL库实现常见计算几何算法的示例代码。在CGAL库中,点与向量是非常基础的概念,也是我们进行计算几何算法的基础。在计算几何算法中,线段与直线也是非常基础的概念。//判断点是否在圆内。

TechBlitzZ的博客 1912

Windows 10/11下彻底卸载Chrome的终极指南(附一键清理注册表脚本)

本文提供了一份在Windows 10/11系统中彻底卸载Google Chrome浏览器的终极指南。针对标准卸载后用户数据与注册表项残留的问题,文章详细介绍了从应用程序层、用户数据层到系统集成层的三层深度清理方法,并重点提供了安全高效的注册表清理脚本,确保浏览器所有痕迹被完全移除,解决重装冲突并释放磁盘空间。

elastic6hunter的博客 782

几种判断点是否在闭合区域内的方法

1、GDI+自带方法: GraphicsPath graphicsPath = new GraphicsPath(); Region region = new Region(); graphicsPath.Reset(); graphicsPath.AddPolygon(listPoint); region.MakeE...

weixin_36845145的博客 5538

INCA_ProF脚本教程

一、首先INCA软件是当前主流标定开发软件之一,尤其在动力系统控制器的标定中应用非常广泛;与此同时ProF编程脚本是INCA软件提供各种实用功能之一,使用者可根据需求编写ProF脚本语言对ECU闪存编程等各种自定义操作。 二、然而ProF脚本语言在ETAS的官网或其他网络上并没有专门的使用教程,通常只有ETAS技术支持人员提供的ProF Documentation文档或少量可参考的Demo案例,然而ProF Documentation文档仅涉及ProF语言的函数的操作说明,没有从全局的框架上介绍Pro

weixin_29389627的博客 1万+

判断点在闭合曲线内部还是外部的方法

1、原理 从目标点引一条射线,判断这条线与曲线的交点个数为奇数还是偶数,为奇数表示点在曲线外,偶数表示点在曲线内。实际计算的时候,只需要判断一侧即可。 C 代码: //xFlat为目标点,points为线段中的点 int nInsideFlag = 0; for (int pIdx = 0; pIdx < nLines; ++pIdx) { points->GetPoint(pIdx, p1); points->GetPoint(pIdx + 1, p2); fl

dfsrewgf的博客 3855

保姆级教程:用QSTEM和DrProbe搞定你的第一张STEM模拟图(附Fe3O4实例文件)

本文提供了一份详细的STEM模拟图像生成教程,涵盖从晶体结构获取到最终图像模拟的全过程。通过QSTEM和DrProbe软件的操作指南,帮助材料科学研究者快速掌握STEM模拟技术,特别适合初学者。教程包含Fe3O4实例文件,详细解析参数设置、计算优化和结果分析等关键步骤。

weixin_33730836的博客 523

因时机器人-灵巧手配置方案(Ubuntu18.04)

因时机器人-灵巧手配置方案(Ubuntu18.04)

CH_monsy的博客 3848

【任意多边形求布尔差运算】:直线、弧线都可以

请注意,这只是一个简单的示例代码,仅处理了直线段和弧线段的情况,并没有考虑更复杂的情况,例如多个交叉区域、重叠区域等。此外,代码中的弧线段处理部分仅是一个简单的示例,实际情况下需要根据具体需求进行适当的调整和优化。这只是一个简单的示例代码,用于展示处理带有弧线的多边形布尔交集的思路。分割的数量越多,近似的精度就越高。执行布尔运算:现在,可以使用标准的多边形布尔运算算法,如求交集、并集或差集,对构建的多边形进行操作。以下是一个更完整的示例代码,用于计算两个任意多边形的布尔交集,包括直线段和弧线段的处理。

qq_44859843的博客 1109

台式机ubuntu系统屏幕无法调节的问题(已解决)(汇总)

背景:新配了一台主机,安装了双系统,windows下屏幕在带鱼屏上显示良好,但Ubuntu系统屏幕拉伸严重。 问题描述:系统没有适应屏幕被整个拉伸了,进入设置界面,显示Built-in Display,分辨率只有1024*768无法设置。 尝试一:网上最多的方法就是使用xrandr, 结果显示:xrandr:Failed to get size of gamma for output default 尝试二: 第一次进入命令行页面:login:填你的用户面 password:使用字母上方的数字键输入你的密码

weixin_45626706的博客 4625

算法课程笔记——计算几何基础

算法课程笔记——计算几何基础。

2302_79123319的博客 928

使用PyTorch设计卷积神经网络(CNN)来处理遥感图像Indian Pines数据集

使用PyTorch设计卷积神经网络(CNN)来处理遥感图像Indian Pines数据集

XAX520_1314的博客 2490

PTA 学生信息的那些操作:添加记录(结构体)

这是河南工业大学自主命题的一道基础题,题目如下: 有一学生成绩表,包括学号、姓名、3门课程成绩。已知该成绩表按学号升序排序。请编程实现,添加一个新的学生信息,且使成绩表仍按学号有序;若待添加的学号与已有学号重复,则输出错误信息,拒绝添加。 输入格式: 首先输入一个整数n(1<=n<=100),表示学生人数; 然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及3个整数,表示3门课成绩,数据之间用空格隔开。 最后一行输入一个待添加的学生信息,包括学号

weixin_63617665的博客 3156

计算几何基础【用图来助你理解几何算法】

计算几何基础 1.基本概念 1.1计算几何的引入 ​ 计算几何是几何学的一个重要分支,也是计算机科学的一个分支,研究解决几何问题的算法。在现代工程与数学、计算机图形学、机器人学、VLSI设计、计算机辅助设计等学科领域中,计算几何都有重要应用。 计算几何问题的输入一般是关于一组几何物体(如点、线)的描述;输出常常是有关这些物体相关问题的回答,如直线是否相交、点围成的面积等问题。 1.2 浮点数造成的误差 ​ 在学习计算几何之前,我们来回顾一下高中知识,我们求直线方程,或者是交点时,经常出现根号多少多少,以至我

qq_45249273的博客 1万+

5、快速入门

点击启动实例按钮,并设计一个business key,每个实例会有一个business key, 业务主键,也相当于一个流程实例唯一key,一般会与一次业务强相关,比如一个订单号 ,此处取为shopping_1;付款程序完成后会流转到物流发货任务,此时java工程的相应订阅会收到任务,并进入断点,且读到到toWhere变量。单击shopping可以进入实时流程图的执行图,此时流程流转到第一个任务,需要业务系统完成此任务,并通知引擎。添加类,分别订阅流程中的加入购物车任务和物流发货任务。

leyoliu的博客 3501

计算几何基础算法——直线与直线求交

还是继续先写基础算法,有了基础算法,复杂算法就容易讲解了。我更希望自己像写书而不是写论文。书由浅入深,论文需要比较好的基础才能读懂。这篇文章中要介绍的直线与直线求交,是用的非常广泛的基础算法之一。像射线法、几何信息采样等很多算法都会用到该算法,它也可以用到曲线求交迭代过程中。本文介绍的算法,不会像中学数学中那样列方程组来求解,而是通过向量运算来求解。做几何算法一定要熟练掌握向量的各种运算和应用,直线与直线求交就是一个典型的应用场景。关于向量运算不熟悉的朋友可以查看下面这篇文章。

weixin_45387973的博客 1005

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

计算几何算法基础————判断线段相交

计算几何中最基本重要的算法之一~判断线段相交基础

SixDay 582

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

arcgis 批量计算几何_GIS算法基础(一) 计算几何基础(上)

最近在学习GIS算法,在学习过程中,想把一些经典的算法或者思想记录下来,分享给大家计算几何基础本来是计算机图形学的内容,但是GIS在图像处理中是离不开计算机处理的,所以GIS算法基础第一个应该是计算几何基础。如何把空间实体的点线面以及他们之间的关系(例如,相交,包含,邻接,叠置等等)用计算机语言表达出来,应该是这里解决的第一个问题。前人已经有过这样这样的解决模型---DE-9IM模型(Dimens...

weixin_39997310的博客 1264

计算几何基础算法

计算几何尽量避免除法,开根号等等损失精度的东西。 判断点是否在一个矩形内 :判断的方法非常简单就是根据点和矩形本身的位置关系即点的坐标位于矩形的坐标内部 即 (x > min (x1,x2) && x 判断点是否在园的内部 : 求一下点到圆心的距离,然后判断一下和半径的关系即可判断一点是否在直线上: 只需要看一下直线上任意一点到该点的向量叉该直线的方向向量是不是等于0就可以了。判断点是否在线段上

Glory 的 博客 809

GIS算法基础(一) 计算几何基础(上)

最近在学习GIS算法,在学习过程中,想把一些经典的算法或者思想记录下来,分享给大家   计算几何基础本来是计算机图形学的内容,但是GIS在图像处理中是离不开计算机处理的,所以GIS算法基础第一个应该是计算几何基础。 如何把空间实体的点线面以及他们之间的关系(例如,相交,包含,邻接,叠置等等)用计算机语言表达出来,应该是这里解决的第一个问题。前人已经有过这样这样的解决模型---DE-9IM模型...

ZzZzZzZ 2487
上一篇: 给对话框添加菜单 工具栏 状态栏简易方法
下一篇: 关于SelectObject的使用
liufei_learning
博客等级 码龄17年 821粉丝 145原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值