Векторное поле, отображаемое с конусными графиками

Что могут показать конусные графики

Этот пример строит графики конусов векторов скорости для wind данные. Полученный график использует ряд методов визуализации:

  • Изоповерхность используется, чтобы предоставить визуальный контекст для графиков конуса и предоставить средство для выбора определенного значения данных для набора конусов.

  • Подсветка позволяет четко видеть форму изоповерхности.

  • Использование перспективной проекции, позиционирования камеры и регулировки угла обзора создает окончательный вид.

1. Создайте изоповерхность

Отображение изоповерхности в прямоугольном пространстве данных обеспечивает визуальный контекст для графика конуса. Создание изоповерхности требует ряда шагов:

  1. Вычислите величину векторного поля, которое представляет скорость ветра.

  2. Использовать isosurface и patch нарисовать изоповерхность, показывающую, где в прямоугольном пространстве скорость ветра равна конкретному значению. Области внутри изоповерхность имеют более высокие скорости ветра, области вне изоповерхность имеют более низкие скорости ветра.

  3. Использовать isonormals для вычисления вершинных нормалей изоповерхности из объемных данных, а не для вычисления нормалей из треугольников, используемых для визуализации изоповерхности. Эти нормали обычно дают более точные результаты.

  4. Установите визуальные свойства изоповерхности, сделав ее красной и без рисования ребер (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';

2. Добавьте Изопрописные буквы к изоповерхность

Изопрописные буквы аналогичны плоскостям разбиения в том, что они показывают сечение объема. Они спроектированы, чтобы быть торцевыми прописными буквами изоповерхностей. Использование интерполированного цвета грани на изопрописную букву приводит к отображению значения данных в цвет в текущей палитре. Чтобы создать изопрописные буквы для изоповерхности, задайте их с тем же изозначение (isocaps, patch, colormap).

hcap = patch(isocaps(x,y,z,wind_speed,40),...
   'FaceColor','interp',...
   'EdgeColor','none');
colormap hsv

3. Создайте первый набор конусов

  • Использовать 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';

4. Создайте второй набор конусов

  1. Создайте второй набор точек при значениях, которые охватывают область значений данных (linspace, meshgrid).

  2. Нарисуйте второй набор конусов и установите цвет грани зеленый, а цвет ребра - нет.

    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';

5. Определите вид

  1. Используйте axis команда установить пределы по осям равные минимальному и максимальному значениям данных и заключить график в прямоугольник, чтобы улучшить ощущение объема (box).

  2. Установите тип проекции на перспективу, чтобы создать более естественное представление объема. Установите точку зрения и масштабируйте, чтобы сцена стала больше (camproj, camzoom, view).

    axis tight
    set(gca,'BoxStyle','full','Box','on')
    camproj perspective
    camzoom(1.25)
    view(65,45)

6. Добавление подсветки

Добавьте источник света и используйте подсветку Гуро для самой плавной подсветки изоповерхности. Увеличьте силу фоновой подсветки на изопрописных буквах, чтобы сделать их ярче (camlight, lighting, AmbientStrength).

camlight(-45,45)
hcap.AmbientStrength = 0.6;
lighting gouraud