我有一些代表和一个方法:
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
一个一个地应用函数。我需要的是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、downRotated 和...