Voici comment appliquer la technique et les mathématiques dans my answer à une question similaire qui peut accomplir ce que vous « voulez » (si vous voulez les tourner autour de leurs points centraux).
Je l'ai testé avec la version 5.0 du module graphics
que j'ai téléchargé à partir de:
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()
Comme je l'ai mentionné dans un commentaire, ce qui crée des polygones ayant subi une rotation de cette façon -en créant d'abord un polygone non-réorienté, en le clonant, puis en faisant tourner la copie-est quelque peu inefficace, car il pourrait être accompli par cr manger des points tournés d'abord, puis créer le Polygon
.
est ici une implémentation qui fait que:
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
'graphics' n'est pas un module standard de Python. Qu'est-ce que c'est et où l'avez-vous eu? Juste dire que vous "voulez" faire pivoter quelque chose, n'est pas assez d'informations, en plus de la quantité de rotation, vous devez également définir le point sur lequel la rotation doit se produire. – martineau
Vous pourriez trouver [** _ Rotation de la ligne autour du point central donné deux sommets _ **] (https://stackoverflow.com/questions/14842090/rotate-line-around-center-point-given-two-vertices) utile. – martineau