2012-10-14 110 views
4

Canvas計算圓弧中心點,知道它的開始和結束度

這個答案的最快的描述是,我試圖找到白點的座標。深紅色是繪製的圓上的繪製圓弧(深藍色)。

較長的解釋: 我已被延伸View和被畫圈在畫布上的一類(在畫布具有相等的寬度和高度):

canvas.drawArc(rectF, 0, 360, true, paint); // mOvals is a RectF object with 4 coordinates 

然後我劃弧即百分之N(假設在這種情況下爲225)。圓弧從-90度開始(因爲畫布中的0度意味着3'o個時鐘)和「渡」N度(在本例中爲225度)。

我想計算X/Y座標或其餘圓弧的中心(未被紅色圓弧覆蓋的區域,即在N和360之間)。

如果有一些幫助,我有半徑爲canvasWidth/2的圓。

以下是我畫的紅色弧線:(。原來的答覆更新它可能是一個有點太冗長了,但我希望它能幫助)

long arcEnd = (360 * fractionNumber)/totalNumber; 
canvas.drawArc(rectF, -90, arcEnd, true, paint); 

回答

5

您正在尋找的XY座標(稱爲笛卡爾座標),但這些很難直接計算。訣竅是先通過極座標。極地和笛卡爾是表達同一事物的兩種方式,即網格中的一個點,可以轉化爲彼此。

極座標由距離中心點的角度和距離組成。您可以計算所需的角度,因爲您知道需要覆蓋的圓的百分比,並且可以計算與中​​心的距離,因爲您知道圓的半徑。

你的覆蓋弧是225度,所以餘下的是135,一半是67.5度。因此,您要找的點的角度爲225 + 67.5 = 292.5度。該點的半徑是圓的半徑的一半,所以這是canvasWidth/4

一旦確定了極座標,(292.5, canvasWidth/4),則使用conversion function將其轉換爲XY座標。有一件事情有點棘手:Math.cos(double)Math.sin(double)預計他們的論點在radians,而不是度數。在進行轉換之前,您將292.5/360表示爲x /2π,您將該值乘以π/ 180,在此情況下爲5.1051。

假設canvasWidth爲400:

double tdeg 292.5d; // Calculated from arc percentage 
int r = 100;  // Calculated from canvas width 

double trad = tdeg * (Math.PI/180d); // = 5.1051 

int x = (int) r * Math.cos(trad); 
int y = (int) r * Math.sin(trad); 
+0

你能詳細一點?我嘗試通過'Math.atan2(x,y)'運行原始的X和Y座標,但它只返回一個數字,如「0.8612618928415864」。你知道我怎麼把它轉換成實際座標? –

+0

它不是通過轉換提供的XY座標(笛卡爾座標),而是極座標。極地和笛卡爾只是表達同一事物的兩種方式(網格中的一個點)。極座標由角度(通常在0和360之間,或整個圓圈的0和2π)和距中心點的距離組成。您可以計算所需的角度,因爲您知道百分比,並且可以計算距離,因爲您知道圓的半徑。一旦確定了極座標,就可以使用鏈接到的函數將其轉換爲XY座標。 – Barend

+1

任何人都可以在此找到解決方案?非常感謝您的幫助,謝謝 – ralphgabb

相關問題