如果你有一個點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