2013-02-20 65 views
0

图1: 我在2D(CoreGraphics中)的层上绘制贝塞尔,我点A & B.2D点,到3D,然后再返回到2D

图2: 我可以旋转层大约70度。

图3: 我想知道点A & B现在是什么,通过某种方式将图像从3D回缩到2D。

什么我非常想说的是这样的函数:

-(CGPoint)calculateNewPointFrom:(CGPoint)p withAngle:(float)angle 
{ 
    //Rotate point by angle in 3d space 
    //Return new point in 2d space 
} 

2D to 3D, back to 2D

所有帮助欢迎。由于

+1

我对CoreGraphics一无所知,但这只是一个几何问题。你需要应用两个矩阵变换的结果;首先a *旋转*,然后a *投影*。您可以将这两个矩阵相乘以获得单个变换。 – 2013-02-20 09:30:33

+0

为什么不用3D来旋转图层? – 2013-02-20 10:26:30

+0

@DavidRönnqvist - 当我这样做时,图层将没有真正的深度并且看起来平坦。我只想要协调。 – Chris 2013-02-20 11:38:14

回答

0

如果你有一个点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度,alphapi/4y2 = 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的步骤)和α(类似于范围可能是好的)。看看你是否喜欢结果。

也许这对你更好(在“更有用”的意义上说)?

+0

嗨,谢谢你,说实话,这有点过头了。我的第一个观点是在2D空间中,在X轴上应用旋转之后,如何在3D空间中获得新点? – Chris 2013-02-20 20:26:35

+0

我有很多阅读材料可以做:-)感谢您的回答,我确定它是有道理的,但我需要做一些学习。我找到了CGPointApplyAffineTransform,看起来它可能会帮助我。谢谢 – Chris 2013-02-21 22:20:46