Как использовать триместу Matlab с опцией цвета? - PullRequest
1 голос
/ 08 июня 2011

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

Ответы [ 3 ]

4 голосов
/ 11 сентября 2011

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

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

Три = [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 следующим образом:

Три = [1 2 3; 3 2 4; 3 5 3]

C = [10 20 30 40 50]

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

0 голосов
/ 08 июня 2011

Если вы не предоставите матрицу 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 -by-3 действительных чисел в диапазоне от 0,0 до 1,0. Каждая строка представляет собой вектор RGB, который определяет один цвет. K-я строка цветовой карты определяет k-й цвет, где map(k,:) = [r(k) g(k) b(k)]) указывает интенсивность красного, зеленого и синего.

Надеюсь, это поможет.

0 голосов
/ 08 июня 2011

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

type trimesh

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

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

...