如果你有一个点Q
的坐标在3D:(X,Y,Z)
而且要投影到其中包含一个点P
并具有法向量的平面,
的平面方程为
(R - P) . n = 0
我在哪里使用矢量减法,.
是点积。
由此可以推导出任何点在该平面上的投影:沿着法线矢量n
绘制直线,直到它与平面相交。
所以会有一定的价值a
这样
Q + a * n
位于平面,即
(Q - a * n - P) . n = 0
解决了(注意,n . n = 1
):
a = (Q - P) . n
(注意 - 这是从Q到P的“正常距离”;不是巧合!)
在它们交叉点的值现在是
Q + ((Q - P) . n) * n
通知再次 - 我使用矢量数学,所以最后*n
结果在三个值(因为n是一个三维向量)。
如果您尝试在平面上进行非正常投影(例如,要投影到XY平面上,但您正在“看一个角度”),则可以对此进行概括。在这种情况下,需要沿不同的方向米(你正在寻找的方向)突出,并且该交叉点的方程变为
Q + ((Q - P) . n) * m/(m . n)
正如你可以看到,如果m是垂直于N(你正在寻找沿着飞机,而不是在它),没有解决方案......
你也可以看到,如果你是一个投影直XY平面上,因此n = [0 0 1]),整个事情简化为设置Z = 0
让我知道这是不是足够,或者如果你需要的代码行实际...
---编辑---添加一些简单的代码:
如果您有一系列描述点(X,Y)的你的曲线,你可以围绕Z轴(垂直于你的平面)旋转角度θ通过如下:
x1 = x * cos(theta) - y * sin(theta);
y1 = x * sin(theta) + y * cos(theta);
现在你可以“嘎吱”这点所以看来你是从侧面看他们,通过简单地减少y坐标:
x2 = x1;
y2 = y1 * cos(alpha);
其中alpha
是您正在查看曲线的视角。所以如果你直接看着XY平面,alpha
是0,而y2 = y1
。如果你看45度,alpha
是pi/4
和y2 = 0.707 * y1
(大约)。
可以将这些两个转变结合成:
xnew = x * cos(theta) - y * sin(theta);
ynew = cos(alpha) * (x * sin(theta) + y * cos(theta));
尝试此theta的几个值(0和0.5之间,在0.1的步骤)和α(类似于范围可能是好的)。看看你是否喜欢结果。
也许这对你更好(在“更有用”的意义上说)?
我对CoreGraphics一无所知,但这只是一个几何问题。你需要应用两个矩阵变换的结果;首先a *旋转*,然后a *投影*。您可以将这两个矩阵相乘以获得单个变换。 – 2013-02-20 09:30:33
为什么不用3D来旋转图层? – 2013-02-20 10:26:30
@DavidRönnqvist - 当我这样做时,图层将没有真正的深度并且看起来平坦。我只想要协调。 – Chris 2013-02-20 11:38:14