Tollpatsch
Tollpatsch

Reputation: 336

How to rotate a polygon?

Why: Currently trying/doing some Deeplearning stuff, completely new to python. We already got some code running for our stuff. We just now wanna count the "things" we find. Because we dont find any classified data about multiple cat and dogs. I wanna create some random generated images with hexagons.

How ever i wanna have some of them rotated. But i dont know how.

from graphics import *
from random import randint
import math

image_height = 1000
image_height = 1000;
def main():
    win = GraphWin("Window",image_height,image_height)
    win.setBackground(color_rgb(255, 255, 255))

    for _ in range(0,8):
          figure = drawahexagon(80)
         #figure = rotatePolygon(figure,randint(0,90))
          figure.draw(win)
    win.getMouse()
    win.close


def drawahexagon(length):
    x = randint(0, image_height-length)
    y = randint(0, image_height-length)
    poly = Polygon(Point(x+getRandom(0),y+getRandom(0)),
                   Point(x+length+getRandom(1),y+getRandom(1)),
                   Point(x+(length*1.5)+getRandom(0),y+(length/2)+getRandom(1)),
                   Point(x+length+getRandom(1),y+length+getRandom(1)),
                   Point(x+getRandom(0),y+length+getRandom(1)),
                   Point(x-(length/2)+getRandom(1),y+(length/2)+getRandom(0)))
    poly.setFill(color_rgb(255,0,0))
    return poly


def getRandom(base):
  if base == 0:
    foo = randint(0,5)
  else:
    foo = randint(3,10)
  return foo



main()

Upvotes: 1

Views: 9456

Answers (1)

martineau
martineau

Reputation: 123531

Here's how to apply the technique and math in my answer to a similar question that may accomplish what you "wanna" (if you want to rotate them about their center points).

I tested it with version 5.0 of the graphics module which I downloaded from:

    http://mcsp.wartburg.edu/zelle/python/graphics.py


from graphics import *
from random import randint
from math import sin, cos, radians

image_height = 1000
image_height = 1000

def main():
    win = GraphWin("Window", image_height, image_height)
    win.setBackground(color_rgb(255, 255, 255))

    for _ in range(8):
          figure = drawahexagon(80)
          figure = rotatePolygon(figure, randint(0, 90))
          figure.draw(win)
    try:
        win.getMouse()  # causes graphics.GraphicsError: getMouse in closed window
    except GraphicsError:  # ignore error
        pass
    win.close()

def rotatePolygon(polygon, degrees):
    """ Rotate polygon the given angle about its center. """
    theta = radians(degrees)  # Convert angle to radians
    cosang, sinang = cos(theta), sin(theta)

    points = polygon.getPoints()
    # find center point of Polygon to use as pivot
    n = len(points)
    cx = sum(p.getX() for p in points) / n
    cy = sum(p.getY() for p in points) / n

    new_points = []
    for p in points:
        x, y = p.getX(), p.getY()
        tx, ty = x-cx, y-cy
        new_x = ( tx*cosang + ty*sinang) + cx
        new_y = (-tx*sinang + ty*cosang) + cy
        new_points.append(Point(new_x, new_y))

    rotated_ploygon = polygon.clone()  # clone to get current attributes
    rotated_ploygon.points = new_points
    return rotated_ploygon

def drawahexagon(length):
    x = randint(0, image_height-length)
    y = randint(0, image_height-length)
    poly = Polygon(Point(x+getRandom(0), y+getRandom(0)),
                   Point(x+length+getRandom(1), y+getRandom(1)),
                   Point(x+(length*1.5)+getRandom(0), y+(length/2)+getRandom(1)),
                   Point(x+length+getRandom(1), y+length+getRandom(1)),
                   Point(x+getRandom(0), y+length+getRandom(1)),
                   Point(x-(length/2)+getRandom(1), y+(length/2)+getRandom(0)))
    poly.setFill(color_rgb(255, 0, 0))
    return poly

def getRandom(base):
    if base == 0:
        foo = randint(0, 5)
    else:
        foo = randint(3, 10)
    return foo

main()

As I mentioned in a comment, creating rotated polygons this way—by first creating an unrotated polygon, cloning that, and then rotating the copy—is somewhat inefficient, since it could be accomplished by creating rotated points first and then creating the Polygon.

Here's an implementation that does that:

def drawarotatedhexagon(length, degrees):
    x = randint(0, image_height-length)
    y = randint(0, image_height-length)
    points = [Point(x+getRandom(0), y+getRandom(0)),
              Point(x+length+getRandom(1), y+getRandom(1)),
              Point(x+(length*1.5)+getRandom(0), y+(length/2)+getRandom(1)),
              Point(x+length+getRandom(1), y+length+getRandom(1)),
              Point(x+getRandom(0), y+length+getRandom(1)),
              Point(x-(length/2)+getRandom(1), y+(length/2)+getRandom(0))]

    theta = radians(degrees)  # Convert angle to radians
    cosang, sinang = cos(theta), sin(theta)

    n = len(points)
    cx = sum(pt.getX() for pt in points) / n
    cy = sum(pt.getY() for pt in points) / n
    for pt in points:
        tx, ty = pt.getX()-cx, pt.getY()-cy
        nx = ( tx*cosang + ty*sinang) + cx
        ny = (-tx*sinang + ty*cosang) + cy
        pt.x, pt.y = nx, ny

    poly = Polygon(*points)
    poly.setFill(color_rgb(255, 0, 0))
    return poly

Upvotes: 3

Related Questions