1

私はいくつかのデリゲートとメソッドを持っています:

delegate Point Translate(Point p);
delegate Translate Transform(Translate t);

Translate forward = p => new Point(p.X + 1, p.Y);

質問: 次のようなメソッドを実装するにはどうすればよいですか:

Transform Rotate90 = ??

これにより、Rotate90任意のTranslate関数が時計回りに 90 回転します。そう:

Point startPoint = new Point(1, 1);
Point endPoint = (Rotate90(forward))(startPoint);
//desired output: Point(1, 0)

編集 1:Translateポイントに関数を 1 つずつ 適用するつもりはありません。必要なのは、ポイントにいくつかの変換された関数 (Translate回転または反射された関数) を適用することです。

必要なもの:Rotate90 which を渡すと(p=>new Point(p.X+1, p.y))と同じ効果を持つ関数を返すようにするにはどうすればよいですか(p=>new Point(p.X, p.Y-1))

編集2:いくつかの例:

Translate forward =         p => new Point(p.X + 1, p.Y);
Translate backward =        p => new Point(p.X - 1, p.Y);
Translate downward =        p => new Point(p.X, p.Y - 1);
Translate runningForward =  p => new Point(p.X + 5, p.Y);

Transform Rotate90Cw = ??

Point samplePoint = new Point(1, 1);

Point p1 = (Rotate90Cw(forward))(samplePoint);          //must be (1,0)
Point p2 = (Rotate90Cw(backward))(samplePoint);         //must be (1,2)
Point p3 = (Rotate90Cw(downward))(samplePoint);         //must be (0,1)
Point p4 = (Rotate90Cw(runningForward))(samplePoint);   //must be (1,-4)
Point p4 = (Rotate90Cw(Rotate90Cw(forward)))(samplePoint);   //must be (0,1)

どの関数にも適用でき、適切な関数を返す単一の 関数が必要です。したがって、ポイントに適用した場合の効果は、ポイントに適用した場合と同じになります。等々...Rotate90CwTranslateTranslateRotate90Cw(forward)downward

ケースごとに個別の関数を作成するつもりはありませんRotate(例: forwardRotated、downwardRotated など)。

4

2 に答える 2

3

実際に 2 つのデリゲートが必要かどうかは明らかではありません。からへの任意の変換を表す1 つのデリゲートが本当に必要なようです。その後、変換を作成できます。例えば:PointPoint

delegate Point Transform(Point input);

private static Transform Compose(Transform first, Transform second)
{
    return p => second(first(p));
}

Transform forward = p => new Point(p.X + 1, p.Y);
Transform rotate90 = p => new Point(p.Y, -p.X);
Transform forwardThenRotate = Compose(forward, rotate);

編集:実際に必要なのは、次の行に沿った変換(変換を取り込む)のようです:

  • 元の変換を (0, 0) に適用します
  • 結果を回転する
  • 着信点をその分翻訳する

それは簡単にできます:

Transform forward = p => new Point(p.X + 1, p.Y);
Transform rotate90 = p => new Point(-p.Y, p.X);
Point forwardRotatedPoint = rotate90(forward(new Point(0, 0));

Transform forwardRotated = p => new Point(forwardRotatedPoint.X + p.X,
                                          forwardRotatedPoint.Y + p.Y);

他の場所で述べたように、おそらく実際にはとコンポーネントVectorを持つ型が必要になるでしょう...そして、いくつかの構成可能な概念を持つことができます:XY

  • ベクトルからの変換 (ポイント ツー ポイント) の作成
  • 1 つのベクトルを回転させて別のベクトルを作成する
  • 変換の構成
于 2013-03-28T15:08:00.873 に答える
0

私はこのように解決します(編集済み):

Translate Rotate90Cw(Translate moveFunction)
{
    return Rotate(moveFunction, Math.PI / 2.0);
}

Translate Rotate(Translate moveFunction, double angle)
{
    Point tempPoint = moveFunction(new Point(0, 0));
    double sin = Math.Sin(angle);
    double cos = Math.Cos(angle);
    return p => new Point(p.X + tempPoint.X * cos + tempPoint.Y * sin,
                           p.Y - tempPoint.X * sin + tempPoint.Y * cos);
}

動作しているかどうかを確認します。

Rotate90Cw(Rotate90Cw(runningForward))(new Point(1, 1)); //output: (-4,0.9999999)
Rotate90Cw(runningForward)(new Point(1, 1));             //output: (1,-4)
Rotate90Cw(backward)(new Point(1, 1));                   //output: (1,2)
Rotate90Cw(downward)(new Point(1, 1));                   //output: (0,1)
于 2013-03-29T08:12:14.110 に答える