首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将点绕另一个点旋转,单位为python度

将点绕另一个点旋转,单位为python度
EN

Stack Overflow用户
提问于 2015-12-19 23:42:28
回答 5查看 68K关注 0票数 52

如果你有一个点(在2D中),你如何在python中围绕另一个点(原点)逐步旋转那个点?

例如,您可以将第一个点绕原点倾斜10度。

基本上,你有一个点,PointA和原点,它绕着它旋转。代码可能如下所示:

代码语言:javascript
复制
PointA=(200,300)
origin=(100,100)

NewPointA=rotate(origin,PointA,10) #The rotate function rotates it by 10 degrees
EN

回答 5

Stack Overflow用户

发布于 2015-12-20 03:18:11

以下rotate函数将点point在笛卡尔平面中绕origin旋转角度angle (逆时针,以弧度为单位),并遵循通常的轴约定:x从左向右递增,y垂直向上递增。所有点都表示为(x_coord, y_coord)形式的长度为2的元组。

代码语言:javascript
复制
import math

def rotate(origin, point, angle):
    """
    Rotate a point counterclockwise by a given angle around a given origin.

    The angle should be given in radians.
    """
    ox, oy = origin
    px, py = point

    qx = ox + math.cos(angle) * (px - ox) - math.sin(angle) * (py - oy)
    qy = oy + math.sin(angle) * (px - ox) + math.cos(angle) * (py - oy)
    return qx, qy

如果以度为单位指定角度,则可以先使用math.radians将其转换为弧度。对于顺时针旋转,取反角度。

示例:将点(3, 4)(2, 2)的原点逆时针旋转10度角:

代码语言:javascript
复制
>>> point = (3, 4)
>>> origin = (2, 2)
>>> rotate(origin, point, math.radians(10))
(2.6375113976783475, 4.143263683691346)

注意,在rotate函数中有一些明显的重复计算:math.cos(angle)math.sin(angle)分别计算两次,px - oxpy - oy也是如此。如果有必要的话,我把它留给你来考虑。

票数 105
EN

Stack Overflow用户

发布于 2019-11-10 00:44:01

将一个点绕另一个点旋转一定程度的选项是使用numpy而不是math。这允许很容易地推广该函数以接受任意数量的点作为输入,例如,这在旋转多边形时可能是有用的。

代码语言:javascript
复制
import numpy as np

def rotate(p, origin=(0, 0), degrees=0):
    angle = np.deg2rad(degrees)
    R = np.array([[np.cos(angle), -np.sin(angle)],
                  [np.sin(angle),  np.cos(angle)]])
    o = np.atleast_2d(origin)
    p = np.atleast_2d(p)
    return np.squeeze((R @ (p.T-o.T) + o.T).T)


points=[(200, 300), (100, 300)]
origin=(100,100)

new_points = rotate(points, origin=origin, degrees=10)
print(new_points)
票数 29
EN

Stack Overflow用户

发布于 2018-07-02 07:33:45

代码语言:javascript
复制
import math

def rotate(x,y,xo,yo,theta): #rotate x,y around xo,yo by theta (rad)
    xr=math.cos(theta)*(x-xo)-math.sin(theta)*(y-yo)   + xo
    yr=math.sin(theta)*(x-xo)+math.cos(theta)*(y-yo)  + yo
    return [xr,yr]
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34372480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档