旋转二维物体的功能?

Posted

技术标签:

【中文标题】旋转二维物体的功能?【英文标题】:Function for rotating 2d objects? 【发布时间】:2013-11-16 20:07:03 【问题描述】:

是否可以在 python 中编写一个可以旋转任何二维结构的函数,其参数仅为结构中点的坐标 (x,y)?轴、速度和方向的附加参数将包括在内。

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

p>

好的例子将不胜感激。

【问题讨论】:

真的不明白你的第二段。但是可以肯定的是,如果您有一个要旋转的点/轴和一个角度,那么您可以独立旋转每个点。请参阅***.com/a/2259502/553404 以获取 C++ 中的示例 你能扩展第二段吗?真的不知道你在暗示什么。 【参考方案1】:

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

当我们将点 (x,y) 绕原点旋转 theta 度时,我们得到坐标:

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

【讨论】:

喜欢这个答案,有很多帮助!出于某种原因,对于大于 360 的角度,它不能很好地工作,所以我在那之后添加了 while counterangle > 0: counterangle -= 360while counterangle < 0: counterangle += 360。这样,所有角度都变为正数且小于 360。我还添加了 counterangle = 360 - angle 以便我可以使用顺时针角度。 @Luke:您可能只使用counterangle % 360 作为函数中使用的旋转量。 @martineau 是的,现在我已经深入研究了一年半,我意识到这一点。谢谢;) 很棒的答案 - 这非常适合我的需要!【参考方案2】:

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

在计算机图形学中,这通常是通过使用称为 transformation matrices 的东西来完成的。

同样的概念也可以很容易地扩展到使用 3-D 点。

编辑:

请参阅我对问题 Rotate line around center point given two vertices 的回答,了解使用此技术的完整示例。

【讨论】:

以上是关于旋转二维物体的功能?的主要内容,如果未能解决你的问题,请参考以下文章

shader编程-二维空间中使用矩阵实现物体的旋转缩放平移变换(WebGL-Shader开发基础03)

实现二维数组顺时针旋转的功能

halcon判定物体旋转多少角度

cad三维圆柱怎么旋转角度 步骤如下

unity 手指旋转角色的功能

unity HTC Vive 通过手柄控制3D物体移动、旋转