最近写程序用到,先上一段找来的别人的程序:
大致思路是分两步:
1. 一条线段大的坐标要比别一条小的坐标大
2. 一条线段的两个端点在另一线段的两边(通过比较叉乘得到)
按照段代码,写到程序里,一般运行没什么问题,但总是有时候会有些问题,相交判断不准确。于是开始怀疑这个算法的正确性,经手算验证后发现这段代码没问题。经过反复测试,才发问题确实出在这段代码上。最后才发现问题所在:溢出。
对于一个16位表示的int,其表示范围在–32,768 到 32,767。在我的实际程序中
的坐标范围是800*480,坐标略大的话,Multi之后的结果就超 出32767。
于是改用32位长的int,这样能够正确表示Multi的结果,但是对于下面这段代码:
(multi(s2, e1, s1) * multi(e1, e2, s1) >= 0) && (multi(s1, e2, s2) * multi(e2, e1, s2) >= 0)
multi的结果相乘后仍将溢出,可以改为逻辑判断解决。修改后使用如下的代码:
终于,运行正常~