Как масштабировать полигон в Pygame?

У меня есть многоугольник,

 X = 100
 Y = 100
 A = 20
 B = 20
 pygame.draw.polygon(screen,red,[(B+X,A+Y),(-B+X,A+Y),(X,Y)])#(X,Y,Z)

как масштабировать его от исходной точки (X, Y)?

this ->
  X(0,0)
 /\
/  \
----Z(2,-2)
Y(-2,-2)
should become this -->
 X(0,0)
/\
--Z(1,-1)
Y(-1,-1)

Но похоже, что в Pygame нет метода масштабирования полигонов.не просто меняя свои точки, так как бы я поступил делая это? Многоугольник может перевернуться в любой момент времени. и поэтому изменение точек не является хорошим решением, так как приводит к к полигону, который снова растет после того, как он был перевернут.

вы можете рисовать Surface(), масштабировать Surface и блистать Surface на screen, но это даст худшее изображение. Точки A,B,X,Y лучше пересчитать.

furas 07.04.2019 04:07

Я действительно думал об этом раньше, но отказался от этой идеи именно по этой причине. Я полагаю, что на самом деле было бы более разумно сделать один БОЛЬШОЙ полигон и уменьшить его масштаб, если бы я собирался это сделать, однако даже тогда это, вероятно, было бы ресурсоемким, не так ли?

Frederick 07.04.2019 05:55
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
298
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Возможно, с помощью матрицы это можно было бы сделать лучше, но я использую обычные методы.

у меня есть

X = 100
Y = 100
A = 20
B = 20

и точки

x = (X,Y)
y = (X+B,Y+A)
z = (X-B,Y+A)

print(x,y,z)

(100, 100) (120, 120) (80, 120)

происхождение это точка x

origin = x[0], x[1]

Я перемещаю все точки так, используя origin так oringi (x) will be(0,0)`

x1 = x[0]-origin[0], x[1]-origin[1] 
y1 = y[0]-origin[0], y[1]-origin[1] 
z1 = z[0]-origin[0], z[1]-origin[1] 

print(x1,y1,z1)

(0, 0) (20, 20) (-20, 20)

Как я понимаю, вам нужен масштаб 1/2.

scale = 1/2

x1 = x1[0]*scale, x1[1]*scale
y1 = y1[0]*scale, y1[1]*scale
z1 = z1[0]*scale, z1[1]*scale

print(x1,y1,z1)

(0.0, 0.0) (10.0, 10.0) (-10.0, 10.0)

Наконец я двигаюсь назад

x = x1[0]+origin[0], x1[1]+origin[1] 
y = y1[0]+origin[0], y1[1]+origin[1] 
z = z1[0]+origin[0], z1[1]+origin[1] 

print(x,y,z)

(100.0, 100.0) (110.0, 110.0) (90.0, 110.0)

А это новый полигон

(100.0, 100.0) (110.0, 110.0) (90.0, 110.0)

В вашем примере вы также можете масштабировать только AB

scale = 1/2

X = 100
Y = 100
A = 20 * scale
B = 20 * scale

А также

(B+X,A+Y),(-B+X,A+Y),(X,Y)

дает те же значения

(110.0, 110.0), (90.0, 110.0), (100, 100)

Я не понимаю, на что ссылаются x[0] и x[1], поскольку у меня нет никакого массива для этих терминов, как и у вас. на самом деле у меня нет массивов списков в моем вопросе. Вы имеете в виду x[0] как (B+X) и x[1] как (A+Y)?

Frederick 11.04.2019 23:21
[] используется также с такими кортежами, как x = (X,Y), y = (X+B,Y+A), z = (X-B,Y+A) Каждая точка имеет два значения (x, y), и с помощью x[0] я получаю первое значение из этого кортежа и т. д. Если у меня есть x = (X,Y), то x[0] дает мне значение X, x[1] дает значение Y
furas 12.04.2019 00:13

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