У меня есть многоугольник,
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 нет метода масштабирования полигонов.не просто меняя свои точки, так как бы я поступил делая это? Многоугольник может перевернуться в любой момент времени. и поэтому изменение точек не является хорошим решением, так как приводит к к полигону, который снова растет после того, как он был перевернут.
Я действительно думал об этом раньше, но отказался от этой идеи именно по этой причине. Я полагаю, что на самом деле было бы более разумно сделать один БОЛЬШОЙ полигон и уменьшить его масштаб, если бы я собирался это сделать, однако даже тогда это, вероятно, было бы ресурсоемким, не так ли?
Возможно, с помощью матрицы это можно было бы сделать лучше, но я использую обычные методы.
у меня есть
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)
В вашем примере вы также можете масштабировать только A
B
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)?
[]
используется также с такими кортежами, как 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
вы можете рисовать
Surface()
, масштабироватьSurface
и блистатьSurface
наscreen
, но это даст худшее изображение. Точки A,B,X,Y лучше пересчитать.