Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 分形科赫曲线_Python - Fatal编程技术网

Python 分形科赫曲线

Python 分形科赫曲线,python,Python,我的项目涉及天线设计,其中Python生成.nec文件,该文件允许我在软件中对分形天线进行建模,并对其进行优化以获得最佳性能。该程序旨在使用多个分形天线,包括以下所有功能: 科赫曲线 希尔伯特曲线 科赫雪花 别担心,这不是家庭作业。我正在做一个关于分形天线的演讲,我想让设计过程自动化,否则会很乏味 不幸的是,我在计算科赫曲线的中心点时遇到了麻烦。这是一幅它在软件中的样子;请注意,我仍然需要解决几何错误 是使用迭代级别3和段大小0.305m生成的Python脚本的坐标 下面指出了我目前疯狂使

我的项目涉及天线设计,其中Python生成.nec文件,该文件允许我在软件中对分形天线进行建模,并对其进行优化以获得最佳性能。该程序旨在使用多个分形天线,包括以下所有功能:

  • 科赫曲线
  • 希尔伯特曲线
  • 科赫雪花
别担心,这不是家庭作业。我正在做一个关于分形天线的演讲,我想让设计过程自动化,否则会很乏味

不幸的是,我在计算科赫曲线的中心点时遇到了麻烦。这是一幅它在软件中的样子;请注意,我仍然需要解决几何错误

是使用迭代级别3和段大小0.305m生成的Python脚本的坐标

下面指出了我目前疯狂使用的Python脚本:

正如您在科赫曲线的图像描述中所注意到的,它稍微偏离中心。我计算完整长度的公式如下:

其中:

 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
有人知道我为什么没拿到中心吗

谢谢


奥斯汀

也许你应该尝试重新实现你的迭代计算,使之更规范

下面是对Python中良好的Koch曲线算法请求的回答:

(问题中的原始代码对您也有很大帮助)

编辑: 我创建了一个脚本,它使用提供的链接中的代码,以及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()

您的问题在于计算边的新长度的递归:

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)
分段为0.33333的原因是忽略传入的.305,并以1/3.0开头


我不确定传入的值到底应该表示什么,因此这可能不是正确的新行,但这就是为什么您的段长度错误。

我决定使用我拥有的传统代码,但这只是由于一个初步因素:我的kochCurve()代码基于科赫曲线下的总长度,而以前,我传统上认为它决定了单个段的长度。因此,中心点很容易确定

以下是生成的脚本获取的图像:


我感谢你的帮助

它的一边应该比另一边长吗?不,它们的长度应该相等。这个天线是一个偶极子,所以我试着把它对称地分开,把馈电线放在中心三角形的尖端。我添加了Python生成的实际坐标,以便让大家更好地了解输出是什么。我查看了您的代码,您确定所有代码行都是必需的,或者至少是解决不对称问题所必需的吗?你能缩小你的代码并直接粘贴到问题上吗?我看了更多,你的代码非常复杂(speghetti代码),不清楚什么是什么,似乎有很多硬编码的数字对问题域之外的任何人都没有意义。中心不是曲线所基于的原始直线的中心吗?这肯定有帮助,我将在我的代码中实现该方法。敬请期待!我没有考虑到你有一个固定的段长度,而不是天线的总宽度,但是应该很容易找到它们之间的相关性,并从台阶和段的纵向获得宽度。我在Git上把它添加到我的项目代码中,但是你认为我最终应该用UndrawnTurtle()类来实现这个功能吗?老实说,我会把所有海龟的东西都从项目中移除。实际上,您需要的是一个点坐标的有序列表,它确实创建了一条多段线,这就是提供的代码返回的结果。从这样的列表中,您可以很容易地获得.NEC格式的输出,或者您想要的任何其他文本格式(XML、CSV、JSON、Matlab等),可以使用一些库,也可以直接从Python获得字符串格式的输出。嗯……是的,但是科赫雪花呢?希尔伯特曲线呢?除了Koch雪花和Hilbert曲线之外,还有其他Python代码采用同样的方法吗?我没有注意到!我改变了它,它使天线变得更小。
        newLengthSide = lengthSide / 3.0