当前位置: 首页 > 面试题库 >

在给定两个顶点的情况下围绕中心点旋转线

冷涵忍
2023-03-14
问题内容

我一直试图将一堆线旋转90度(它们一起形成一条折线)。每行包含两个顶点,例如(x1,y1)和(x2,y2)。我当前要执行的操作是绕线的中心点旋转,给定中心点|
x1-x2 | 和| y1-y2 |。由于某些原因(我在数学上不是很精明),我无法使线条正确旋转。

有人可以验证这里的数学是正确的吗?我认为这可能是正确的,但是,当我将线的顶点设置为新的旋转顶点时,下一行可能未从前一行抓取新的(x2,y2)顶点,从而导致线无法正确旋转。

这是我写的:

def rotate_lines(self, deg=-90):
    # Convert from degrees to radians
    theta = math.radians(deg)

    for pl in self.polylines:
        self.curr_pl = pl
        for line in pl.lines:
            # Get the vertices of the line
            # (px, py) = first vertex
            # (ox, oy) = second vertex
            px, ox = line.get_xdata()
            py, oy = line.get_ydata()

            # Get the center of the line
            cx = math.fabs(px-ox)
            cy = math.fabs(py-oy)

            # Rotate line around center point
            p1x = cx - ((px-cx) * math.cos(theta)) - ((py-cy) * math.sin(theta))
            p1y = cy - ((px-cx) * math.sin(theta)) + ((py-cy) * math.cos(theta))

            p2x = cx - ((ox-cx) * math.cos(theta)) - ((oy-cy) * math.sin(theta))
            p2y = cy - ((ox-cx) * math.sin(theta)) + ((oy-cy) * math.cos(theta))

            self.curr_pl.set_line(line, [p1x, p2x], [p1y, p2y])

问题答案:

点(x1,y1)和(x2,y2)之间的线段的中心点(cx,cy)的坐标为:

    cx = (x1 + x2) / 2
    cy = (y1 + y2) / 2

换句话说,它只是两对x和y坐标值的平均值或算术平均值。

对于多段线或折线,其逻辑中心点的x和y坐标只是所有点的x和y值的相应平均值。平均值就是值的总和除以它们的数量。

绕原点
(0,0)旋转2D点(x,y)θ弧度的一般公式为:
__

    x′ = x * cos(θ) - y * sin(θ)
    y′ = x * sin(θ) + y * cos(θ)

为了绕不同的中心(cx,cy)进行旋转,需要通过先从该点的坐标中减去所需旋转中心的坐标来调整该点的x和y值,这具有移动效果(已知在几何学上是平移),其数学表达如下:

    tx = x - cx
    ty = y - cy

然后将此中间点旋转所需的角度,最后将旋转点的x和y值加 回到
每个坐标的x和y上。用几何术语来说,它是以下操作序列:Tʀᴀɴsʟᴀᴛᴇ─►Rᴏᴛᴀᴛᴇ─►Uɴᴛʀᴀɴsʟᴀᴛᴇ。

通过仅将描述的数学应用于其中的每个线段的每个点,可以扩展该概念以允许围绕任意点(例如其自己的逻辑中心)旋转整条折线。

为了简化此计算的实现,可以将所有三组计算的数值结果组合在一起,并用一对同时执行它们的数学公式来表示。因此,通过使用以下点旋转一个现有点(x,y),围绕该点(cx,cy)的θ弧度可以获得新点(x’,y’):

    x′ = (  (x - cx) * cos(θ) + (y - cy) * sin(θ) ) + cx
    y′ = ( -(x - cx) * sin(θ) + (y - cy) * cos(θ) ) + cy

将此数学/几何概念整合到您的函数中会产生以下结果:

from math import sin, cos, radians

