什么是缩放的正确方法然后旋转一组点?

时间:2018-01-03 02:32:46

标签: scale linear-algebra scaling coordinate-transformation scaletransform

我有4个点,点 A (x1,y1),点 B (x2,y1),点 C (x2 ,y2),点 D (x2,y3)创建两个比例:Scale1 yRange( B D ),Scale2 yRange( B,C )。

enter image description here

我只想缩放y轴,以便将 D 点缩小到 C 点,以便 CAB 之间的角度是一定程度的。然后我想在一定程度上围绕点 B 旋转缩放点 C ,获得点 E 。然后我想在原始点 D 所在的未缩放坐标网格上找到点 E 的实际值。我想我需要使用仿射变换,但所有示例都先旋转,然后进行缩放。但我需要先缩放,然后旋转。我如何找到这个新值?我知道如何单独进行旋转和单独进行缩放,但不能一起进行。

也许我感到困惑,在执行缩放和旋转之后,我不需要缩减,因为 E 的新值等于 F ?我知道有很多例子,但我无法解决这个问题......

这是我的目标。我有3分 A B D 。我想缩放,以便 DAB 等于让我们说60度,创建点 C ,然后在缩放网格内的 C 上执行几个点旋转。我最终希望找到 F 的值,以及其他旋转点,它位于原始未缩放网格内的几何位置,除非我将3个原始点首先缩放到所述度数,否则我无法计算。缩放网格包含我需要的正确比例以旋转我的点。我需要在缩放网格中进行所有旋转,不会丢失值,而是改变宽高比,然后在缩放网格中取出这些新点并在未缩放网格中绘制它们,这将失去正确的宽高比,这很好

在python中编码。

1 个答案:

答案 0 :(得分:0)

这是我认为你想要的Python3程序:

import math

# Use a negative angle since we're rotating clockwise
rotate_C_angle = math.radians(-60)

A = [0, 0]
B = [100, 0]
D = [100, 250]

# Create point D such that angle CAB = target_angle_CAB
target_angle_CAB = math.radians(60)
C = [B[0], B[0] * math.tan(target_angle_CAB)]

# What do we scale B by in order to get C
scale_factor = C[1] / D[1]

# Rotate C around B by rotate_C_angle
# (translate C by -Bx, then rotate, then translate back)
E = [
    C[0] - C[1] * math.sin(rotate_C_angle),
    C[1] * math.cos(rotate_C_angle)
]

# Scale E back
F = [E[0], E[1] / scale_factor]

这假设A在原点。如果不是那么从所有x坐标中减去Ax,从y坐标减去Ay,那么在再次翻译之前进行计算。

是否需要缩减E到F取决于您正在做什么。这里发生的事情假设沿y的缩放变换不会旋转。