2016-04-29 69 views
1

我試圖生成用帆布可變大小的多邊形,但我無法計算它的一些點,紅色的人在這裏:點公式爲多邊形

enter image description here

這是我當前的代碼:

var x = 0; 
var y = 0; 
var size = 200; 

var points = [[x + (size/2), y], 
      [x + size, y + (size/4)], 
      [x + size, y + size - (size/4)], 
      [x + (size/2), y + size], 
      [x, y + size - (size/4)], 
      [x, y + (size/4)]]; 

而且我得到這個:

enter image description here

那麼size/4size/2是錯的......有沒有某種公式來計算那些棘手的4點,所以多邊形完全適合一個圓形的圓?

+1

'size'代表什麼?六邊形的寬度從一邊到另一邊,還是從拐角到拐角?請記住,六角形由六個60-60-60三角形組成。三角形高度的長度是邊長「sqrt(3)/ 2」的長度。如果「大小」是角落的角落,則表示其中一個三角形邊的長度的兩倍。從這些信息中,你應該能夠弄清楚。由於角度「很好」,因此不需要Trig。 :) – lurker

回答

2

最簡單的事情是將2 * Pi分成n個偶數部分並使用三角函數來獲得座標。你應該能夠在下面的Python腳本轉換到你所選擇的語言:

from math import sin, cos, pi 

def regularPoly(n,a,b,r): 
    points = [(a,b+r)] 
    theta = pi/2 
    dTheta = 2*pi/n 

    for i in range(1,n): 
     theta += dTheta 
     points.append((a + r*cos(theta), b + r*sin(theta))) 

    return points 

例如,

>>> hexagon = regularPoly(6,0,0,100) 
>>> for x,y in hexagon: print(x,y) 

0 100 
-86.60254037844385 50.000000000000036 
-86.6025403784439 -49.999999999999936 
-1.0718754395722282e-13 -100.0 
86.60254037844379 -50.00000000000012 
86.60254037844395 49.99999999999985 

當繪製,您可以:

enter image description here

的公式給出了標準的笛卡爾座標。顯然,你可以舍入到整數,並做一些變量的變化,以獲得與(0,0)左上角的畫布座標。

+0

謝謝,所以公式是size * sin(2 * Math.PI/6)。但你爲什麼到達那裏50.000000000036而不是50? thos ... 036和... 012來自哪裏? –

+0

@AnnaK。浮點計算不可避免地涉及到舍入誤差。到達整數畫布座標時,這並不重要。我會放棄它,儘管一個足夠感興趣的人可以深入研究用於實現'sin'和'cos'的算法,並回答爲什麼這些特定的舍入錯誤。 –