Как выровнять 2D-художников по 3D-точкам (какое правильное преобразование координат)?Python

Программы на Python
Ответить
Anonymous
 Как выровнять 2D-художников по 3D-точкам (какое правильное преобразование координат)?

Сообщение Anonymous »

На этом рисунке:
Изображение

Красные круги — это трехмерные точки, нанесенные с помощью Axes3D.scatter(). У них есть 3D позиция. Числа в их bbox отображаются с помощью Axes3D.add_artist(). Они являются производными от mpl.text.Text, то есть представляют собой 2D-объекты с фиксированными координатами области просмотра. Я хочу, чтобы фигуры были выровнены по кругам, чтобы экземплярам передавались соответствующие трехмерные координаты, чтобы они могли рисовать себя в правильных координатах области просмотра.
Этот пример не имеет реальной цели. , это только для того, чтобы попрактиковаться в 3D в Matplotlib и в том, как можно выравнивать 2D- и 3D-виджеты независимо от точки зрения. Мне было трудно читать документацию Matplotlib 3D. Кажется, не существует реальной отправной точки для постепенного изучения того, как использовать набор инструментов 3D. Моя текущая попытка каким-то образом работает, но это скорее случайность, чем логический метод.
Я думаю, мне нужно переопределить метод рисования 2D-текста и спроецировать 3D-координаты в плоскость 2D-окна просмотра, но я не могу сделать это правильно.
Мне пришлось искусственно масштабировать 2D-позиции, чтобы они лучше соответствовали кругам, только для того, чтобы создать изображение выше. Другого обоснования такое масштабирование не имеет, а без него цифры вообще не соответствуют кругам. Можете ли вы помочь мне понять, какой метод правильный?
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import proj3d

class Text2d_upd(mpl.text.Text):
text_kw = dict(fontsize=12, ha='center', va='center')
bbox = dict(boxstyle='circle', pad=0.3, facecolor='turquoise', alpha=0.5)

def __init__(self, x, y, z, *args, **kwargs):
self.p = x, y, z
kwargs = kwargs | self.text_kw
super().__init__(x, y, *args, bbox=self.bbox, **kwargs)

def draw(self, renderer):
# Convert 3D coords to 2D view coords
M = self.axes.M
x, y, z = proj3d.proj_transform(*self.p, M)

# Shift artist to 2D position
k = 5.4 #

Подробнее здесь: https://stackoverflow.com/questions/791 ... -transform
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»