2015-06-04 44 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,尽管您可以尝试更大或更小的值以查看最佳效果。