基于Christoph公式的四边形转矩形变换Delphi实现M/N公式报错咨询
四边形转矩形变换实现问题解答
坐标参数定义与顶点排序规则
- 公式中的
X1/Y1~X4/Y4对应输入凸四边形的四个顶点坐标 - 顶点必须按顺时针/逆时针连续顺序排列,推荐顺序为:左上→右上→右下→左下,禁止顶点交叉排列、跳序排列,排序错误是触发根号参数为负的最常见原因
- 若输入为非凸四边形、存在三个及以上顶点共线的退化四边形,本身不存在合法的矩形投影映射结果,也会出现根号参数为负的报错
M、N解析公式(可直接用于Delphi实现)
先提前置校验逻辑:若计算过程中出现分母为0、根号参数小于0的情况,直接判定输入四边形不合法,终止计算即可。
第一步:定义输入顶点
假设按顺序排列的四个凸四边形顶点为:(x1, y1)、(x2, y2)、(x3, y3)、(x4, y4)
第二步:计算中间参数
dx1 := x2 - x3; dx2 := x4 - x3; dx3 := x1 - x2 + x3 - x4; dy1 := y2 - y3; dy2 := y4 - y3; dy3 := y1 - y2 + y3 - y4; den := dx1 * dy2 - dx2 * dy1; // 校验分母是否为0,为0则四边形退化 if den = 0 then Exit;
第三步:计算M、N相关参数
mNumer := dy2 * dx3 - dx2 * dy3; nNumer := dx1 * dy3 - dy1 * dx3; sqrtVal := 1 - 4 * mNumer * nNumer / (den * den); // 校验根号参数合法性 if sqrtVal < 0 then Exit; sqrtRes := Sqrt(sqrtVal);
第四步:得到M、N结果
M := (1 + sqrtRes) * den / (2 * nNumer); N := (1 + sqrtRes) * den / (2 * mNumer);
注:如果映射后的矩形坐标出现反向/越界的情况,可以将1 + sqrtRes替换为1 - sqrtRes调整符号即可
内容的提问来源于stack exchange,提问作者Ivan3D
相关产品推荐
相关产品推荐

