2013-09-05 2 views
0

У меня есть 3D-сюжет, который содержит полушарие, нарисованное с помощью прибоя, и я пытаюсь построить больше данных с помощью scatter3. Это работает отлично, пока набор данных, который я передаю разбросу3, содержит не более 2000 точек. Если их больше 2000 очков, то разброс 3 ничего не рисует. Если я удалю вызов серфинга, то разброс 3 работает и рисует данные.MATLAB: Использование scatter3 и сетки в то же время

Я проверил, что удержание включено. Я отменил порядок вызовов для серфинга и рассеяния3, но это не повлияло. Мне нужно переключиться с разброса 3 на plot3 (аналогично было предложено here) или есть ли какой-то предел, который я могу изменить для scatter3?

Я использую Matlab 2012b.

EDIT: Я сделал еще несколько копаний и посмотрел на используемые средства визуализации. Когда у меня нет полупрозрачного полусферы, рендеринг - это «художники», но добавление полушария изменяет рендеринг на OpenGL. Если я заставляю рендеринга быть «художниками» (используя set (gcf, «Renderer», «painters»), то scatter3 работает правильно, но я теряю прозрачность в полушарии. Это имеет смысл, но мне действительно нужна прозрачность, потому что часть данные построены с использованием scatter3 находится в пределах полусферы. Добавление второго осей не помогут, потому что рендер для всей фигуры, а не каждая ось (правильно?)

ответ

0

Вы можете попробовать использовать scatter3 и surf в два разных направлениях. вторые оси будут иметь набор свойства Visible к off, и обе осям одинаковых пределов.

+0

Это скорее комментарий, чем ответ на меня. – Schorsch

+0

@ Шорш Я не понимаю, извините. Он полностью решает проблему (не решая ее, так как я не могу ее воспроизвести и проверить решение - кстати, никаких упоминаний об этом виде ошибок в другом месте в сети). Проблема в том, что при построении графика разброс> 2000 показывает пробел.Предлагаемое решение: разделение на две отдельные оси, которые накладываются (разбрасываются сверху). Это не комментарий, а двухстрочный ответ. Напротив, я прочитал много комментариев, которые должны быть ответами (http://stackoverflow.com/help/privileges/comment). – marsei

1

к сожалению, я думаю, что «решение» является ошибкой в ​​OpenGL рендерер в Matlab. при использовании OpenGL рендеринга, Matlab не будут отобразить любой из данных, переданных для рассеяния3, если последнее значение в цветовом векторе равно NaN. Другие значения в векторе могут быть NaN. Пока последнее значение не является NaN, не существует предела для количества точек, поддерживаемых разбросом3.

Этот код рабочие вызовы scatter3 с 2001 случайных точек:

myX = randi(300, 1, 2001) 
myY = randi(300, 1, length(myX)) 
myZ = randi(300, 1, length(myX)) 
myColors = ones(1, length(myX)) 
[x,y,z] = sphere(10) 

% Figure 1 
figure 
surf(x*50, y*50, z*50, 'FaceAlpha', 0.2, 'EdgeAlpha', 0.0, 'FaceColor', [1 0 0]) 
hold on 
scatter3(myX, myY, myZ, 100, myColors, 'filled') 

Если цвет вектор изменяется таким образом, последнее значение NaN, полученный график не содержит каких-либо данных scatter3

myX = randi(300, 1, 2001) 
myY = randi(300, 1, length(myX)) 
myZ = randi(300, 1, length(myX)) 
myColors = ones(1, length(myX)) 
[x,y,z] = sphere(10) 

% Figure 1 
figure 
myColors = ones(1, length(myX)) 
myColors(1,length(myX)) = NaN; 
surf(x*50, y*50, z*50, 'FaceAlpha', 0.2, 'EdgeAlpha', 0.0, 'FaceColor', [1 0 0]) 
hold on 
scatter3(myX, myY, myZ, 100, myColors, 'filled') 

Также представляется, что средство рендеринга OpenGL не поддерживает NaN в качестве цвета так же, как и рендеринга живописцев. Если вы запустите следующий пример строки за строкой, вы увидите, как рендеринг OpenGL отображает точки, которые не были отображены визуализатором живописцев.

myX = randi(300, 1, 10) 
myY = randi(300, 1, length(myX)) 
myZ = randi(300, 1, length(myX)) 
myColors = ones(1, length(myX)) 
[x,y,z] = sphere(10) 

% Figure 1 
figure 
myColors(1,1:5) = NaN; 
scatter3(myX, myY, myZ, 100, myColors, 'filled') 
get(gcf, 'Renderer') 

% Figure 2 
figure 
myColors(1,1:5) = NaN; 
scatter3(myX, myY, myZ, 100, myColors, 'filled') 
get(gcf, 'Renderer') 
hold on 
surf(x*50, y*50, z*50, 'FaceAlpha', 0.2, 'EdgeAlpha', 0.0, 'FaceColor', [1 0 0]) 
get(gcf, 'Renderer') 

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

myX(isnan(myColors)) = NaN 

художники и рендеринги OpenGL, как представляется, обрабатывают NaN в качестве местоположения таким же образом.

Надеюсь, это поможет кому-то, кто столкнулся с той же проблемой, что и я.

+0

Я думаю, ваше право об ошибке, поскольку я испытываю то же самое. OpenGL ничего не нарисовал, пока я не установил последнее значение в матрице в значение не-нано. Но я не понял, как сделать nans в цветовом векторе невидимым сейчас? Наны, по-видимому, сопоставляются с цветом самого низкого значения. – embert

Смежные вопросы