我的项目涉及天线设计,其中Python生成.nec文件,允许我在软件中对分形天线进行建模并优化它们以获得最佳性能。该计划旨在使用多个分形天线,包括以下所有:
别担心,这不是家庭作业。我正在发表关于分形天线的演讲,并希望自动化设计过程,否则它很乏味。
不幸的是,我在计算Koch曲线的中心点时遇到了麻烦。这是一张软件中的图片;请注意,我仍然需要解决几何错误。
Here是生成的Python脚本的坐标,迭代级别为3,段大小为0.305m。
下面指出了目前被我的疯狂征服的Python脚本:
正如您将在Koch曲线的图像描述中注意到的那样,它偏离中心的量很小。我找到完整长度的等式是:
其中:
l = total side-length (referenced from the bottom) of the Koch Curve
s = segment size (my segment size was 0.305m, they should all be equal)
n = number of iterations
有谁知道为什么我没有得到这个中心?
谢谢,
奥斯汀
答案 0 :(得分:3)
也许你应该尝试重新实现你的迭代计算更规范。
对Python中一个好的Koch Curve算法的请求的答案在这里:
(问题中的原始代码也可以帮到你很多)
编辑: 我创建了一个脚本,它使用提供的链接中的代码,以及Cairo和Python图像库(PIL)来渲染图像。希望它有所帮助:
#!/bin/env python
# coding: utf-8
import math
angles = [math.radians(60*x) for x in range(6)]
sines = [math.sin(x) for x in angles]
cosin = [math.cos(x) for x in angles]
def L(angle, coords, jump):
return (angle + 1) % 6
def R(angle, coords, jump):
return (angle + 4) % 6
def F(angle, coords, jump):
coords.append(
(coords[-1][0] + jump * cosin[angle],
coords[-1][1] + jump * sines[angle]))
return angle
decode = dict(L=L, R=R, F=F)
def koch(steps, length=200, startPos=(0,0)):
pathcodes="F"
for i in xrange(steps):
pathcodes = pathcodes.replace("F", "FLFRFLF")
jump = float(length) / (3 ** steps)
coords = [startPos]
angle = 0
for move in pathcodes:
angle = decode[move](angle, coords, jump)
return coords
TOTALWIDTH = 1000
points = koch(3,TOTALWIDTH,(-TOTALWIDTH/2,0))
print points
# optional part, shows an image with Y axis(good for debugging)
import cairo, Image
width = TOTALWIDTH
height = int(TOTALWIDTH*0.32)
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
cr = cairo.Context(surface)
cr.set_source_rgb(1,1,1)
cr.rectangle(0, 0, width, height)
cr.fill()
cr.translate(width*0.5, height*0.95)
cr.scale(1, -1)
# red Y axis:
cr.set_source_rgb(1,0,0)
cr.move_to(0,0)
cr.line_to(0,300)
cr.stroke()
cr.set_source_rgb(0,0,0)
cr.set_line_width(0.5)
cr.move_to(*points[0])
for n in range(len(points)):
cr.line_to(*points[n])
cr.stroke()
im = Image.frombuffer("RGBA", (width, height), surface.get_data(), "raw", "BGRA", 0,1)
im.show()
答案 1 :(得分:2)
你的问题在于递归计算一个边的新长度:
def kochCurve(level, lengthSide):
if(level == 0):
ut.fd(lengthSide)
else:
newLengthSide = level/3.0 ## <-- Wrong.
newLevel = level - 1
kochCurve(newLevel, newLengthSide)
ut.lt(60)
kochCurve(newLevel, newLengthSide)
ut.rt(120)
kochCurve(newLevel, newLengthSide)
ut.lt(60)
kochCurve(newLevel, newLengthSide)
您计算newLengthSide时不会引用当前长度边。这条线应该是这样的:
newLengthSide = lengthSide / 3.0
您的细分受众群是0.33333的原因是因为您忽略了传入的.305并以1 / 3.0开头。
我不确定传入的值应该代表什么,所以这可能不是正确使用的新行,但这就是你的段长度错误的原因。
答案 2 :(得分:1)
我决定使用我所拥有的传统代码,但这仅仅是由于一个初步因素:我的kochCurve()代码基于Koch曲线下面的总长度,而在此之前,我传统上认为它确定了单个段的长度。因此,中心点很容易确定。
以下是我生成的脚本采购的图像:
我很感激帮助!