回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我想用SVG路径对象生成一个分形树。树的一个分支应该由一个<code>Branch</code>对象表示。我的递归逻辑和收集<code>path</code>有一些问题。对于<code>depth=1</code>,代码应该生成4<code>path</code>,但是我当前的代码只返回一个这样的<code>path</code>。我该怎么更正?在</p>
<p>我的代码:</p>
<pre><code>import math
class Branch:
def __init__(self, pointxy1, pointxy2):
self.pointXY1 = pointxy1
self.pointXY2 = pointxy2
def __str__(self):
return (r'<path d="M {} {} L {} {}"'' '
'stroke="rgb(100,60,0)" stroke-width="35"/>')\
.format(self.pointXY1[0], self.pointXY1[1], self.pointXY2[0], self.pointXY2[1])
def drawtree(self, lenght, angle, depth):
if depth:
self.pointXY2[0] = self.pointXY1[0] + lenght * (math.cos(math.radians(angle)))
self.pointXY2[1] = self.pointXY1[1] + lenght * (math.cos(math.radians(angle)))
self.drawtree(lenght, angle - 20, depth - 1)
self.drawtree(lenght, angle, depth - 1)
self.drawtree(lenght, angle + 20, depth - 1)
return Branch(self.pointXY1, self.pointXY2)
tree = [Branch([400, 800], [400, 600]).drawtree(200, -90, 1)]
for t in tree:
print t
</code></pre>
<p>下面是输出。只有1条路径,而不是期望的4条路径。在</p>
^{pr2}$
<p>编辑:</p>
<p>这是我的非对象示例,它正在工作:</p>
<pre><code>import math
def drawTree(lenght, angle, depth):
if depth >= 0:
x1 = 400
y1 = 800
x2 = x1 + lenght * (math.cos(math.radians(angle)))
y2 = y1 + lenght * (math.sin(math.radians(angle)))
print (r'<path d="M {} {} L {} {}"'' stroke="rgb(100,60,0)" stroke-width="35"/>').format(x1, y1, x2, y2)
drawTree(lenght, angle - 20, depth - 1)
drawTree(lenght, angle, depth - 1)
drawTree(lenght, angle + 20, depth - 1)
drawTree(200, -90, 1)
</code></pre>
<p>输出:</p>
<pre><code><path d="M 400 800 L 400.0 600.0" stroke="rgb(100,60,0)" stroke-width="35"/>
<path d="M 400 800 L 331.595971335 612.061475843" stroke="rgb(100,60,0)" stroke-width="35"/>
<path d="M 400 800 L 400.0 600.0" stroke="rgb(100,60,0)" stroke-width="35"/>
<path d="M 400 800 L 468.404028665 612.061475843" stroke="rgb(100,60,0)" stroke-width="35"/>
</code></pre>
<p>结果:</p>
<p><a href="https://i.stack.imgur.com/M38lE.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/M38lE.jpg" alt="enter image description here"/></a></p>