2012-07-03 89 views
2

所以,我給出了橢圓 - 它們是由它們的中點,水平半徑(rh)和垂直半徑(rv)定義的。我使用sin/cos繪製它們,結果看起來相當不錯(只要確保它不是錯誤來源)。如何在給定角度的橢圓輪廓上得到一個點?

現在說我有一個角度(或一個方向向量)給出,我想要在該角度/方向的橢圓輪廓上的點。我直觀的方法是簡單地使用方向矢量,對其進行歸一化,並將其x分量乘以rh,將其y分量乘以rv。現在我的書面程序和我在紙上做的所有計算都不是我想要的,而是另一個,儘管它仍然在橢圓的輪廓上。但是,如果方向是(1,0),(0,1),(-1,0),(0,-1),(因此它適用於0°,90°, 180°,270°)。

儘管在互聯網上有大量關於省略號的數據,但我找不到有關我的特定問題的任何信息 - 而且我不能提出比上述更好的解決方案。

那麼,任何想法如何實現呢?

回答

2

如果我明白你問什麼話,我認爲你需要的是polar form of an ellipse其中角度從橢圓的中心位置測量。使用這種橢圓形式,您可以在給定的theta選項中對橢圓半徑值進行蒸發,然後繪製您的點。

如果看看這個GIF圖像,你會看到爲什麼使用參數角度給你正確結果在THETA = 90,180,270和360度http://en.wikipedia.org/wiki/File:Parametric_ellipse.gif。使用橢圓的極座標形式,你應該得到你想要的點。

1

您是對的 - 參數角度爲而不是與所需點和X軸之間的角度相同。然而,他們的切線比例(與rh/rv倍),所以你可以使用這個方法:

  • 獲取所需的角度
  • 乘該切線的切線由rh/rv
  • 使用trigonometric identities計算正弦值並從正切
  • 秤/位置根據所述參數的點(中點,RH,RV)

在Python餘弦:

from math import copysign, cos, sin, sqrt 

class Ellipse: 

     def __init__(self, mx, my, rh, rv): 
       self.mx = mx 
       self.my = my 
       self.rh = rh 
       self.rv = rv 

     def pointFromAngle(self, a): 
       c = cos(a) 
       s = sin(a) 
       ta = s/c ## tan(a) 
       tt = ta * self.rh/self.rv ## tan(t) 
       d = 1./sqrt(1. + tt * tt) 
       x = self.mx + copysign(self.rh * d, c) 
       y = self.my + copysign(self.rv * tt * d, s) 
       return x, y