Этот пример строит графики конусов векторов скорости для wind
данные. Полученный график использует ряд методов визуализации:
Изоповерхность используется, чтобы предоставить визуальный контекст для графиков конуса и предоставить средство для выбора определенного значения данных для набора конусов.
Подсветка позволяет четко видеть форму изоповерхности.
Использование перспективной проекции, позиционирования камеры и регулировки угла обзора создает окончательный вид.
Отображение изоповерхности в прямоугольном пространстве данных обеспечивает визуальный контекст для графика конуса. Создание изоповерхности требует ряда шагов:
Вычислите величину векторного поля, которое представляет скорость ветра.
Использовать isosurface
и patch
нарисовать изоповерхность, показывающую, где в прямоугольном пространстве скорость ветра равна конкретному значению. Области внутри изоповерхность имеют более высокие скорости ветра, области вне изоповерхность имеют более низкие скорости ветра.
Использовать isonormals
для вычисления вершинных нормалей изоповерхности из объемных данных, а не для вычисления нормалей из треугольников, используемых для визуализации изоповерхности. Эти нормали обычно дают более точные результаты.
Установите визуальные свойства изоповерхности, сделав ее красной и без рисования ребер (FaceColor
, EdgeColor
).
load wind wind_speed = sqrt(u.^2 + v.^2 + w.^2); hiso = patch(isosurface(x,y,z,wind_speed,40)); isonormals(x,y,z,wind_speed,hiso) hiso.FaceColor = 'red'; hiso.EdgeColor = 'none';
Изопрописные буквы аналогичны плоскостям разбиения в том, что они показывают сечение объема. Они спроектированы, чтобы быть торцевыми прописными буквами изоповерхностей. Использование интерполированного цвета грани на изопрописную букву приводит к отображению значения данных в цвет в текущей палитре. Чтобы создать изопрописные буквы для изоповерхности, задайте их с тем же изозначение (isocaps
, patch
, colormap
).
hcap = patch(isocaps(x,y,z,wind_speed,40),... 'FaceColor','interp',... 'EdgeColor','none'); colormap hsv
Использовать daspect
установить соотношение сторон данных осей перед вызовом coneplot
поэтому функция может определить правильный размер конусов.
Определите точки, в которых можно разместить конусы, вычислив другую изоповерхность, которая имеет меньшее изозначение (поэтому конусы отображаются вне первой изоповерхность) и используйте reducepatch
чтобы уменьшить количество граней и вершин (так что конусов на графике не слишком много).
Нарисуйте конусы и установите цвет грани равным blue
и цвет ребра, который нужно none
.
daspect([1 1 1]); [f,verts] = reducepatch(isosurface(x,y,z,wind_speed,30),0.07); h1 = coneplot(x,y,z,u,v,w,verts(:,1),verts(:,2),verts(:,3),3); h1.FaceColor = 'blue'; h1.EdgeColor = 'none';
Создайте второй набор точек при значениях, которые охватывают область значений данных (linspace
, meshgrid
).
Нарисуйте второй набор конусов и установите цвет грани зеленый, а цвет ребра - нет.
xrange = linspace(min(x(:)),max(x(:)),10); yrange = linspace(min(y(:)),max(y(:)),10); zrange = 3:4:15; [cx,cy,cz] = meshgrid(xrange,yrange,zrange); h2 = coneplot(x,y,z,u,v,w,cx,cy,cz,2); h2.FaceColor = 'green'; h2.EdgeColor = 'none';
Используйте axis
команда установить пределы по осям равные минимальному и максимальному значениям данных и заключить график в прямоугольник, чтобы улучшить ощущение объема (box
).
Установите тип проекции на перспективу, чтобы создать более естественное представление объема. Установите точку зрения и масштабируйте, чтобы сцена стала больше (camproj
, camzoom
, view
).
axis tight set(gca,'BoxStyle','full','Box','on') camproj perspective camzoom(1.25) view(65,45)
Добавьте источник света и используйте подсветку Гуро для самой плавной подсветки изоповерхности. Увеличьте силу фоновой подсветки на изопрописных буквах, чтобы сделать их ярче (camlight
, lighting
, AmbientStrength
).
camlight(-45,45) hcap.AmbientStrength = 0.6; lighting gouraud