如果您將點和轉換插入Maple,您可以很快得到結果。
> with(LinearAlgebra);
> # The server coordinates
pa := [[96.629539, 217.31934], [97.289948, 167.21941], [145.69249, 168.28044],
[145.69638, 219.84604]]:
> # The local coordiantes
pb := [[126.0098, 55.600437], [262.39163, 53.98035], [259.41382, 195.34763],
[121.48138, 184.95235]]:
> # The placeholder variables for the transformation (last one is '1', because it
# is scale-invariant)
T := [seq]([seq](`if`(i = 3 and j = 3, 1, t[i, j]), j = 1 .. 3), i = 1 .. 3):
V := convert(map(op, T)[1 .. -2], set):
> # Transformation function (Matrix multiplication + divide with 3rd coordinate)
trans := (p, T) -> [
(T[1, 1]*p[1]+T[1, 2]*p[2]+T[1, 3])/(T[3, 1]*p[1]+T[3, 2]*p[2]+T[3, 3]),
(T[2, 1]*p[1]+T[2, 2]*p[2]+T[2, 3])/(T[3, 1]*p[1]+T[3, 2]*p[2]+T[3, 3])
]:
> # Transform pa, and construct the equation system
pat := map(trans, pa, T):
eqs := {op}(zip((p1, p2) -> op(zip(`=`, p1, p2)), pat, pb)):
> # Solve for the transform variables
sol := solve(eqs, V):
> # Populate the transform
eval(T, sol);
輸出:
[[ .1076044020, -3.957029830, 1074.517140 ],
[ 4.795375318, .3064507355, -430.7044862 ],
[ 0.3875626264e-3, 0.3441632491e-2, 1 ]]
要使用此,與服務器點乘以它T * <x, y, 1>
。
void ServerToLocal(double serverX, double serverY, double *localX, double *localY)
{
double w;
w = 0.3875626264e-3 * serverX + 0.3441632491e-2 * serverY + 1.0;
*localX = (.1076044020 * serverX - 3.957029830 * serverY + 1074.517140)/w;
*localY = (4.795375318 * serverX + .3064507355 * serverY - 430.7044862)/w;
}
的另一種方法可以在http://alumni.media.mit.edu/~cwren/interpolator/
這一個可以用C,給予合理的線性代數庫被讀出。
我不明白你想要做什麼。 – Thomash
聽起來像透視轉換?你是否將一個四邊形映射到另一個? – PeskyGnat
我想對單應應用修改,將此單應性轉換爲我的單位/座標系。 – Gustavo