IDE:Visual Studio 2010,c#.net 4.0 winforms應用程序。如何創建圓形截面?
嗨,在我的應用程序必須把一個圓(其在8個部分設定的面板(圓形圖像)上請建議如何劃分,在8個部分。
例
因爲我想執行不同的鼠標按下鼠標了對這些部分的事件。所以這將是更好,如果你能提出任何伎倆方式或算法或DLL或API來解決這個問題。
IDE:Visual Studio 2010,c#.net 4.0 winforms應用程序。如何創建圓形截面?
嗨,在我的應用程序必須把一個圓(其在8個部分設定的面板(圓形圖像)上請建議如何劃分,在8個部分。
例
因爲我想執行不同的鼠標按下鼠標了對這些部分的事件。所以這將是更好,如果你能提出任何伎倆方式或算法或DLL或API來解決這個問題。
您的問題最好用極座標表示,而鼠標座標通常以笛卡爾值表示。
要進行轉換,請在您的控件的哪個部分計算鼠標的位置,作爲座標偏移量。 例如,
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;
轉換的(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);
}
我添加了一個負角度檢查。 – ja72
非常好,這個算法的名字是什麼..? – yogeshkmrsoni
好吧,我想它太短了,不值得被稱爲算法,但它是從笛卡爾到極座標的典型轉換。 請參閱: http://en.wikipedia.org/wiki/Polar_coordinate_system, http://mathworld.wolfram.com/PolarCoordinates.html – Mau
非常感謝。 :-) – yogeshkmrsoni