編集
以下の角度比の不変性の仮定は正しくありません。代わりに、射影変換は交差比と発生率を保持します。解決策は次のとおりです。
- 線分 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 を求める:
HQ = m * sin(thetaQ2) / sin(180-thetaQ1-thetaQ2)
最後に、EFGH の左下隅に対する Q の x および y 位置は次のとおりです。
x = HQ * cos(thetaQ1)
y = HQ * sin(thetaQ1)
正方形の各ポイントにマップされたカラー値の数を追跡して、それらの各ポイントの平均カラーを計算できるようにする必要があります。