前段时间要做一个工具,要求能判断是否与弧线相交,并求出交点。当时使用的GDI,可把我难坏了。
有以下两个问题:
1. 三点画弧线问题
2. 线段与弧线交点问题
首先,要解决的是三点弧线问题。我有点不大清楚,为什么很多GDI库,不提供这个功能啊。这个问题最大难点是如何计算外接矩形,并把起止弧度算出来。三点肯定是确定一个圆弧的(或者线段)。
1)圆心:两个未知数
2)半径:一个未知数
总共有未知数,三个点当然也是可确定三个方程,但是开平方是没必要的。高中的时候,我们就知道尺规作图求圆心,不就是两个直线的交点嘛。(这两个直线,大家应该知道吧。)就这样,现在纸上把a,b,r的表达式都写出来,用已知坐标代入就可以了。
其次,扫描弧度如何计算。GDI的起止弧度使用的是顺时针,它的Y轴方向很重要,可能和你纸上谈兵不一样。对你来说,那就是逆时针,逆时针偏差角度(负值)。
最后,就是求线段与弧线的交点了。这个可是复杂度最高的了。先要判断是否有交点,再解决交点坐标。在没有Matrix的时代,纯粹使用数学公式感觉太复杂了,超出了控制。那如何降低复杂度,还能求出交点呢。让Matrix再飞一会吧!
移到原点之后,再旋转一下,一下子就豁然开朗了。线段的X坐标还用你烦吗(线段的两个端点的X值变成一样了)。那就剩下求Y值了,不过首先要确定是否有这个交点。接着判断一下|X|值与半径的关系,如果小于半径则肯定与圆有交点了。但是是否与弧线有交点呢,可以把弧线的弧度范围,与直线切割的弧线比较。
算出所有东西之后,再用Matrix反运算,就一切OK了。