繁体   English   中英

旋转2d物体的功能?

[英]Function for rotating 2d objects?

是否有可能在python中编写一个函数,可以旋转任何2d结构,参数只是结构中点的坐标(x,y)? 轴,速度和方向将包括其他参数。

根据我的理解,只有通过计算对称点和轴的点距离才有可能,因此它总是会变化,因此除了由标准形状(三角形,矩形,正方形等)组成的2d结构外,它是不可能的。

很好的例子将不胜感激。

首先,我们需要一个函数来旋转原点周围的点。

当我们将原点周围的点(x,y)旋转θ度时,我们得到坐标:

(x * cos(theta)-y * sin(theta),x * sin(theta)+ y * cos(theta))

如果我们想围绕原点以外的点旋转它,我们只需要移动它,使中心点成为原点。 现在,我们可以编写以下函数:

from math import sin, cos, radians

def rotate_point(point, angle, center_point=(0, 0)):
    """Rotates a point around center_point(origin by default)
    Angle is in degrees.
    Rotation is counter-clockwise
    """
    angle_rad = radians(angle % 360)
    # Shift the point so that center_point becomes the origin
    new_point = (point[0] - center_point[0], point[1] - center_point[1])
    new_point = (new_point[0] * cos(angle_rad) - new_point[1] * sin(angle_rad),
                 new_point[0] * sin(angle_rad) + new_point[1] * cos(angle_rad))
    # Reverse the shifting we have done
    new_point = (new_point[0] + center_point[0], new_point[1] + center_point[1])
    return new_point

一些产出:

print(rotate_point((1, 1), 90, (2, 1)))
# This prints (2.0, 0.0)
print(rotate_point((1, 1), -90, (2, 1)))
# This prints (2.0, 2.0)
print(rotate_point((2, 2), 45, (1, 1)))
# This prints (1.0, 2.4142) which is equal to (1,1+sqrt(2))

现在,我们只需要使用前面的函数旋转多边形的每个角落:

def rotate_polygon(polygon, angle, center_point=(0, 0)):
    """Rotates the given polygon which consists of corners represented as (x,y)
    around center_point (origin by default)
    Rotation is counter-clockwise
    Angle is in degrees
    """
    rotated_polygon = []
    for corner in polygon:
        rotated_corner = rotate_point(corner, angle, center_point)
        rotated_polygon.append(rotated_corner)
    return rotated_polygon

示例输出:

my_polygon = [(0, 0), (1, 0), (0, 1)]
print(rotate_polygon(my_polygon, 90))
# This gives [(0.0, 0.0), (0.0, 1.0), (-1.0, 0.0)]

您可以通过首先平移(移动)所有点来旋转平面上任意点的二维点阵列,使旋转点成为原点(0, 0) ,将标准旋转公式应用于每个点x和y坐标,然后通过与最初完成的完全相反的量来“翻译”它们。

在计算机图形学中,这通常通过使用称为变换矩阵的东西来完成。

同样的概念也可以很容易地扩展到使用三维点。

编辑:

请参阅我对问题的答案旋转中心点周围的线,给出两个顶点,以获得使用此技术的完全解决的示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM