Python - 绘制多边形

时间:2016-03-11 00:31:09

标签: python

所以我试图使用点类绘制不同的多边形。我创建了一个名为generate_polygon的类,它应该生成一个带有s边和x0的正多边形,y0是起始顶点。

import sys
import math
import Line_Point 

try:
    x0 = float(sys.argv[1])
    y0 = float(sys.argv[2])
    s = int(sys.argv[3])
except:
    print >> sys.stderr, 'Syntax: generate_polygon.py x0 y0 s'
    sys.exit(1)

p1 = Line_Point.Point(x0, y0)
while s>0:
    p2 = Line_Point.Point(p1.x, p1.y)
    p2.rotate((2*math.pi)/s)
    line = Line_Point.Line(p1, p2)
    print >> sys.stdout, line
    p1=p2
    s = s-1

它还使用另一个名为Line_Point的类:

class Point:

    def __init__(self, x, y):
        if not isinstance(x, float):
            raise Error("Parameter \"x\" illegal.")
        self.x = x
        if not isinstance(y, float):
            raise Error ("Parameter \"y\" illegal.")
        self.y = y

def rotate(self, a):
        if not isinstance(a, float):
            raise Error("Parameter \"a\" illegal.")
        original_x = self.x
        original_y = self.y  # not necessary but looks cleaner
        self.x = math.cos(a) * original_x - math.sin(a) * original_y
        self.y = math.sin(a) * original_x + math.cos(a) * original_y

class Line:

    def __init__(self, point0, point1):
        self.point0 = Point(point0.x, point0.y)
        self.point1 = Point(point1.x, point1.y)

    def rotate(self, a):
        if not isinstance(a, float) or not isinstance(self.point0.x, float) or not isinstance(self.point1.y, float):
        raise Error("Parameter \"a\" illegal.")
    self.point0.rotate(a)
    self.point1.rotate(a)

我还使用另一个名为rotate的类,它从stdin读取行并将它们分成4个独立的部分并旋转每个部分:

import sys
import Line_Point

try:
    a = float(sys.argv[1])
    count = int(sys.argv[2])
except:
    print >> sys.stderr, 'Syntax: rotate.py angle count'
    sys.exit(1)
for L in sys.stdin:
    L = L.split()
    print L
    x0 = float(L[0])
    y0 = float(L[1])
    x = float(L[2])
    y = float(L[3])
    p0 = Line_Point.Point(x0, y0)
    p1 = Line_Point.Point(x, y)
    line = Line_Point.Line(p0, p1)
for x in range(count):
    print L
    p0.rotate(a)

所以预期的输出是一个包含4个不同线部分的线文件。如果我使用python generate_polygon.py 0.0 250.0 3测试代码,那么预期的输出是:

line 0 250 -217 -125
line -217 -125 217 -125
line 217 -125 0 250

但我最终得到的是:

0 250 -217 -125
-217 -125 217 125
217 125 217 125

所以有几个数字是完全错误的,并且在4行之前没有线。所以我认为问题出在我的generate_polygon类或我的旋转类中,但我似乎无法弄清问题是什么。

1 个答案:

答案 0 :(得分:0)

我假设第一个函数rotate属于类Point并且没有正确缩进。这就是问题所在。第一行修改变量self.x,然后第二行使用已修改的值。你需要这个:

def rotate(self,a):
    original_x = self.x
    original_y = self.y  # not necessary but looks cleaner
    self.x = math.cos(a) * original_x - math.sin(a) * original_y
    self.y = math.sin(a) * original_x + math.cos(a) * original_y

在顶部列表中的while循环之前,2*math.pi/s是旋转每个新线段的角度。在计算过程中,该角度不应改变。由于每次循环都会减小s,因此应该在输入循环之前计算角度(无论如何这都是一个好习惯):

angle = 2 * math.pi / s
while s>0:
    p2 = Line_Point.Point(p1.x, p1.y)
    p2.rotate(angle)
    line = Line_Point.Line(p1, p2)
    print >> sys.stdout, line
    p1=p2
    s = s-1