GIS开发常用算法原理分析

【GIS入门】- 1. 如何学习GIS? 文章目录一、搞明白什么是GIS?二、GIS工作方向三、GIS初学者要学什么?四、 如何提高专业基础知识五、GIS学习途径六、GIS技术栈学习图谱 作为一个想要在GIS领域内深入下去的初学者,内业研发方向,网上入门级别比较系统的资料不是很多,打算写一个GIS学习入门的专栏,一方面是让自己持续输出保持好记录总结的习惯,另一方面系统可以对有同样需求的读者一点帮助。 一、搞明白什么是GIS? GIS 是地... 阅读详情

摘要:

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

 

矢量的概念

如果一条线段的端点是有次序之分的,我们把这种线段成为有向线段(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) andmin(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的凸包(convexhull)是指一个最小凸多边形,满足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的凸包顶点按逆时针排列的点序列。需要注意的是,我们对点按极角逆时针排序时,并不需要真正求出极角,只需要求出任意两点的次序就可以了。而这个步骤可以用前述的矢量叉积性质实现。

 

结语

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

 

 

(GIS可视化)热点分析原理及实现 热度分析原理及实现 阅读详情

相关推荐

快速拿下GIS开发的正确方式→定制属于自己的gis学习路线图

这个阶段是三维GIS开发的进阶阶段(cesium高级功能、webgI核心理论),通过学习本阶段,帮助学生掌握Cesium的高级用法及部分底层原理,了解WebGL核心原理,渲染管线流程,及着色器qlsl语言在Cesium中的应用,胜任三维GIS开发的工作。随着技术融合,人工智能、大数据、物联网与GIS的结合应用,以及移动GIS和云GIS解决方案的兴起,GIS行业的市场规模和应用深度持续增长,为智慧城市、环境保护、自然资源规划、智能交通、商业分析与研究、应急管理等多个领域带来革新。

gis_witch的博客 4505

计算几何算法

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?GIS术语汇总什么是WebGIS?WebGIS、桌面GIS、三维GIS的区别常见的WebGIS框架WebGIS开发框架的对比。

gis_witch的博客 5050

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

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

0123 's blog 1万+

【GIS|原理】地统计分析

文章目录基本原理 基本原理 词语 别名 解释 关键字词 备注 地统计 地质统计 以区域化变量为基础,借助变异函数,研究既具有随机性又具有结构性,或具有空间相关性和依赖性的自然现象的一门科学 前提假设、区域化变量、变异分析、空间估值(图1) 揭示某种内在规律,并进行预测 均值平稳 假设均值是不变的并且与位置无关 均值、位置 二阶平稳 假设具有相同的距离和方向的任意两点的...

kaitexue 3921

【GIS人必学】GIS+K-Means聚类分析算法实现对数据集的最优分类

本视频将详细讲解K-Means聚类分析算法的原理,并结合GIS,对大量的离散点数据进行聚类分析,主要是通过ArcGIS Engine二次开发技术,将K-Means聚类分析算法融合成为一个GIS聚类分析系统。

tianchounh的博客 2549

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

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

weixin_36845145的博客 5538

移动GIS原理与开发——框架、算法与实战 绪言

 移动GIS,是以移动互联网为支撑、以GPS智能手机为终端的GIS系统,是继桌面GIS、WEBGIS之后又一新的技术热点,移动定位、移动MIS、移动办公等越来越成为企业或个人的迫切需求,移动GIS就是其中的集中代表,使得随时随地获取信息变得轻松自如。随着SOA架构思想的渗透、OGC标准的成熟,移动GIS已成为互连、共享、互操作的开放系统,GIS服务端对外发布OGC标准服务,客户端按OGC的

creable的专栏 1113

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

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的博客 3854

Xilinx PCIe IP核示例工程仿真流程与关键任务解析

本文详细解析了Xilinx PCIe IP核示例工程的仿真流程与关键任务。通过搭建仿真环境、解读初始化日志,并深入剖析TSK_TX_MEMORY_WRITE_32等核心任务的TLP报文生成与交互过程,帮助开发者掌握PCIe IP核的仿真调试方法,为实际硬件设计提供可靠的验证基础。

weixin_28314575的博客 504

OpenCompass实战:从零部署大模型评测平台,量化模型能力选型

在大模型技术选型与评估中,客观、可量化的评测体系是工程实践的关键。其核心原理在于通过标准化的数据集、统一的评测方法与自动化流程,将主观的模型体验转化为可比较的指标数据。这种评测框架的技术价值在于解决了模型能力评估的模糊性问题,为开发者提供了模型选型、效果对比与迭代优化的科学依据。典型的应用场景包括对比不同开源模型在代码生成、逻辑推理等特定任务上的性能,或是评估微调后模型在业务数据集上的提升效果。OpenCompass作为开源的大模型全能力评测平台,正是这一理念的工程化实现。它通过模块化的四层流水线架构和配置

weixin_28725037的博客 626

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

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

qq_44859843的博客 1109

PX4无人机-Gazebo仿真实现动态目标追踪的视觉控制方案

本文详细介绍了PX4无人机在Gazebo仿真环境中实现动态目标追踪的视觉控制方案。从PX4与Gazebo仿真环境搭建、动态目标追踪核心技术栈、仿真环境深度定制技巧到追踪算法的优化实践,提供了全面的技术指导和常见问题排查方法,帮助开发者高效实现无人机视觉追踪功能。

weixin_29196315的博客 450

Zookeeper架构原理全面解析:ZAB协议、Leader选举与Watch机制

分布式系统中最棘手的问题之一就是共识:多节点如何对状态变更达成一致?Zookeeper作为分布式协调服务,用树形数据模型、临时节点和Watch监听机制,为分布式锁、配置管理、集群协调提供了可靠基础。其核心是ZAB原子广播协议,通过Leader提案、过半ACK确认、Zxid两段式标识和崩溃恢复机制,在保证数据一致性的同时容忍节点故障。掌握Leader选举的投票比较逻辑和会话超时、慢Follower等常见故障排查技巧,能显著提升生产环境中的运维效率。无论你是刚接触分布式开发,还是已在使用Zookeeper但未系

weixin_34355559的博客 343

STM32H743+YT8512C以太网通信实战:CubeMX与LWIP配置详解

本文详细解析了基于STM32H743微控制器与YT8512C PHY芯片的以太网通信实战方案。通过CubeMX工具进行RMII接口、MPU、时钟树等关键硬件配置,并重点阐述了如何修改LWIP协议栈驱动代码以适配YT8512C芯片,解决了LAN8742驱动不兼容的问题。文章提供了从工程创建、代码适配到调试验证的完整步骤,帮助开发者快速实现稳定可靠的嵌入式网络连接。

weixin_29190573的博客 558

Backblaze 2025全年硬盘故障率报告解读

作为长期追踪存储行业动态的科技博主,每年/季度Backblaze的Drive Stats报告都是我重点关注的核心内容——不同于厂商发布的实验室数据,Backblaze以近13年、数十万片企业级硬盘的真实运行数据为基础,其年化故障率(AFR)、寿命趋势等结论,直接反映了硬盘在严苛数据中心环境下的真实表现,无论是企业存储选型还是个人高端存储参考,都具备极高的实用价值。2025年末,Backblaze发布了第13年的年度收官报告,涵盖2025年Q4、全年及终身硬盘可靠性数据。

存储随笔 4011

GIS开发实战图谱

总结了GIS开发的技术栈,罗列了应该了解的内容。 算是比较大而全的了,分理论、规范、数据、算法、软件、后端、前端、方向8个专项。 不求短期内全部都会,但还是一个比较好的学习框架和实践索引,如果基础好的话,两三年达到入门水平,应该是没有问题的吧,不过凡事,因人而异。 内容比较多,一个一个说吧。 一、理论 学好理论知识非常重要,尤其是GIS还是相对来说比较偏冷门的内容。 刚入门看不出来,但时间长了,基础才决定一个人的技术之路能走多远。 学理论和基础,手头需要备几本专业书,谁知道网上..

吴道简的博客 1万+

基于传输门与传输管逻辑的全加器设计

全加器是指对输入的两个二进制数相加(A与B)同时会输入一个低位传来的进位(Ci-1),得到和数(SUM)和进位(Ci)。一位全加器可以处理低位进位,并输出本位加法进位。由于这种晶体管的漏极和源极完全可以互换使用,因此这种电路的输入端与输出端也可以互换,这就是具有信号传输双向特性的传输管。传输管的输入信号可以传输到输出端,同时输出端的信号也可以传输到输入端。半加器是指对输入的两个一位二进制数相加(A与B),输出一个结果位(SUM)和进位(C),没有进位的输入加法器电路,是一个实现一位二进制数的加法电路。

qq_40353731的博客 4381

【GIS面试】GIS算法介绍

GIS关键算法原理及应用场景介绍

c18213590220的博客 2782

【100%通过率】华为OD机试真题 Python 实现【水库蓄水问题】【2022.11 Q4 新题】

给定一个长度为 n 的整数数组height。数组的元素表示山的高度,选择两个元素作为水库的边界,求蓄水量的最大值并输出蓄水量最大时的边界下标(蓄水量相同时输出下标较近的)。

MISAYAONE的博客 1万+

STM32 BOOTLOADER配置以及APP跳转实现(裸机)

Bootloader是硬件启动的引导程序,是运行操作系统的前提。在操作系统内核或用户应用程序运行之前运行的一段小代码。对硬件进行相应的初始化和设定,最终为操作系统准备好环境。APP就是我们的应用程序,经过硬件引导程序之后跳转到系统程序运行。

吻等离子的博客 3355

GIS中的空间数据可视化与分析算法

地理信息系统(GIS)是一个用于捕获、存储、分析、管理和展示地理空间数据的系统。随着数据量的不断增加和技术的进步,GIS在城市规划、环境监测、交通管理等领域的应用越来越广泛。本文将探讨GIS中的空间数据可视化与分析算法,介绍其基本原理、常用方法及实际应用,帮助读者更好地理解和应用这一技术。一、空间数据可视化的基本原理空间数...

cnzzs的博客 2761

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

基于ArcGIS:GIS空间分析复习-理论概念+案例分析

空间分析是为解答而进行的数据,是GIS的核心。

炒茄子的博客 9963

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

盘点十大GIS相关算法

1、道格拉斯-普克算法(Douglas–Peucker) 道格拉斯-普克算法(Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法、迭代适应点算法、分裂与合并算法)是将曲线近似表示为一系列点,并减少点的数量的一种算法。该算法的原始类型分别由乌尔斯·拉默(Urs Ramer)于1972年以及大卫·道格拉斯(David Douglas)和托马斯·普克(Thomas Peucker)于1973年提出,并在之后的数十年中由其他学者予以完善。 算法的基本思路是:对每一条曲线的首末点虚连一

say_book的博客 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: ADO数据库编程详解(C++)----初级入门篇
下一篇: SoapToolkit3.0分发技术
MingoJiang
博客等级 码龄14年 161粉丝 41原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MingoJiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值