计算几何学

来源:互联网 发布:淘宝那些东西增加权重 编辑:程序博客网 时间:2024/04/30 19:50

算法导论 ch33

1 判断线段AB,在线段CD的顺时针方向,还是逆时针方向

叉乘,可以看成是行列式

如果AB向量等于(x1,y1)

CD向量等于(x2,y2)

AB 叉乘 CD = |  x1 x2  |  = x1*y2 - x2 * y1 

                          |  y1 y2 |


CD 叉乘 AB =  x2* y1 - x1 * y2


如果AB 叉乘 CD > 0 , 那么CD在AB的逆时针方向。

如果AB 叉乘 CD < 0 , 那么CD在=AB的顺时针方向。

如果AB 叉乘 CD = 0 , 那么AB和CD共线,方向相同或者相反。


3 判断连续线段AB,BC,是左转还是右转

这个可以化归到上一题,如果AB 叉乘 BC > 0 , 右转

如果AB 叉乘 BC < 0 左转。

如果AB 叉乘 BC = 0 , ABC三点共线。


2 判断两个线段是否相交


考虑三种情况,AB和CD完全不想交,那么 AB * BC 和AB * BD 应该是同时为正,或者同时为负。

如果AB横跨CD,那么 AB * BC 和AB * BD 的结果总是异号的

如果AB有一个断点落在CD上,或者CD有一个端点落在AB上,那么肯定至少有3个点共线的请况。

不妨假设,ABC三点共线,那么AB 叉乘 BC = 0 。 

此时还要判断,共线时,C是否在线段AB上。只要c的横坐标在A、B的横坐标之间,C的纵坐标在A、B的纵坐标之间。


4 判断n个线段中,是否存在相交的线段。

brute force = o(n*n)

sweeping算法o(n * lg n)

假设没有垂直线,假设没有三条线段交于一点


假想有一条条时间线。

每个线段都会跟时间线有交点,且一次只有一个交点。

按照交点的y坐标进行排序

如果在时间线t上,线段a,c与t有交点,那么称a、c是可比较的。如果a、t的交点在c、t的交点上方,那么记为 a >= c

当时间线扫描相交线段a、b时,这个序会发生逆转。

使用红黑树记录全序关系。

扫描到线段c的左端点,比较c在全序关系中的上一个线段是否相交,以及c和下一个线段是否相交。

当扫描到线段c的右端点时,比较c在全序关系中的上下两个线段是否相交。从红黑树中删除c


sweeping算法可以判断是否存在相交的线段,o(n*lg n) 

但是要找出所有的相交线段,需要o(n*n)的复杂度



5 凸包convex hull,最小封闭凸多边形

TODO

0 0