2010-05-21 117 views
7

我正在爲wpf寫一個自定義動畫,並且作爲一個非數學傢伙,我有幾個問題...如何計算曲線上的點?

如果給出兩個Point3D,From和To,並假設原點位於0,0, 0我如何計算兩點之間的曲線?如果我有曲線'繪製'並且知道它的長度(怎麼做呢?),我怎樣才能計算沿線的某個給定距離處的x,y,z座標?

謝謝!

+2

你可能想把它放在http://mathoverflow.net/上,然後回到實施建議。這是一個很好的問題。當你得到解決方案時,把它歸檔......它會在幾年後再次出現,像我一樣,你會忘記數學。現在...我是在什麼文件下?曲線?...圖形?....廢話。 – Rusty 2010-05-21 19:02:29

+1

當你說你想要一個「曲線」時,它聽起來像你不只是想要在你的兩點之間有一條直線,而是你想要一條連接你的端點和其他點之間的曲線。也許將樣條曲線和NURBS作爲開始。 – FrustratedWithFormsDesigner 2010-05-21 19:07:39

+0

你應該真正指定你想要的曲線類型:有無數曲線通過2點。 編輯:如果你想要一個樣條,你至少需要3分。 – nico 2010-05-21 19:09:08

回答

5

爲了從點A的直線向量的點B:

乙 - 甲

這將轉化爲:

vector.x = b.x - a.x; 
vector.y = b.y - a.y; 
vector.z = b.z - a.z; 

長度:

length = Math.Sqrt(vector.x * vector.x + 
        vector.y * vector.y + 
        vector.z * vector.z); 

拿到一分沿着你需要做的向量的單位向量的向量(長度1)一定的距離:

vector.x = vector.x/length; 
... 

,然後由你的距離乘以:

vector.x = distance * vector.x; 
... 

這是所有從內存因此可能無法立即編譯。

CodeProject上有A Vector Type for C#這將爲你做很多事情。

如果你想有一個曲線,那麼你需要:

一個)來定義你想要什麼類型的曲線(圓弧,樣條等)

B)分以上(中心,控制點等)

+0

,則需要第三點您可以查看我上面的註釋,但如實說,我不知道我想要什麼樣的曲線 - 我所知道的是這兩點必須存在於我的起源周圍的表面上 - 基本上球體或橢球體是我唯一的兩個選擇...... – Nicros 2010-05-21 21:04:39

0

你可能想表達你的曲線爲一組的其他變量的參數功能:

x = f(t) 
y = g(t) 
z = h(t) 

where 0 <= t <= 1, and 

f(0) = from.x, f(1) = to.x 
g(0) = from.y, g(1) = to.y 
h(0) = from.z, h(1) = to.z 

有曲線connectin無限多g任意兩點,所以你需要更多的信息來決定f(t),g(t)和h(t)應該採用什麼形式。要沿着曲線移動點 ,只需讓t在0和1之間變化,然後計算x,y和z座標。一種方法是定義一組您希望曲線通過(或接近)的控制點,然後根據 spline functions表示您的參數方程。你不需要知道曲線的弧長就可以做到這一點。

+0

感謝您的回覆!我上面發表了一些評論,但基本上,我認爲我的兩點是在一個封閉的表面上 - 一個球體或一個橢球體。所以考慮到原點和這兩點,我需要在給定的時間(或沿線的距離)得到xyz位置。 – Nicros 2010-05-21 21:09:57

0

所以我只是想跟進我的解決方案 - 雖然它是真的有無數的曲線 - 我的(措辭不佳)問題是如何在曲線上的兩點之間繪製 - 最短距離,假設0,0,0的原點和兩個3d點。我所做的就是將我的點從笛卡爾轉換爲極點,在給定時間計算球面點,然後將該點轉換回笛卡兒。如果有人想讓我發佈實際的C#代碼,請告訴我。