Reputation: 336
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
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