766 |
|
|
767 |
a0 = atan(0.5 * c.t / c.d); |
a0 = atan(0.5 * c.t / c.d); |
768 |
|
|
|
da = (f.tangentAngle - a0) / n; |
|
|
sin_da = sin(da); |
|
|
|
|
769 |
for (int i = 1; i < n; i++) { |
for (int i = 1; i < n; i++) { |
770 |
float t = i * (1.0 / n); |
float t = i * (1.0 / n); |
771 |
float a = a0 + t * (f.tangentAngle - a0); |
float a = a0 + (t*t) * (f.tangentAngle - a0); |
772 |
bool success; |
bool success; |
773 |
float fract; |
float fract; |
774 |
ZVec pt = f.point(dirVec(a), success, &fract, .0001); |
ZVec pt = f.point(dirVec(a), success, &fract, .0001); |
786 |
float rad_rtbl(Vec v) const { |
float rad_rtbl(Vec v) const { |
787 |
int n = rtbl.size() - 1; |
int n = rtbl.size() - 1; |
788 |
float a = v.atan(); |
float a = v.atan(); |
789 |
float t = (a - a0) / (f.tangentAngle - a0); |
if (a < a0) return rtbl[0]; |
790 |
|
float t = sqrt((a - a0) / (f.tangentAngle - a0)); |
791 |
int i = (int)(t * n); |
int i = (int)(t * n); |
|
if (t < 0) return rtbl[0]; |
|
792 |
if (i >= n) return rtbl[n]; |
if (i >= n) return rtbl[n]; |
793 |
|
|
794 |
float fract = t * n - i; |
float fract = t * n - i; |
795 |
float r0 = rtbl[i]; |
float r0 = rtbl[i]; |
796 |
float r1 = rtbl[i + 1]; |
float r1 = rtbl[i + 1]; |
797 |
|
|
798 |
return r0 * r1 / (r0 * fract + r1 * (1-fract)); |
// lerp |
799 |
return (1 - fract) * r0 + fract * r1; |
//return (1 - fract) * r0 + fract * r1; |
800 |
return r0 * r1 * sin_da / (r0 * sin(fract * da) + |
|
801 |
r1 * sin((1-fract) * da)) >? r1; |
// polar lerp approximation |
802 |
|
//return r0 * r1 / (r0 * fract + r1 * (1-fract)); |
803 |
|
|
804 |
|
// polar lerp |
805 |
|
float da = (f.tangentAngle - a0) / n; |
806 |
|
da *= 2 * t + 1E-4;// compensate for the squaring |
807 |
|
return r0 * r1 * sin(da) / (r0 * sin(fract * da) + |
808 |
|
r1 * sin((1-fract) * da)) >? r1; |
809 |
} |
} |
810 |
}; |
}; |
811 |
|
|