2

問題は例で最もよく説明されます:

http://dl.dropbox.com/u/1013446/歪んだcoordinatespace.exe

右側の小さな正方形の中に小さな赤い正方形をドラッグアンドドロップします。左側の大きな四辺形の赤い四角に対応しています。左側の大きな四辺形の4つの角をドラッグして、正方形内の歪んだバージョンのスペースをどのように占めるかを確認することもできます。

正方形の4つのポイントの絶対座標と、正方形内の任意のポイントの座標が与えられた場合、ポイントの座標を任意の四辺形に再マップするのは簡単です。

私が望んでいるのは、任意の四辺形から始めて、同じことを実行できるようにすることです。四辺形を他の4面の形状に変換しますが、ポイントの相対的な歪んだ位置を維持します。

したがって、2つの不規則な四辺形AとBのそれぞれの4つの絶対座標が与えられた場合、絶対座標が与えられた点Cの座標をどのように変換できますか?

また、これらの変換がどのように呼ばれるかについて、ここで欠落している用語も役立ちます。これは、それらをさらに調査したいためです。

わかりました、私はbtillyのソリューションを実装しようとしています、そしてこれが私がこれまでに持っているものです:

   #include<complex>
#define cf complex<float>

cf i=sqrt(complex<float>(-1));

cf GetZ(float x,float y)
{
    return cf(x)+(cf(y)*i);
}

cf GetPathIntegral(cf p1,cf p2,cf q1,cf q2, int n)
{
    cf sum;
    for (int index=0;index<=n;index++)
    {
        cf s=cf(float(index)/float(n));
        cf weight;
        if (index==0||index==n)
            weight=1;
        else if(index%2)
            weight=4;
        else weight =2;


        sum+=(((cf(1)-s)*q1)+(s*q2))*(p2-p1)*weight;
    }
    return sum/cf((3.0*(n-1.0)));
}

ここから先に進む前に、今のところ正しいことを確認したいと思います...

また、この段落は私を少し混乱させました:

OK、経路積分を行うことができます。その価値は何ですか?領域内のどこかでランダムな点z0=x+iyをとるとします。パスにf(z)が定義されているとします。次に、コーシー積分公式は、f(z)/(2*π*i *(z --z0))の領域の周りの積分(これは、私たちが行う方法を知っている4つの区分的積分の合計です)は本当に境界上の元の関数と一致する素晴らしい関数。

関数は正確に何をしますか?

4

2 に答える 2

3

(私の最初のパスは、このための自然な式の複雑な導出でした。しかし、それから、はるかに優れた解決策があることに気付きました。過去20年間に複素解析を使用した場合、以前に覚えていたでしょう。)

これを行う正しい方法は、コーシー積分公式を適用することです。これにより、任意のポリゴンを他の任意のポリゴンにマッピングできます。ポリゴンが自己交差しない場合は、境界を境界に送信し、内部を内部に送信します。マッピングには、等角であるという優れた特性もあります。つまり、角度が保持されます。つまり、1対の曲線がお住まいの地域で交差する場合、それらは同じ角度で交差する1対の曲線にマッピングされます。(エッシャーの図面の多くは等角写像に基づいています。)

十分な誇大宣伝。どうしますか?あなたが複雑な分析について全く何も知らないと仮定して、それを説明します。微積分の用語をいくつか使用しますが、微積分をまったく知らなくても、私の指示に従うことができるはずです。私はほとんど想定していないので、説明は少し長くなければなりません。ごめんなさい。

実平面のすべての点(x, y)は、複素数と見なすことができますz = x + iy。代数の通常の規則とその事実を使用して、複素数を加算および乗算できますi * i = -1。さらに、を許可すると分割できることに注意してください。したがって、通常の算術規則はすべてあります。1 = (x + iy) * (x - iy)/(x2 + y2)1/z = (x - iy)/(x2 + y2)

しかし、それよりもうまくいくことができます。微積分を行うことができます。特に、曲線の周りで経路積分を行うことができます。曲線に沿った関数の積分は、その曲線の点にわたるその関数の一種の加重平均です。あなたはそれを一般的に行う方法について読むことができます。しかし、この場合の方法は次のとおりです。

開始領域にコーナーがあるとします。領域の周りのパスは、4つの線分によって定義されます。最初の線分の処理方法について説明します。他は似ています。P1, P2, P3, P4(P1, P2), (P2, P3), (P3, P4), (P4, P1)

