2016-03-11 3 views
4

Итак, я пытаюсь рисовать различные полигоны с использованием точечного класса. Я создал класс с именем 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, но я не могу понять, в чем проблема.

+0

Это все очень загадочно. Вы не показываете класс с именем Line_Point, а также класс с именем generate_polygon или класс с именем rotate. '.rotate()' вызывается так, как если бы он был членом класса Point, а это не так. Результат, который вы четко даете, не может быть получен из этой коллекции кода. Что вы на самом деле делаете? –

+0

Ну, я не показываю вам каждый бит кода в моих классах. Программа Line_Point представляет собой код, который содержит класс Point и класс Line, а код называется Line_Point, и именно поэтому я называю эту конкретную программу. Первый код назывался generate_polygon.py. Второй - моя программа Line_Point.py. Третий код был из моей программы rotate.py. У меня также есть две другие аналогичные программы, называемые scale и translate, и оба они работают аналогично rotate.py. Теперь ты понимаешь? – Chase

+0

Существует также поворот внутри моего точечного класса, а также другая программа rotate.py, которую я использую, которая проходит через каждую строку в stdin и разбивает каждую строку на 4 раздела. – Chase

ответ

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 

Перед время цикла в верхнем списке, 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 
+0

Используйте это, в каком коде? – Chase

+0

Если он должен идти в классе точек, то я на 99% уверен, что это неправильно. Он должен иметь «a». Он называется \t p0 = Точка (0.0, 0.0) \t p0.rotate (1) где 1 - угол, на который он поворачивается. Я не думаю, что вы можете сделать метод поворота с помощью только самого себя.Это не работает. Также откуда взялись x и y? Я уже определил x и y выше, поэтому нет необходимости определять их снова. – Chase

+0

Кроме того, даже если я использую ваш метод и меняю его на (self, a), он все равно дает мне тот же результат, поэтому на самом деле просто добавление x = self.x не нужно ничего делать. Я думаю, проблема кроется в другом коде. – Chase

Смежные вопросы