Я строю эллипс и перевожу его с помощью функции translate
, где определяются вручную dx & dy
Теперь я хотел бы иметь больше графиков с разными значениями dx,dy
, которые содержатся в этом массиве.
translation_points =
[ (5, 6), (5, 7), (5, 8), (5, 9), (5, 10), (5, 11), (5, 12), (5, 13), (5, 14), (6, 5), (6, 6), (6, 7), (6, 8), (6, 9), (6, 10), (6, 11), (6, 12), (6, 13), (6, 14), (7, 5), (7, 6), (7, 7), (7, 8), (7, 9), (7, 10), (7, 11), (7, 12)]
Как я могу это сделать?
import numpy as np
import matplotlib.pyplot as plt
def ellipse(x, y):
value = (x*x) + (y*y)/3
if (value >= 300):
return 0
else:
return 1
def translate(x, y):
DX = 5
DY = 5
return (x- DX, y - DY)
def rotate(x, y):
theta = np.radians(40)
matrix = np.array([[np.cos(theta), -np.sin(theta)], [np.sin(theta), np.cos(theta)]])
return np.dot(matrix, (x,y))
data = np.zeros((100,100))
for i in range(0, 100):
for j in range(0, 100):
(x, y) = translate(i,j)
(x, y) = rotate(x, y)
data[i,j] = ellipse(x, y)
plt.imshow(data, cmap = "gray")
plt.show()
сначала измените свой translate()
, добавьте новый параметр offset
:
def translate(x, y, offset):
(dx, dy) = offset
return x - dx, y - dy
затем поместите 2 цикла for
в функцию, чтобы мы могли вызвать ее позже, эта функция также должна принимать параметр offset
. тогда мы можем вызвать его для построения графика для каждого смещения.
def draw(offset):
data = np.zeros((100, 100))
for i in range(-100, 100):
for j in range(-100, 100):
(x, y) = translate(i, j, offset)
(x, y) = rotate(x, y)
data[i, j] = ellipse(x, y)
plt.imshow(data, cmap = "gray")
наконец, создайте цикл, который отображает наш эллипс для каждого смещения в translation_points
. здесь я использую plt.subplot(4, 7, i+1)
для создания 28 подзаговоров, каждый подзаговор для переведенного эллипса. вы можете прокомментировать эту строку, если вы просто хотите увидеть каждый отдельный график.
for i in range(len(translation_points)):
plt.subplot(4, 7, i+1)
draw(translation_points[i])
да, мы сделали это.
поскольку мы используем imshow
, графики обрезаются. более того, координаты совершенно неверны. поэтому сначала установите наш диапазон:
for i in range(-100, 100):
for j in range(-100, 100):
затем дайте ему смещение по умолчанию:
def translate(x, y, offset):
(dx, dy) = offset
return x - dx - 50, y - dy - 50
расширьте фигуру, установите ограничения по оси: добавьте эти строки в draw()
plt.xlim(-50, 50)
plt.ylim(-50, 50)
plt.imshow(data, cmap = "cool", extent=[-data.shape[1]/2., data.shape[1]/2., -data.shape[0]/2., data.shape[0]/2.])
и наконец:
import numpy as np
import matplotlib.pyplot as plt
translation_points = [(5, 6), (5, 7), (5, 8), (5, 9), (5, 10), (5, 11),
(5, 12), (5, 13), (5, 14), (6, 5), (6, 6), (6, 7),
(6, 8), (6, 9), (6, 10), (6, 11), (6, 12), (6, 13),
(6, 14), (7, 5), (7, 6), (7, 7), (7, 8), (7, 9),
(7, 10), (7, 11), (7, 12)]
def ellipse(x, y):
value = (x*x) + (y*y)/3
if value >= 300:
return 0
else:
return 1
def translate(x, y, offset):
# dx = 5
# dy = 5
(dx, dy) = offset
return x - dx - 50, y - dy - 50
def rotate(x, y):
theta = np.radians(40)
matrix = np.array([[np.cos(theta), -np.sin(theta)], [np.sin(theta), np.cos(theta)]])
return np.dot(matrix, (x, y))
def draw(offset):
data = np.zeros((100, 100))
for i in range(-100, 100):
for j in range(-100, 100):
(x, y) = translate(i, j, offset)
(x, y) = rotate(x, y)
data[i, j] = ellipse(x, y)
plt.xlim(-50, 50)
plt.ylim(-50, 50)
plt.imshow(data, cmap = "gray",
extent=[-data.shape[1]/2., data.shape[1]/2.,
-data.shape[0]/2., data.shape[0]/2.])
for i in range(len(translation_points)):
plt.subplot(4, 7, i+1)
draw(translation_points[i])
plt.show()
«пространственное расстояние между каждым пикселем на графике и каждым пикселем в другом изображении» я не понимаю. можете ли вы добавить больше объяснений или, что еще лучше, задать новый вопрос с подробностями?
import numpy as np
import matplotlib.pyplot as plt
translation_points = [ (5, 6), (5, 7), (10,10), (20, 8), (5, 9), (12, 10), (40, 40), (50, 50),(20, 8)]
def ellipse(x, y):
value = (x*x) + (y*y)/3
if (value >= 300):
return 0
else:
return 1
def translate(x, y,a,b):
#print a,b
DX = a
DY = b
return (x- DX, y - DY)
def rotate(x, y):
theta = np.radians(40)
matrix = np.array([[np.cos(theta), -np.sin(theta)], [np.sin(theta), np.cos(theta)]])
return np.dot(matrix, (x,y))
def create(tlpoints):
a,b=tlpoints
#print a,b
data = np.zeros((100,100))
for i in range(0, 100):
for j in range(0, 100):
(x, y) = translate(i,j,a,b)
(x, y) = rotate(x, y)
data[i,j] = ellipse(x, y)
return data
ells=[create(translation_points[i]) for i in range(len(translation_points))]
fig=plt.figure(figsize=(10,10))
columns = 3
rows = len(translation_points)/columns
for i in range(1, columns*rows +1):
fig.add_subplot(rows, columns, i)
plt.imshow(ells[i-1],cmap='gray')
plt.show()
Привет @rahul большое спасибо за ваш ответ, не могли бы вы прокомментировать свои новые функции, чтобы я понял, что происходит
как я могу рассчитать пространственное расстояние между каждым пикселем на графике и каждым пикселем в другом изображении и сохранить это значение в массиве? это то, что я пробовал