对CAD圆弧直线不了解的朋友可以先阅读以下博文:
https://blog.csdn.net/iloveas2014/article/details/103837857
https://blog.csdn.net/iloveas2014/article/details/103848611
前面的两个公式(弧长,定比分点)在推导的过程中,为了适应夹逼公式,我们做了一些比较刻意的变换,这些变换有时候是不积极的,因为它们可能会带来更多的性能损耗或者精度损失。
比如
又如反三角函数的
这些变换虽然是预先手算完成,但是写到代码上可能还不如分开条件判断。
如果不是刻意追求只能有一条夹逼公式的话,那么我们完全可以多定义几种夹逼公式以便在不用的地方使用。
这里我给出6个夹逼公式,其中第一个不是变体。
function 正弦夹逼公式(x){
return x != 0 ? Math.sin(x) / x : 1;
}
function 正切夹逼公式(x){
return x != 0 ? Math.tan(x) / x : 1;
}
function 反正弦夹逼公式(x){
return x != 0 ? Math.asin(x) / x : 1;
}
function 反正切夹逼公式(x){
return x != 0 ? Math.atan(x) / x : 1;
}
function 双正弦夹逼公式(k1, k2, x){
return x != 0 ? Math.sin(k1 * x) / Math.sin(k2 * x) : (k1 / k2);
}
function 双正切夹逼公式(k1, k2, x){
return x != 0 ? Math.tan(k1 * x) / Math.tan(k2 * x) : (k1 / k2);
}
有了这些变体,我们的一些公式写起来会更加方便。比如弧长公式,现在的是
CircleArcStraightLine.prototype.arcLength = function(){
//s为起点,e为终点,b为凸度
var straightLength = Math.sqrt((this.e.x - this.s.x) * (this.e.x - this.s.x) + (this.e.y - this.s.y) * (this.e.y - this.s.y));
var u = Math.atan(b);
return straightLength / 夹逼公式(u) * Math.sqrt(1 + this.b * this.b);
}
改用变体后,就变成
CircleArcStraightLine.prototype.arcLength = function(){
//s为起点,e为终点,b为凸度
var straightLength = Math.sqrt((this.e.x - this.s.x) * (this.e.x - this.s.x) + (this.e.y - this.s.y) * (this.e.y - this.s.y));
return straightLength / 正切夹逼公式(b) * (1 + this.b * this.b);
}
定比分点能简单更多,读者可以自行尝试。
下一篇我打算把投影面积也用夹逼公式算出来,敬请期待!