计算几何基础算法

来源:互联网 发布:淘宝店以开启,怎么找货 编辑:程序博客网 时间:2024/06/10 08:55

  • 计算几何尽量避免除法,开根号等等损失精度的东西。
  •  判断点是否在一个矩形内 :判断的方法非常简单就是根据点和矩形本身的位置关系即点的坐标位于矩形的坐标内部 即 (x > min (x1,x2) && x < max (x1,x2) ) 同理y也应该位于矩形的内部。
  • 判断点是否在园的内部 : 求一下点到圆心的距离,然后判断一下和半径的关系即可
  • 判断一点是否在直线上: 只需要看一下直线上任意一点到该点的向量叉该直线的方向向量是不是等于0就可以了。
  • 判断点是否在线段上 : 可以先判断点是否在直线上,然后做一个排斥试验 (判断点是否在矩形内就可以了) 排斥试验非常好写 (x > min (x1,x2) && x < max (x1,x2) ) y 也是类似的,一行代码吧 emmmm......
  • 判断线段是否有交点 : 两个试验 1 :快速排斥试验,就是说以两个线段为对角线的矩形必须有交才可以 (感觉这就是一个剪枝效率还是蛮重要的) 2 : 跨立试验 :一个线段的两个顶点一定位于另外一条线段的两侧,判断点与线段的位置关系当然是叉积啊如果跨立的话叉积肯定一正一负 (这个试验一定要做两次啊 很好想啊 否则肯定错啊)
  • 判断射线与线段是否相交 : 首先我们在计算机中不能表示无穷远的点,所以表示射线的方法是按照射线方向取一个你自己认为无穷大的点 尽量取大 (就像inf 一样)这样我们就可以近似的表示一条射线这样表示以后所有的操作就可以几乎完全等价于线段了。
  • 两个矩形是否有交点 : 即两个矩形在 x y方向上都会有相交区域这样才可以。
  • 判断一点是否在任意多边形内部 :常用的方法就是射线法 
  • 射线法 : 就是从该点超任意方向做一条射线,看射线和多边形有多少个交点如果交点的个数是奇数的话说明点在多边形的内部,如果交点是偶数的话,说明点在多边形的外部,具体做法当然是先做一条射线,然后依次判断是否和某条线段有无交点了。但是需要注意几种特殊的情况 : 
  • 就是图中的这几种情况了 : 假设现在我们要判断的点为 P  正在判断的线段的端点是 P1、 P2       1.如果点在某条线段上,那么这个点就肯定位于多边形内。 2. 如果从P出发的射线平行于现在要判断的线段那么忽略这条线段 3.如果从P出发的射线恰好经过线段的一个顶点P1 或者 P2 如果交点是P1 or P2 纵坐标小的那个那么忽略这个交点。这样排出了这几种特殊的情况之后我们就可以通过交点个数的奇偶性判断这个点是否在一个多边形内部。
  • 判断线段是否在一个多边形内 : 1.首先先判断线段的两个顶点是否在多边形内 2.判断线段是否和多边形的边哪交 (就是说线段的交点在非端点) 要是内交肯定不在多边形内 3.外交的话(如果只有一个外交交点的话肯定在形内)多个的话我们需要判断这两个交点的中点是否在多边形内部 分这三步就可以了
  • 判断折线是否在多边形的内部 :把折线分成若干条线段,判断每一条线段是否在多边形的内部就可以了,如果每一条线段都在,那么就在,否则不在。
  • 判断多边形是否在多边形内部 : 判断多边形的任意一条线段是否在另外一个多边形内部即可
  • 判断圆是否在多边形的内部 : 求出圆心到每条线段的距离,取一个最小的然后判断一下这个距离和半径的关系。
  • 判断点、线、形是否在圆的内部:由于圆是凸形 (计算几何中非常好的性质)所以只需要判断形的每个顶点是否在圆的内部即可
  • 求点到线段的距离 : 不妨设线段为 AB 点为 P 这样的话我们就可以 通过求向量的投影根据投影的正负和投影的长度与线段的关系判断出投影点的位置,若在线段上,那么点到线段的距离可以AP的距离 和 投影的大小用勾股定理进行计算即可,如果不在内部,那么P到 AB 的距离取一个最小值就可以了。
  • 点到射线的距离类似的
  • 点到折线、多边形 : 求出点到所有边的距离取一个最小的距离就可以了。
  • 注意圆是一个非常特殊的图形,因为其具有的特殊性我们要充分利用圆心和半径去判断一些东西... 嗯 各种东西好像都要用圆这么美妙的几何性质。
  • 注意某些多边形、折线等可以看成多条线段再进行判断就可以了。
  • 求两个线段的交点 :先判断线段是否相交再通过面积比 (叉积已经计算过了)求出两个端点到交点的距离比,然后用定比分点坐标公式计算交点坐标。
  • 求两条直线的交点只能苦逼解方程了 (注意方程应该写成一般式 别的需要讨论太麻烦)


至于代码呢 ? emmmm..........模版大家可以去其他博客找了 只是说明了一些原理性的东西。

原创粉丝点击