【问题标题】:Making random polygons using python使用python制作随机多边形
【发布时间】:2017-03-28 05:45:16
【问题描述】:

我是一个非常大的人,并且正在编写代码以通过 python 制作一个随机多边形。 我在代码中找不到任何错误,但我无法打印所有顶点,只能打印一个顶点的一对 x、y 坐标。 有人可以告诉我吗?我认为 map(tuple, verts) 是有问题的。

非常感谢。

import math, random
def generatePolygon( ctrX, ctrY, aveRadius, irregularity, spikeyness, numVerts ) :

    irregularity = clip( irregularity, 0,1 ) * 2*math.pi / numVerts
    spikeyness = clip( spikeyness, 0,1 ) * aveRadius

    # generate n angle steps
    angleSteps = []
    lower = (2*math.pi / numVerts) - irregularity
    upper = (2*math.pi / numVerts) + irregularity
    sum = 0
    for i in range(numVerts) :
        tmp = random.uniform(lower, upper)
        angleSteps.append( tmp )
        sum = sum + tmp

    # normalize the steps so that point 0 and point n+1 are the same
    k = sum / (2*math.pi)
    for i in range(numVerts) :
        angleSteps[i] = angleSteps[i] / k

    # now generate the points
    points = []
    angle = random.uniform(0, 2*math.pi)
    for i in range(numVerts) :
        r_i = clip( random.gauss(aveRadius, spikeyness), 0, 2*aveRadius )
        x = ctrX + r_i*math.cos(angle)
        y = ctrY + r_i*math.sin(angle)
        points.append(( int(x),int(y) ))
        angle = angle + angleSteps[i]

        return points

def clip(x, min, max) :
    if( min > max ) :  return x    
    elif( x < min ) :  return min
    elif( x > max ) :  return max
    else :             return x


verts = generatePolygon( ctrX=250, ctrY=250, aveRadius=100, irregularity=0, spikeyness=0, numVerts=16 )

tupVerts = list(map(tuple,verts))

print(tupVerts)

【问题讨论】:

  • 问题是您的return 语句在generatePolygone 中缩进了太多次。
  • 有趣的代码。 list(map(tuple,verts)) 没有意义:verts 已经是一个元组列表。顺便说一句,您不应该使用summinmax 作为变量名,因为这会影响同名的内置函数。 (我建议改用totallohi)。此外,通常的 Python 约定是对简单的变量名使用 snake_case,而不是 camelCase,请参阅PEP-0008 了解详细信息。

标签: python dictionary tuples polygon


【解决方案1】:

您的函数返回得太早 - 在计算了一个点之后。问题来了:

for i in range(numVerts) :
    r_i = clip( random.gauss(aveRadius, spikeyness), 0, 2*aveRadius )
    x = ctrX + r_i*math.cos(angle)
    y = ctrY + r_i*math.sin(angle)
    points.append(( int(x),int(y) ))
    angle = angle + angleSteps[i]

    return points # <--- here

for i in range(numVerts) :
    r_i = clip( random.gauss(aveRadius, spikeyness), 0, 2*aveRadius )
    x = ctrX + r_i*math.cos(angle)
    y = ctrY + r_i*math.sin(angle)
    points.append(( int(x),int(y) ))
    angle = angle + angleSteps[i]

return points # <--- Should look like this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    相关资源
    最近更新 更多