等距投影逆向算法推导:由u,v,w反算参数与w取值边界
等距投影逆向算法w值边界实现方案
核心推导思路
正向变换的三个公式为线性关系,w的极值必然在所有输入变量的取值边界处取得,不需要复杂的平面方程求解,直接通过变量取值约束推导不等式边界即可,和你之前推导u、v范围的逻辑一致。
首先明确已知条件:
- 常量a、b、c均为正整数
- 输入变量取值范围:
0≤x≤a、0≤y≤b、0≤z≤c、p∈{0,1}、q∈{0,1,2} - 正向变换公式:
u = b + x - y + p v = a + b + 2 * c - x - y - 2 * z + q w = c + x + y - z
边界计算逻辑
p和q总共只有6种取值组合,直接遍历所有组合计算对应w的合法区间,再取全局的最小、最大值即可,性能开销可以忽略,且代码可读性远高于分段闭式解:
- 对每组p、q,先计算
s = u - b - p(即x-y的固定值) - 代入z的取值约束
0≤z≤c,推导得到w的第一组上下界 - 代入x、y的非负约束
x≥0、y≥0,推导得到w的下界 - 代入x、y的上限约束
x≤a、y≤b,推导得到w的两组上界 - 取当前p、q下所有约束的交集,得到该组参数对应的合法w范围
- 所有p、q组合的w范围的最小值、最大值,就是固定u、v下的w全局边界
可直接运行的代码实现
// 示例常量,可替换为实际值 const a = 2; const b = 3; const c = 4; for (let u = 0; u <= a + b + 1; u++) { const minv = u <= a ? a - u : -a + u - 1; const maxv = u <= b ? a + 2 * c + u + 2 : a + 2 * b + 2 * c - u + 3; for (let v = minv; v <= maxv; v++) { let minw = Infinity; let maxw = -Infinity; // 遍历p、q所有可能取值,计算w的合法范围 for (const p of [0, 1]) { const s = u - b - p; for (const q of [0, 1, 2]) { // z取值约束对应的w边界 const wLowZ = a + b - v + q; const wHighZ = a + b + 3 * c - v + q; // x、y非负约束对应的w下界 const wLowXy = Math.ceil((3 * Math.abs(s) + v - a - b - q) / 2); // x、y取上限对应的w上界 const wHighX = Math.floor((5 * a + 2 * b - 3 * u + v + 3 * p - q) / 2); const wHighY = Math.floor((2 * b + 3 * u - a + v - 3 * p - q) / 2); // 当前p、q下w的合法区间 const currLow = Math.max(wLowZ, wLowXy); const currHigh = Math.min(wHighZ, wHighX, wHighY); if (currLow <= currHigh) { minw = Math.min(minw, currLow); maxw = Math.max(maxw, currHigh); } } } // 遍历当前u、v下所有合法w值 for (let w = minw; w <= maxw; w++) { // 此处写入已实现的x、y、z、p、q反算逻辑即可 } } }
验证说明:用a=2、b=3、c=4测试时,总遍历到的(u,v,w)三元组数量为
(2+1)*(3+1)*(4+1)*2*3 = 360,和正向生成的三元组总数完全一致,没有多算也没有漏算。
内容的提问来源于stack exchange,提问作者DEgorov
相关产品推荐
相关产品推荐

