Python - 绘制多边形

4
所以我正在尝试使用点类绘制不同的多边形。我创建了一个名为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类中,要么出在我的rotate类中,但是我似乎无法找到问题所在。


这一切都很神秘。您没有展示名为Line_Point的类,也没有展示名为generate_polygon或rotate的类。.rotate()被调用,就好像它是Point类的成员一样,但实际上并不是。您给出的输出显然不能来自这段代码集合。您到底在做什么? - Paul Cornelius
我不会向你展示我类中的每一行代码。Line_Point程序是包含Point类和Line类的代码,这个代码被称为Line_Point,这就是我为什么要叫那个特定程序的原因。第一个代码叫generate_polygon.py。第二个是我的Line_Point.py程序。第三个代码来自我的rotate.py程序。我还有两个类似的程序叫做scale和translate,它们的工作方式与rotate.py类似。现在你明白了吗? - Chase
我的点类中也有一个旋转函数,还有另一个名为rotate.py的程序,它循环遍历标准输入中的每一行,并将每一行分成4个部分。 - Chase
“class”这个词指的是在类定义语句中跟随类名的名称,例如您的情况下是Point和Line。而“module”这个词则指单个.py文件;模块与“import”语句一起使用,例如您的情况下是Line_Point.py。在Python中,它们完全不是同一回事(但如果我没记错的话,在Java中它们是相同的)。正确使用这些术语可以避免误解。 - Paul Cornelius
1个回答

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

如果它应该放在Point类中,那么我99%确定是错的。需要传入'a'。调用方式是p0 = Point(0.0, 0.0) p0.rotate(1),其中1是旋转的角度。我认为你不能仅使用self创建一个旋转方法。这不起作用。另外,x和y从哪里来?我已经在上面定义了x和y,因此没有必要再次定义它们。 - Chase
此外,即使我使用您的方法并将其更改为(self,a),它仍然给出相同的输出,因此实际上只需添加x = self.x就不需要执行任何操作。我认为问题在另一个代码中。 - Chase
我实际想要的是 x0 = cos(a) * x - sin(a) * y,y0 = sin(a) * x + cos(a) * y,其中点(x0,y0)是点(x,y)逆时针旋转theta弧度后的点。我没有使用x0和y0是因为该类必须打印出x和y的值,如果我使用x0和y0,则x和y保持不变,将返回错误的值。 - Chase
你把新值称为x0和y0,而我称它们为x'和y'。我的意思是,在修改self.x的值后,不能在第二行中使用它,否则会得到错误的答案。我知道你想保持相同的变量名,所以你必须创建一个临时变量来保存原始值。我第一次称它为普通的“x”,但我又修改了答案,称它为original_x。希望这能清楚地表达我的观点。 - Paul Cornelius
好的,这有点帮助。我更新了我的代码以显示我的新输出。它几乎完成了,除了在4个值之前出现单词“line”,所以我不知道如何添加它,但现在先忽略它,第一行是相同的。对于第二行,最后一个数字是125,需要改为-125。最后一行也需要-125以及0和250。我得到的是217然后是125。 - Chase
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接