2015-06-04 73 views
4

我目前卡住了試圖計算dreamcatcher及其內圈。基本上你有一個給定半徑爲x的外部圓,你需要計算它的周長。那麼你將不得不計算一個魔法值,即每個弓(在圖像中的數字)應該是多寬,它應該導致弓不會在起點完成,但與第一個弓重疊約半個弓。python:計算dreamcatcher的步驟

how it is done

這裏是我試過至今:

import math 

# in cm 
rad = 5.0 

perimeter = round(rad * 2.0 * math.pi, 2) 
print "perimeter == %f" % perimeter 

#bow = "?" 
incValue = 0.00001 
start = incValue 
end = perimeter 
while start < end/10: 
    tmp = start * 10 
    while tmp < perimeter: 
    tmp += start 

    if tmp - perimeter == start/2: 
    print "bow could be %s" % str(tmp) 

    start += incValue 

print "done" 

,但我沒能找到一個適合該限制值。

+0

我認爲'如果tmp - perimeter == start/2'有問題,因爲浮點數很少比較相等。你可能需要實現某種'very_nearly_equals(a,b)',當'abs(a-b) Kevin

+0

你能證明你的意思是寬廣的每一個弓嗎? – Kasramvd

+0

@Kasra是否足夠說「每個弓的寬度」等於(例如在圖片中)Erste Umschlingung和2的距離? – Zaiborg

回答

3

我認爲你可以得到你想要與

bow_length = perimeter/(desired_number_of_full_bows + 0.5) 

但是,如果你在得到您的近似系統的工作真正感興趣,我覺得這條線是導致問題的值:

if tmp - perimeter == start/2: 

浮點數很少會相互比較,所以常規的做法是檢查它們是否非常接近。所以,你可能會改爲做:

if abs((tmp - perimeter) - (start/2)) < epsilon: 

...其中epsilon代表兩個數字,你會願意接受的最大可能的「迴旋餘地」。這將是0.0001,儘管您可以嘗試更大或更小的值以查看最佳效果。