Как использовать trimesh matlab с параметром color?

#matlab #plot #mesh

#matlab #построение графика #сетка

Вопрос:

Я хочу построить треугольную сетку и раскрасить каждое ребро другим цветом. В документации matlab для trimesh указано, что есть аргумент color , но в нем не указано, какой должна быть его структура — поскольку треугольники имеют общие края, как мне узнать, где расположить какой цвет внутри вектора C ?

Ответ №1:

Вчера я боролся с этой проблемой, и я думаю, что у меня есть решение. Оказывается, что в целом, если вы хотите быть очень подробным, какой край какого цвета, вам нужно быть очень хитрым.

Чтобы вы поняли, в чем проблема, я сначала рассмотрю, как команда trimesh(Tri, X, Y, Z, C) в первую очередь назначает цвета. Аргумент C должен быть вектором чисел с длиной, равной количеству вершин (не ребер). Способ, которым он окрашивает края, следующий. Если у нас есть 4 вершины и мы назначаем

Tri=[1 2 3; 3 2 4]

и

C =[10 20 30 40]

тогда первое ребро, найденное в Tri, равно 1 к 2, и оно окрашено в цвет точки 1, который равен 10. Следующее найденное ребро от 2 до 3, которое окрашено в цвет точки 2, что равно 20. Следующее ребро 3 к 1, которое имеет цвет 30. Следующее ребро 3 к 2 с цветом 30; обратите внимание, что это ребро уже было окрашено в 20, но этот новый цвет перезаписывает старый цвет. И тогда ребра со 2 по 4 будут окрашены в 20, а ребра с 4 по 3 — в 40.

Проблема в том, что без использования специального трюка эта схема раскраски может сделать буквально невозможным окрашивание краев именно так, как вы хотите. Ваш пример: если у вас больше ребер, чем вершин (как в моем примере), и вы хотите, чтобы каждое ребро было окрашено по-разному, вам не повезло, потому что ребра окрашены в соответствии с цветами, назначенными вершинам. Но если мы создадим несколько копий каждой вершины (и, следовательно, несколько копий каждого ребра), то мы вернемся к делу. Кроме того, наша жизнь упрощается тем фактом, что Tri принимает не только грани, но и отдельные ребра.

В качестве примера того, что я имею в виду, предположим, вы хотели, чтобы ребра 2-3 имели цвет 50 в примере выше. Для этого создайте новую точку, точку 5, которая совпадает с точкой 2 (т. Е. с теми же координатами (x, y, z)). Переопределите Tri и C следующим образом:

Tri=[1 2 3; 3 2 4;3 5 3]

C =[10 20 30 40 50]

Обратите внимание, что последние три числа в Tri определяют не грань, а скорее ребро (ребро от 3 до 5, которое совпадает с ребром от 2 до 3). Это ребро будет окрашено любым цветом, которому назначена точка 5. Таким образом, вы можете перезаписать цвета каждого ребра по отдельности. Просто не забудьте поместить эти ребра в конец матрицы Tri, чтобы их раскраски перезаписывали все предыдущие нежелательные раскраски. Если вас не волнует заполнение граней, вы даже можете создать Tri-матрицу, в которой нет ничего, кроме ребер. Это немного халтурно, но это работает.

Ответ №2:

Вы можете просмотреть базовый код функции TRIMESH, используя команду TYPE, вот так:

 type trimesh
  

Это позволяет увидеть, что TRIMESH фактически создает сетчатый график, вызывая функцию PATCH с набором данных грани вершины. Поэтому вы можете использовать документацию по окрашиванию участков, чтобы определить, как определить свой аргумент цветовых данных для TRIMESH, чтобы получить желаемую окраску краев.

Обратите внимание, что аргумент color data, переданный в TRIMESH, в конечном итоге определяет 'FaceVertexCData' свойство результирующего объекта patch, который создается.

Ответ №3:

Если вы не предоставите C матрицу, которую Matlab буквально устанавливает C=Z . Следовательно, C это матрица того же размера, что и ваша матрица высот ( Z ). Вы специально не задаете ему цвета; скорее, вы даете ему вектор чисел, которые Matlab интерпретирует как цвета в соответствии с его текущим colormap .

Попробуйте это

 [x,y]=meshgrid(1:15,1:15);
tri = delaunay(x,y);
z = peaks(15);
trimesh(tri,x,y,z)
  

а затем поиграйте с цветовыми картами

 colormap HSV
colormap spring
colormap gray
  

и так далее.

Я почти уверен, что вы можете определить свои собственные цветовые карты в Matlab. Согласно документации,

Цветовая карта представляет собой матрицу размером m на 3 с действительными числами от 0.0 до 1.0. Каждая строка представляет собой вектор RGB, который определяет один цвет. k-я строка цветовой карты определяет k-й цвет, где map(k,:) = [r(k) g(k) b(k)]) указывается интенсивность красного, зеленого и синего.

Я надеюсь, что это поможет.