2014-02-26 27 views
1

IDE:Visual Studio 2010,c#.net 4.0 winforms應用程序。如何創建圓形截面?

嗨,在我的應用程序必須把一個圓(其在8個部分設定的面板(圓形圖像)上請建議如何劃分,在8個部分。


Example

因爲我想執行不同的鼠標按下鼠標了對這些部分的事件。所以這將是更好,如果你能提出任何伎倆方式或算法或DLL或API來解決這個問題。

回答

3

您的問題最好用極座標表示,而鼠標座標通常以笛卡爾值表示。

要進行轉換,請在您的控件的哪個部分計算鼠標的位置,作爲座標偏移量。 例如,

var xOffset = xMouse - xCenter; 
var yOffset = yMouse - yCenter; 

使用atan2打開的偏移到的角度在[0,360] DEG:

var angle = Math.Atan2(yOffset, xOffset)/Math.Pi*180 + 180; 

現在使用的角度值來確定你在什麼活動:

int nSectors = 8; 
int sectorId = (int)angle/360.0*nSectors; 
+0

非常好,這個算法的名字是什麼..? – yogeshkmrsoni

+0

好吧,我想它太短了,不值得被稱爲算法,但它是從笛卡爾到極座標的典型轉換。 請參閱: http://en.wikipedia.org/wiki/Polar_coordinate_system, http://mathworld.wolfram.com/PolarCoordinates.html – Mau

+0

非常感謝。 :-) – yogeshkmrsoni

3

轉換的(X, Y)座標從圓的中心座標到極座標(半徑,角度)。然後,如果半徑是圓內,使用角度值找出用戶單擊了哪個段。

例如,如果圓的中心位於(xc,yc)和在(x,y)發生了點擊,然後

float dx = x-xc, dy = y-yc; 
float radius = (float)Math.Sqrt(dx*dx+dy*dy); 
float angle = (float)Math.Atan2(dy,dx); 
if(angle<0) { angle += 2*Math.PI; } 
float segment_angle = 2*Math.PI/8; 

if(radius <= diameter/2) 
{ 
    int segment = (int)(angle/segment_angle); 
} 
+0

我添加了一個負角度檢查。 – ja72