编辑
下面关于角度比不变性的假设是不正确的。相反,投影变换保留了交叉比率和发生率。那么解决方案是:
- 在由段 AD 和 CP 定义的线的交点处找到点 C'。
- 在由线段 AD 和 BP 定义的线的交点处找到点 B'。
- 确定B'DAC'的交叉比,即r = (BA' * DC') / (DA * B'C')。
- 构造投影线 F'HEG'。这些点的交叉比等于r,即r = (F'E * HG') / (HE * F'G')。
- F'F 和 G'G 将在投影点 Q 处相交,因此使交叉比率相等并知道正方形边的长度,您可以通过一些算术体操来确定 Q 的位置。
嗯....我会试一试这个。该解决方案依赖于在转换中保留角度比率的假设。请参阅图像以获取指导(抱歉图像质量差……真的太晚了)。该算法仅提供四边形中的点到正方形中的点的映射。您仍然需要实现处理映射到同一个正方形点的多个四边形点。
设 ABCD 为四边形,其中 A 为左上顶点,B 为右上顶点,C 为右下顶点,D 为左下顶点。对 (xA, yA) 表示顶点 A 的 x 和 y 坐标。我们将这个四边形中的点映射到边长等于 m 的正方形 EFGH。
计算长度 AD、CD、AC、BD 和 BC:
AD = sqrt((xA-xD)^2 + (yA-yD)^2)
CD = sqrt((xC-xD)^2 + (yC-yD)^2)
AC = sqrt((xA-xC)^2 + (yA-yC)^2)
BD = sqrt((xB-xD)^2 + (yB-yD)^2)
BC = sqrt((xB-xC)^2 + (yB-yC)^2)
令 thetaD 为顶点 D 处的角度,thetaC 为顶点 C 处的角度。使用余弦定律计算这些角度:
thetaD = arccos((AD^2 + CD^2 - AC^2) / (2*AD*CD))
thetaC = arccos((BC^2 + CD^2 - BD^2) / (2*BC*CD))
我们将四边形中的每个点 P 映射到正方形中的点 Q。对于四边形中的每个点 P,请执行以下操作:
求距离 DP:
DP = sqrt((xP-xD)^2 + (yP-yD)^2)
求距离 CP:
CP = sqrt((xP-xC)^2 + (yP-yC)^2)
求 CD 和 DP 之间的角度 thetaP1:
thetaP1 = arccos((DP^2 + CD^2 - CP^2) / (2*DP*CD))
求 CD 和 CP 之间的角度 thetaP2:
thetaP2 = arccos((CP^2 + CD^2 - DP^2) / (2*CP*CD))
thetaP1 与 thetaD 的比值应该是 thetaQ1 与 90 的比值。因此,计算 thetaQ1:
thetaQ1 = thetaP1 * 90 / thetaD
同样,计算 thetaQ2:
thetaQ2 = thetaP2 * 90 / thetaC
求距离总部:
HQ = m * sin(thetaQ2) / sin(180-thetaQ1-thetaQ2)
最后,Q 相对于 EFGH 左下角的 x 和 y 位置为:
x = HQ * cos(thetaQ1)
y = HQ * sin(thetaQ1)
您必须跟踪有多少颜色值映射到正方形中的每个点,以便您可以计算每个点的平均颜色。