Я нашел решение, может быть, оно будет полезно для других.
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np
import colorsys
from matplotlib.tri import Triangulation
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
n_angles = 80
n_radii = 20
# An array of radii
# Does not include radius r=0, this is to eliminate duplicate points
radii = np.linspace(0.0, 0.5, n_radii)
# An array of angles
angles = np.linspace(0, 2*np.pi, n_angles, endpoint=False)
# Repeat all angles for each radius
angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1)
# Convert polar (radii, angles) coords to cartesian (x, y) coords
# (0, 0) is added here. There are no duplicate points in the (x, y) plane
x = np.append(0, (radii*np.cos(angles)).flatten())
y = np.append(0, (radii*np.sin(angles)).flatten())
# Pringle surface
z = 1+-np.sqrt(x**2+y**2)*2
print(x.shape, y.shape, angles.shape, radii.shape, z.shape)
# NOTE: This assumes that there is a nice projection of the surface into the x/y-plane!
tri = Triangulation(x, y)
triangle_vertices = np.array([np.array([[x[T[0]], y[T[0]], z[T[0]]],
[x[T[1]], y[T[1]], z[T[1]]],
[x[T[2]], y[T[2]], z[T[2]]]]) for T in tri.triangles])
x2 = np.append(0, (radii*np.cos(angles)).flatten())
y2 = np.append(0, (radii*np.sin(angles)).flatten())
# Pringle surface
z2 = -1+np.sqrt(x**2+y**2)*2
# NOTE: This assumes that there is a nice projection of the surface into the x/y-plane!
tri2 = Triangulation(x2, y2)
triangle_vertices2 = np.array([np.array([[x2[T[0]], y2[T[0]], z2[T[0]]],
[x2[T[1]], y2[T[1]], z2[T[1]]],
[x2[T[2]], y2[T[2]], z2[T[2]]]]) for T in tri2.triangles])
triangle_vertices = np.concatenate([triangle_vertices, triangle_vertices2])
midpoints = np.average(triangle_vertices, axis=1)
def find_color_for_point(pt):
c_x, c_y, c_z = pt
angle = np.arctan2(c_x, c_y)*180/np.pi
if (angle < 0):
angle = angle + 360
if c_z < 0:
l = 0.5 - abs(c_z)/2
#l=0
if c_z == 0:
l = 0.5
if c_z > 0:
l = (1 - (1-c_z)/2)
if c_z > 0.97:
l = (1 - (1-c_z)/2)
col = colorsys.hls_to_rgb(angle/360, l, 1)
return col
facecolors = [find_color_for_point(pt) for pt in midpoints] # smooth gradient
# facecolors = [np.random.random(3) for pt in midpoints] # random colors
coll = Poly3DCollection(
triangle_vertices, facecolors=facecolors, edgecolors=None)
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.add_collection(coll)
ax.set_xlim(-1, 1)
ax.set_ylim(-1, 1)
ax.set_zlim(-1, 1)
ax.elev = 50
plt.show()
Я должен сказать, модель MVC специально практична в веб-приложениях, и поэтому представление (страница HTML) действительно разъединяется и далеко от контроллера и модели.
В настольных приложениях, дело не в этом, и Вы будете скоро упускать некоторые возможности повреждение шаблон для создания приложения более полезным.
Например, Вы не можете сделать привязки данных мощного и средства экономии времени в WPF, потому что это повреждает шаблон MVC.
Хороший шаблон, используемый в WPF, является M-V-VM
Образцовый Контроллер Представления является шаблоном, ASP.NET, который MVC - то, что шаблон относился к веб-платформе ASP.NET. Как его упомянутый, это связывает маршрутизацию URL в вещи сделать навигацию более простой и больше интеграла к тому, как действия называют.
Тем не менее ничто технически не препятствует тому, чтобы Вы использовали компоненты в библиотеках ASP.NET MVC. Уровни доступа к данным через LINQ или Объекты доступны вне ASP.NET MVC. Аналогично, сам шаблон имеет бесчисленные примеры своей реализации для приложений Winforms. К тем же методам можно было относиться WPF.
Я не сказал бы, что Вы неправильно понимаете разделение проблем вообще, на самом деле Ваш вопрос указывает на понимание этого хорошо.
Имя "ASP.NET, MVC" показывает, что Microsoft приняла сознательное решение создать более специализированную реализацию MVC для w3eb, основывало приложения. Это позволяет им оптимизировать дизайн для создания этого более продуктивным для разработчиков, создающих веб-приложения и сервисы.
Если бы они создали более общую ".NET MVC", платформа я ожидал бы, что это потребовало бы намного более трудного компромисса между потребностями веб-приложений по сравнению с настольными приложениями.
Лично, я думаю, что подход Microsoft может сделать это более сбивающим с толку менее опытных разработчиков, которые часто предполагают, что реализация шаблона, шаблон.
ASP.NET MVC является платформой для того, чтобы сделать MVC с ASP.NET; это включает вещи как URL, направляющий и т.д. Можно очень хорошо сделать MVC (Образцовый Контроллер Представления) программирование стиля с WPF и WinForms.
Вот предыдущий вопрос, где я попробовал так же - давайте посмотрим то, что мы придумываем на этот раз.
Другой аспект этого вопроса - то, почему VS имеет так мало в способе абстрактных средств проектирования, которые могут использоваться и для рабочего стола.NET и для разработки asp.NET?
Легко говорить об этом, я знаю, но если вы хорошо реализуете свой уровень доступа к данным и бизнес-объекты, можно повторно использовать значительную часть вашего кода.
Мы используем ASP.NET MVC. У нас есть отдельный проект, в котором находятся бизнес-объекты и уровень доступа к данным. Наши "модели" в веб-проекте - это, как правило, легкие обертки для наших бизнес-объектов.
Наши методы контроллера довольно легковесны, поскольку между слоем доступа к данным и нашими бизнес-объектами мы инкапсулировали и упростили большую часть нашей бизнес-логики, представленной потребителям.
После создания нашего MVC-приложения мы захотели использовать некоторые из наших данных в WPF-приложении (для экрана отображения состояния). Мы просто создали новый проект, сослались на наш уровень доступа к данным и модель данных и ушли. Очень просто, и много повторного использования кода.