2013-02-20 63 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