2017-01-06 4 views
2

Я пытаюсь рисовать и поворачивать прямоугольник вокруг определенной точки в Julia, используя matplotlib для построения графика. Однако мне кажется, что мне нужно объединить два преобразования, чтобы сделать эту работу, и я не знаю, как это сделать.Поворот прямоугольника вокруг определенной точки с использованием PyPlot в Julia

using PyPlot 
using PyCall 
@pyimport matplotlib.patches as patches 
@pyimport matplotlib as mpl 

fig = figure(1) 
ax = gca() 
axis([-4,4,-4,4]) 

# specify non-rotated rectangle 
length = 4 
width = 2 
rect = patches.Rectangle([1,1],length,width,color="blue",alpha=0.3) 
rect_rotated = patches.Rectangle([1,1],length,width,color="red",alpha=0.3) 
# rotate about the following point 
point = [3,2] 

# try to rotate rectangle using matplotlib's transformations 
t1 = mpl.transforms[:Affine2D]() 
t1[:rotate_deg_around](point[1],point[2], -30) 

# apparently one also has to transform between data coordinate system and display coordinate system 
t2 = ax[:transData] 

То, что я хотел бы сделать сейчас, чтобы объединить преобразования:

t3 = t1 + t2 
rect_rotated[:set_transform](t3) 
ax[:add_patch](rect) 
ax[:add_patch](rect_rotated) 

Однако я получаю следующую ошибку

ERROR: LoadError: MethodError: no method matching +(::PyCall.PyObject, ::PyCall.PyObject)

, который я считаю из-за PyPlot -Wrapper, который не поддерживает знак «+», чтобы комбинировать базовые преобразования.

Кто-нибудь знает, как сделать эту работу? Спасибо

+0

ли + определяется в matplotlib? На объектах преобразования? Если да, можете ли вы вызвать метод __add__? –

+0

@ DavidP.Sanders Да, в matplotlib вы можете комбинировать преобразования с +. Однако я не могу найти соответствующую надстройку в документации. – miga89

ответ

1

Python реализует перегрузку оператора с использованием методов первого объекта, например. t3 = t1 + t2 эквивалентен t3 = t1.__add__(t2).

В Юли, это становится t3 = t1[:__add__](t2)

+0

Я не знал об этом. Но это работает как шарм. Спасибо! – miga89

1

С замечанию @ DavidP.Sanders, рабочий код выглядит следующим образом:

using PyPlot 
using PyCall 
@pyimport matplotlib.patches as patches 
@pyimport matplotlib as mpl 

fig = figure(1) 
ax =gca() 


# specify non-rotated rectangle 
length = 4 
width = 2 
rect = patches.Rectangle([1,1],length,width,color="blue",alpha=0.3) 
rect_rotated = patches.Rectangle([1,1],length,width,color="red",alpha=0.3) 
# rotate about the following point 
point = [3,2] 

# try to rotate rectangle using matplotlib's transformations 
t1 = mpl.transforms[:Affine2D]() 
t1[:rotate_deg_around](point[1],point[2], -30) 

# apparently one also has to transform between data coordinate system and display coordinate system 
t2 = ax[:transData] 
t3 = t1[:__add__](t2) 
rect_rotated[:set_transform](t3) 
ax[:add_patch](rect) 
ax[:add_patch](rect_rotated) 
axis([-1,6,-1,6],"equal") 

Результат: Rotated rectangle

+0

Рад, что у вас это работает. Было бы полезно установить соотношение сторон к 1, чтобы вращающийся прямоугольник выглядел прямоугольным;) Я думаю, вам нужно 'axis (« equal »)' в конце *, а не в начале. Одна из вещей, которая всегда меня раздражала в отношении matplotlib. –

+0

Вы правы! Я изменил это. – miga89

+0

Возможно, вы могли бы открыть проблему в репозитории PyPlot.jl о +. –