如何旋转多边形? [英] How to rotate a polygon?

查看:95
本文介绍了如何旋转多边形?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么:目前正在尝试/做一些深度学习的东西,对 python 来说是全新的.我们已经为我们的东西运行了一些代码.我们现在想计算我们找到的东西".因为我们没有找到任何关于多只猫和狗的分类数据.我想用六边形创建一些随机生成的图像.

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()

推荐答案

以下是如何应用我的答案 到一个类似的问题,它可能会完成你想要"的事情(如果你想围绕它们的中心点旋转它们).

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).

我使用从以下位置下载的 graphics 模块的 5.0 版对其进行了测试:

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

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

    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.

这是一个实现:

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

这篇关于如何旋转多边形?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