python - 获取旋转面片(矩形)的坐标 matplotlib

标签 python matplotlib patch

我想实现以下目标:

  • 1) 获取旋转后的补丁坐标
  • 2) 获取面片的所有点(这里:矩形)
  • ** 我的印象是旋转矩形的面之间没有 90 度。这只是可视化吗?

下面是我的代码片段。旋转后的补丁坐标与原始坐标相同.. 如何实现 1) 和 2)?

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import matplotlib as mpl

from matplotlib.transforms import Affine2D

fig = plt.figure()
ax = fig.add_subplot(111)
angle = np.deg2rad(45)

r1 = patches.Rectangle((8,4), 5,3, fill=False, color="red", alpha=0.50)
r2 = patches.Rectangle((8,4), 5,3, fill=False, color="blue",  alpha=0.50)

trafo = mpl.transforms.Affine2D().rotate_around(8,4,angle) + ax.transData
r2.set_transform(trafo)

ax.add_patch(r1)
ax.add_patch(r2)

plt.xlim(0,15)
plt.ylim(0,15)

plt.grid(False)

plt.show()
print(r1.get_bbox())
print(r1.get_xy())
print(r2.get_bbox()) # why are they the same as for r1?
print(r2.get_xy())
#print(r1.get_all_points()) # how to achieve it?

最佳答案

矩形坐标

矩形 是通过左下角 (x,y) 的坐标对以及宽度和高度来定义的。要获取其角的坐标,您可以

  • 从角、宽、高计算它们,

    r1 = patches.Rectangle((8,4), 5,3)
    ax.add_patch(r1)
    coords = np.array([r1.get_xy(), [r1.get_x()+r1.get_width(), r1.get_y()],
                       [r1.get_x()+r1.get_width(), r1.get_y()+r1.get_height()],
                       [r1.get_x(), r1.get_y()+r1.get_height()]])
    print(coords)
    
  • 从转换后的路径中获取它们,

    r1 = patches.Rectangle((8,4), 5,3)
    ax.add_patch(r1)
    coords = r1.get_patch_transform().transform(r1.get_path().vertices[:-1])
    print(coords)
    

在这两种情况下打印的结果都是

[[  8.   4.]
 [ 13.   4.]
 [ 13.   7.]
 [  8.   7.]]

也可以从矩形的边界框得到左下角和右上角的两个点(因为边界框本身就是一个矩形),

r1 = patches.Rectangle((8,4), 5,3)
ax.add_patch(r1)
coords = r1.get_bbox().get_points()
print(coords)

将导致

[[  8.   4.]
 [ 13.   7.]]

变换后的矩形坐标。

现在,如果您变换矩形,上述方法需要考虑变换以提供变换矩形的正确坐标。

  • 将手动获取的坐标进行变换,

    r2 = patches.Rectangle((8,4), 5,3)
    
    trafo = mpl.transforms.Affine2D().rotate_around(8,4,angle)
    r2.set_transform(trafo + ax.transData)
    ax.add_patch(r2)
    coords = np.array([r2.get_xy(), [r2.get_x()+r2.get_width(), r2.get_y()],
     [r2.get_x()+r2.get_width(), r2.get_y()+r2.get_height()],
     [r2.get_x(), r2.get_y()+r2.get_height()]])
    print(trafo.transform(coords))
    
  • 变换从路径得到的坐标

    r2 = patches.Rectangle((8,4), 5,3)
    
    trafo = mpl.transforms.Affine2D().rotate_around(8,4,angle)
    r2.set_transform(trafo + ax.transData)
    ax.add_patch(r2)
    
    coords = r2.get_patch_transform().transform(r2.get_path().vertices[:-1])
    print(trafo.transform(coords))
    

在这些情况下,打印的坐标将是

[[  8.           4.        ]
 [ 11.53553391   7.53553391]
 [  9.41421356   9.65685425]
 [  5.87867966   6.12132034]]

或者,如果从边界框获取坐标

coords = r2.get_bbox().get_points()
print(trafo.transform(coords))

打印

[[ 8.          4.        ]
 [ 9.41421356  9.65685425]]

关于python - 获取旋转面片(矩形)的坐标 matplotlib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50306012/

相关文章:

python - 如何在Python中正确实现映射协议(protocol)?

python - 了解tf.contrib.lite.TFLiteConverter量化参数

python - MatPlotLib、日期时间和类型错误 : ufunc 'isfinite' not supported for the input types…

open-source - 重新进行与工作中相同的编程工作

linux - 使用 "diff"和 "patch"命令排除二进制文件和目标文件,使用补丁文件进行 FreeScale LTIB 源代码控制

python - 如何在 python 中使用循环进行正确的转换?

python - 根据字符串类型(样式)转换列表元素

python - 使用 matplotlib 在直线上的特定点插入点

python - Matplotlib:如何在条形之间获得空间?

git - 如何在 git add 交互式补丁模式中获得更好的帅哥?