def rotate_lines(self, deg=-90):
    """ Rotate self.polylines the given angle about their centers. """
    theta = radians(deg)  # Convert angle from degrees to radians
    cosang, sinang = cos(theta), sin(theta)

    for pl in self.polylines:
        # Find logical center (avg x and avg y) of entire polyline
        n = len(pl.lines)*2  # Total number of points in polyline
        cx = sum(sum(line.get_xdata()) for line in pl.lines) / n
        cy = sum(sum(line.get_ydata()) for line in pl.lines) / n

        for line in pl.lines:
            # Retrieve vertices of the line
            x1, x2 = line.get_xdata()
            y1, y2 = line.get_ydata()

            # Rotate each around whole polyline's center point
            tx1, ty1 = x1-cx, y1-cy
            p1x = ( tx1*cosang + ty1*sinang) + cx
            p1y = (-tx1*sinang + ty1*cosang) + cy
            tx2, ty2 = x2-cx, y2-cy
            p2x = ( tx2*cosang + ty2*sinang) + cx
            p2y = (-tx2*sinang + ty2*cosang) + cy

            # Replace vertices with updated values
            pl.set_line(line, [p1x, p2x], [p1y, p2y])


 类似资料:
  • 问题内容: 我正在努力围绕其中心绘制旋转的位图,并在不调整位图大小的情况下进行旋转。我正在通过游戏线程将所有子画面绘制到屏幕上,因此我正在寻找一种包含原始位图而不是画布的解决方案。 提前致谢。 到目前为止,这是我的代码,它围绕其中心旋转一个位图,但对其进行了调整。 更新: 我注意到这并不像听起来那么容易。我的旋转代码不是问题。位图旋转,但是dst rect也必须根据旋转角度增加/减少,否则bima

  • 问题内容: 我已经在这个问题上进行了很多搜索,但是我找不到真正合适的答案。 我需要围绕给定点(例如0,0,0)旋转圆柱体,但是默认情况下会给出圆柱体的枢轴。我该如何改变? 为了更好地说明我想做什么,我将显示3张图像。 imageshack.us/photo/my-images/259/aintgood.jpg imageshack.us/photo/my-images/840/whatineed.

  • 问题内容: 有没有一种简单的方法可以围绕图片中心旋转图片?我首先使用了AffineTransformOp。看起来很简单,而且需要,并且在一个整洁的Google会话中为矩阵找到正确的参数。所以我认为… 我的结果是这样的: 如果您忽略旋转90度的倍数的情况,这非常简单(sin()和cos()无法正确处理)。该解决方案的问题在于,它围绕图片左上角的(0,0)坐标点进行变换,而不是围绕图片中心进行正常的变

  • 问题内容: 我有一个512x512像素的2D图像,我想在某个原点(旋转中心)以某个角度旋转。一直以来,我都使用Scipy的旋转方法来旋转图像。但是,我迷迷糊糊,因为旋转始终围绕图像的中心进行。对于512x512像素,旋转中心应围绕点(x,y)128,128。如何使用自定义旋转中心旋转图像,比方说(x,y)20,128? 问题答案: 如果不能使用OpenCV,则可以使用NumPy()和SciPy()

  • 问题内容: 我试图在这个问题中创建一个类似于“奖杯轮”的可旋转节点。到目前为止,我具有甩尾功能,可以使用效果很好的UIPanGestureRecognizer在物理物体上添加角度脉冲。我也可以通过触摸停止旋转。 现在,我试图通过拖动或滑动手势来微调方向盘,这样,如果玩家对最终的效果不满意,就可以手动旋转/拖动/旋转它所喜欢的旋转方式。 目前,我将触摸的位置保存在touchesBegan中,并尝试在

  • 下面是java中的一个代码段,用于将坐标为a(10,10),B(20,10),C(20,20),D(10,20)的顶点围绕正方形的中心点旋转一个角度。正方形的边是10分。旋转角度为90度。理想情况下,旋转后A必须变成B,B必须变成C,C必须变成D,D必须变成A。 所取得的结果是不正确的 > 点A(10,10)旋转到(20,10)---正确 点B(20,10)旋转到(30,10)----不正确 nu