算法导论系列--计算几何(computational geometry)

 
Computational Geometry是个十分有趣的课题。很遗憾笔者不是数学/计算机专业,对这个领域认识很少。第一次接触这个词是在topcoder的算法教程里面,被其算法的巧妙所吸引,可惜未有机会进一步学习。认识所限,本文介绍仅能最简单的2D几何算法跟大家分享。对于从事CAD软件开发,图形开发,统计,游戏开发的人,计算几何都是必修课。这个领域有一本很著名的入门书:Mark de berg(荷)写<Computational Geometry: Algorithms and application 2nd edition>(国内有出版,计算几何—算法与应用第二版,邓俊辉译) 。

计算几何中的对象可以是点集,线段集,面集等。如果一条线段的端点是有次序之分的,我们把这种线段成为有向线段 (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 ) 。

矢量点乘(dot product) 也叫做向量内积(inner product). 设三维空间中两个向量,P(a1,a2,a3) , Q(b1,b2,b3), P·Q = a1b1 + a2b2 + a3b3. 几何意义是|P||Q| cos(PQ夹角)。
     两向量点乘为0时,即这两向量互相垂直

矢量叉积(cross product)  设矢量 P = ( x1, y1 ) , Q = ( x2, y2 ) ,则矢量叉积定义为由 (0,0) 、 p1 、 p2 和 p1+p2 所组成的平行四边形的带符号的面积,即: P × Q = x1*y2 - x2*y1 ,其结果是一个标量(更高维数的叉积参阅数学书),几何意义为|P||Q| sin(PQ夹角)。显然有性质 P × Q = - ( Q × P ) 和 P × ( - Q ) = - ( P × Q ) 。一般在不加说明的情况下,下述算法中所有的点都看作矢量,两点的加减法就是矢量相加减,而点的乘法则看作矢量叉积。

  叉积的一个非常重要性质是可以通过它的符号判断两矢量相互之间的顺逆时针关系:若P×Q > 0 , 则P在Q的顺时针方向。若小于0, 为逆时针。若等于0, 可能同向/反向。

判断点在线段上

    设点为 Q ,线段为 AB ,判断点 Q 在直线上的依据是∠QAB = 0180 ( Q - A ) × ( B - A ) = 0。再判断点是否在线段内,min(xA,xB) <= xQ <= max(xA,xB)min(yA,yB) <= yQ <= max(yA,yB)(考虑垂直和水平线段,所以要两个条件同时成立).

线段 / 直线交点
   设线段两点坐标 P1(x1,y1), P2(x2,y2). 此线段构成的直线方程可表示为 :
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值