私はいくつかのデリゲートとメソッドを持っています:
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)
どの関数にも適用でき、適切な関数を返す単一の 関数が必要です。したがって、ポイントに適用した場合の効果は、ポイントに適用した場合と同じになります。等々...
Rotate90Cw
Translate
Translate
Rotate90Cw(forward)
downward
ケースごとに個別の関数を作成するつもりはありませんRotate
(例: forwardRotated、downwardRotated など)。