计算几何学

算法导论 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值