Что такое правильный путь для масштабирования, а затем поверните набор точек?

У меня есть 4 точки, точка A(x1, y1), точка B(x2, y1) и точка C(x2, y2), точка D(x2, y3), создающая две шкалы: Scale1 yRange (B, D), Scale2 yRange (B, C).

Я хочу масштабировать только ось y, чтобы точка D была уменьшена до точки C, чтобы угол между CAB составлял определенную степень. Затем я хочу повернуть масштабированную точку C вокруг точки B на определенную степень, получив точку E. Затем я хочу найти реальное значение точки E на немасштабированной координатной сетке, где расположена исходная точка D. Я думаю, что мне нужно использовать аффинные преобразования, но все примеры сначала вращаются, а затем масштабируются. Но мне нужно сначала масштабировать, а затем вращать. Как мне найти это новое значение? Я знаю, как выполнять повороты в одиночку и немного масштабировать в одиночку, но не вместе.

Может быть, я запутался, после того, как я выполню масштабирование и вращение, мне не нужно будет уменьшать масштаб, потому что новое значение E равно F? Я знаю, что есть много примеров, но я не могу обернуть голову вокруг этого...

Вот моя цель. У меня есть 3 точки A, B и D. Я хочу масштабировать так, чтобы DAB равнялся, скажем, 60 градусам, создавая точку C, а затем выполнил несколько поворотов точки C внутри масштабированной сетки. В конечном итоге я хочу найти значение F и других повернутых точек, которые лежат в геометрических положениях внутри исходной немасштабированной сетки, которую я не могу рассчитать, если сначала не масштабирую 3 исходные точки до указанной степени. Масштабированная сетка содержит правильное соотношение, которое мне нужно для поворота моих точек. Мне нужно сделать все мои повороты внутри масштабированной сетки, не теряя значений, но меняя соотношение сторон, а затем взять эти новые точки в масштабированной сетке и нанести их на немасштабированную сетку, которая затем потеряет правильные пропорции, что хорошо,

Кодирование на питоне.

1 ответ

Вот программа на 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 находится в начале координат. Если это не так, вычтите Ax из всех координат x и Ay из координат y, затем выполните вычисления, прежде чем переводить обратно.

Нужно ли сокращать E до F, зависит от того, что вы делаете. То, что здесь происходит, предполагает, что преобразование масштабирования вдоль y не поворачивается.

Другие вопросы по тегам