f(z)overの経路積分は、の0から1までの積分です。その積分を評価するために行う最も簡単なことは、シンプソンの法則を使用した数値積分です。これを行うには、奇数を選択し、値にパターンの重みを割り当てます。(エンドポイントは1で、他のすべては4と2の間で交互になります。)ここで、各ポイントについて計算し、重みを掛けて、それらをすべて合計します。次に、魔法の値で割ります。結果はほぼあなたの積分です。(成長するにつれて、この近似の誤差は次のようになります。(P1, P2)f((1-s)P1 + sP2)(P2 - P1)ns = 0, 1/n, 2/n, ..., (n-1)/n, 11, 4, 2, 4, 2, ..., 2, 4, 1f((1-s)P1 + sP2)(P2 - P1)3 * (n-1)nO(1/n4)n = 21その場合、境界近くの一部のピクセルを除いて、近似はピクセルを正しいピクセルにマッピングするのに十分な結果になるはずです。少し大きくすると、問題のある領域が小さくなります。端では、エラーを小さくするために、側面のピクセル数の倍数が必要になります。)

OK、経路積分を行うことができます。その価値は何ですか?地域のどこかでランダムなポイントを取るとします。それ がパスで定義されているとします。次に、コーシー積分公式は、の領域の周りの積分(これは、私たちが行う方法を知っている4つの区分的積分の合計です)は、境界上の元の関数と一致する非常に優れた関数であると言います。私はそれについての「本当に素晴らしい」ことのすべてに入るわけではありませんが、コンフォーマルについて上で言ったことはその一部です。z0 = x + iyf(z)f(z)/(2 * π * i * (z - z0))

では、どの関数fを使用しますか?さて、私たちの地域が角のある地域にマッピングされていると仮定します。最初のパスピースを2番目のパスピースにマップする必要があります。だから私たちはなりたいです。これは、積分を行うために必要なすべてのポイントで計算する方法を示しています。Q1, Q2, Q3, Q4f((1-s)P1 + sP2)(1-s)Q1 + sQ2f

さて、あなたは尋ねます、どうやってそれを逆転させるのですか?それは簡単です。2つのポリゴンの役割を逆にして、逆変換を計算するだけです。これは本当に良い単体テストをもたらします。いくつかの奇妙な領域を定義し、中央のポイントを選択して、最初の領域から2番目の領域にマップし、再びマップした場合に、開始した場所の近くに到達することを確認する必要があります。そのテストに合格した場合、おそらく間違いはありません。

そして最後に、私が行った一般的なポリゴンの主張はどうですか?さて、私たちは私たちの道を直線的に横断した4つの部分として定義しました。次数の高いポリゴンは、パスに対してより多くのピースを持っていますが、それ以外の場合、計算はまったく同じ方法で行われます。

于 2011-03-24T01:46:12.250 に答える
-1

解決策を見つけました。私が言わなければならないのは、それは私が予想していたよりもはるかに複雑です:

正方形または四辺形に4つの角があると仮定します。

AB
CD

補間係数が必要です。x軸にはxt、y軸にはytであるため、次のようになります。

線形補間式を定義する場合:

lerp(j,k,t)
{
     return (t*(k-j))+j;
}

ABCDクワッド内のポイントpは、次のように定義されます。

p.x=lerp(lerp(a.x,b.x,xt),lerp(c.x,d.x,xt),yt)

p.y=lerp(lerp(a.y,c.y,yt),lerp(b.y,d.y,yt),xt)

その場合、定義する必要のある値はxtとytです。

xt =((2 * cx * ay)-(dx * ay)-(2 * ax cy)+(bx cy)-(cx * by)+(ax * dy)-(ay * px)+(cy * px)+(by px)-(dy px)+(ax py)-(bx py)-(cx * py)+(dx * py)-Sqrt(-4 *((cx * ay)-(dx * ay)-(ax * cy)+(bx * cy)-(cx * by)+(dx * by)+(ax dy)-(bx dy))*((cx * ay)-(ax * cy) -(ay * px)+(cy * px)+(ax * py)-(cx * py))+((-2 * cx ay)+(dx ay)+(2 * ax cy)-(bx cy )+(cx * by)-(ax * dy)+(ay * px)-(cy * px)-(by * px)+(dy * px)-(ax * py)+(bx * py)+ (cx * py)-(dx py))^ 2))/(2 ((cx * ay)-(dx * ay)-(ax * cy)+(bx * cy)-(cx * by)+(dx * by)+(ax * dy)-(bx * dy)))

そして、あなたがそれを持ったら

yt=(p.x-lerp(a.x,b.x,('xt')))/(lerp(c.x,d.x,('xt'))-lerp(a.x,b.x,('xt')))
于 2011-03-24T05:18:50.113 に答える