-
for f(x,y)
您可以使用f(x,y)->(a,b)
2D LUT(查找表)
但存储的网格点必须选择得足够密集,以便每个网格矩形最多有一个凹凸,否则插值将无法正常工作。
如果要使用线性插值,则局部最小值/最大值必须是 LUT 内的点,因为并不总是需要更高阶的多项式插值。我会用4点三次插值 https://stackoverflow.com/a/20517874/2521214
-
如何计算g(a,b)->(x,y)
- 首先,反向映射可能吗?
- 那么有多少
(x,y)
点返回相同(a,b)=f(x,y)
?
- 它与问题相同:是
f
功能与否?
if f
不是函数那么你就会遇到问题并且无法解决这个问题,除非以某种方式将范围细分为子范围,其中f
是函数,然后您必须根据一些规则选择适当的范围,具体取决于您想要做什么。所以让我们假设f
是函数
那么如何计算(x,y)=g(a,b)
that f(x,y)=(a,b)
?
我将从结果的近似值开始。所以尝试够了(x,y)
沿整个范围的值并存储最接近所需输出的点,以便|f(x,y)-(a,b)|
是最小的。
-
然后再次开始,但不是在全范围,而是在这个点附近
- 递归地将准确性提高到您需要的程度。
- 看这里提高超越方程求解的精度 https://stackoverflow.com/q/29166819/2521214我正在计算类似的问题,有 2D 点的 1D LUT
(a(t),y(t))
并需要逆 3D 点(a0,y0,z0)
你可以在那里使用我的近似类
近似值的嵌套是这样完成的:
int n=5; // recursions
double e; // Error Of Solution Variable
approx ax,ay;
// min max step
for (ax.init(-100.0,+100.0,10.0,n,&e);!ax.done;ax.step())
for (ay.init(-100.0,+100.0,10.0,n,&e);!ay.done;ay.step())
{
e=|f(ax.a,ay.a)-(a,b)|;
}
// here (ax.a,ay.a) should hold your solution for input point `(a,b)`
- 初始步骤应该尽可能小,这样就不会错过任何凹凸
- if your
g(a,b)
形状太复杂那么这可能无法正常工作
由此您可以计算逆 LUT 表...
- 每次递归都将步长除以
10
所以选择n
wisely.
对于 2D 和奇异点来说,这的性能还不错O((log(N))^2)
。我在 3D 上做这个O((log(N))^3)
with 100
点每e
计算速度非常慢(大约 35 秒)
- where
N=(10^n)*(max-min)/step
, and n
是递归次数
- 准确度是
step/(10^n)
- 不要忘记将最小值、最大值更改为您使用的范围......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)