Итак, я пытаюсь рисовать различные полигоны с использованием точечного класса. Я создал класс с именем generate_polygon, который должен генерировать регулярный многоугольник со сторонами s, а x0, y0 - начальная вершина.Python - рисование многоугольника
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, который читает строку из стандартного ввода и разбивает их на 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)
Таким образом, ожидаемый выход представляет собой файл строк с четырьмя различными частями линии. Если я могу проверить код, используя 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, а это не так. Результат, который вы четко даете, не может быть получен из этой коллекции кода. Что вы на самом деле делаете? –
Ну, я не показываю вам каждый бит кода в моих классах. Программа Line_Point представляет собой код, который содержит класс Point и класс Line, а код называется Line_Point, и именно поэтому я называю эту конкретную программу. Первый код назывался generate_polygon.py. Второй - моя программа Line_Point.py. Третий код был из моей программы rotate.py. У меня также есть две другие аналогичные программы, называемые scale и translate, и оба они работают аналогично rotate.py. Теперь ты понимаешь? – Chase
Существует также поворот внутри моего точечного класса, а также другая программа rotate.py, которую я использую, которая проходит через каждую строку в stdin и разбивает каждую строку на 4 раздела. – Chase