Skip to content

Commit c54dff9

Browse files
Merge pull request #413 from plotly/adding_isosurface_functionality_to_matlab_plotly
adding isosurface functionality to matlab_plotly
2 parents 97a3250 + 00e40a9 commit c54dff9

File tree

2 files changed

+192
-0
lines changed

2 files changed

+192
-0
lines changed

plotly/plotlyfig_aux/core/updateData.m

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@
9595
updateTernaryPlotPro(obj, dataIndex);
9696
elseif ismember('ternpcolor', lower(obj.PlotOptions.TreatAs))
9797
updateTernaryPlotPro(obj, dataIndex);
98+
elseif ismember('isosurface', lower(obj.PlotOptions.TreatAs))
99+
updateIsosurface(obj, dataIndex);
98100
else
99101
updatePatch(obj, dataIndex);
100102
end
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
function obj = updateIsosurface(obj, isoIndex)
2+
3+
%-------------------------------------------------------------------------%
4+
5+
%-INITIALIZATIONS-%
6+
7+
axIndex = obj.getAxisIndex(obj.State.Plot(isoIndex).AssociatedAxis);
8+
plotData = get(obj.State.Plot(isoIndex).Handle);
9+
axisData = get(plotData.Parent);
10+
[xSource, ySource] = findSourceAxis(obj, axIndex);
11+
12+
%-update scene-%
13+
updateScene(obj, isoIndex)
14+
15+
%-get mesh data-%
16+
xData = plotData.Vertices(:, 1);
17+
yData = plotData.Vertices(:, 2);
18+
zData = plotData.Vertices(:, 3);
19+
20+
iData = plotData.Faces(:, 1) - 1;
21+
jData = plotData.Faces(:, 2) - 1;
22+
kData = plotData.Faces(:, 3) - 1;
23+
24+
%-------------------------------------------------------------------------%
25+
26+
%-get trace-%
27+
obj.data{isoIndex}.type = 'mesh3d';
28+
obj.data{isoIndex}.name = plotData.DisplayName;
29+
obj.data{isoIndex}.showscale = false;
30+
31+
%-------------------------------------------------------------------------%
32+
33+
%-set mesh data-%
34+
obj.data{isoIndex}.x = xData;
35+
obj.data{isoIndex}.y = yData;
36+
obj.data{isoIndex}.z = zData;
37+
38+
obj.data{isoIndex}.i = iData;
39+
obj.data{isoIndex}.j = jData;
40+
obj.data{isoIndex}.k = kData;
41+
42+
%-------------------------------------------------------------------------%
43+
44+
%-mesh coloring-%
45+
faceColor = getFaceColor(plotData, axisData);
46+
47+
if iscell(faceColor)
48+
obj.data{isoIndex}.facecolor = faceColor;
49+
else
50+
obj.data{isoIndex}.color = faceColor;
51+
end
52+
53+
%-------------------------------------------------------------------------%
54+
55+
%-lighting settings-%
56+
if ~strcmp(plotData.FaceLighting, 'flat')
57+
obj.data{isoIndex}.lighting.diffuse = plotData.DiffuseStrength;
58+
obj.data{isoIndex}.lighting.ambient = plotData.AmbientStrength;
59+
obj.data{isoIndex}.lighting.specular = plotData.SpecularStrength;
60+
obj.data{isoIndex}.lighting.roughness = 0.2;
61+
obj.data{isoIndex}.lighting.fresnel = 0.5;
62+
obj.data{isoIndex}.lighting.vertexnormalsepsilon = 1e-12;
63+
obj.data{isoIndex}.lighting.facenormalsepsilon = 1e-6;
64+
end
65+
66+
%-------------------------------------------------------------------------%
67+
68+
%-associate scene to trace-%
69+
obj.data{isoIndex}.scene = sprintf('scene%d', xSource);
70+
71+
%-------------------------------------------------------------------------%
72+
end
73+
74+
function updateScene(obj, isoIndex)
75+
76+
%-INITIALIZATIONS-%
77+
axIndex = obj.getAxisIndex(obj.State.Plot(isoIndex).AssociatedAxis);
78+
plotData = get(obj.State.Plot(isoIndex).Handle);
79+
axisData = get(plotData.Parent);
80+
[xSource, ySource] = findSourceAxis(obj, axIndex);
81+
scene = eval( sprintf('obj.layout.scene%d', xSource) );
82+
83+
aspectRatio = axisData.PlotBoxAspectRatio;
84+
cameraPosition = axisData.CameraPosition;
85+
dataAspectRatio = axisData.DataAspectRatio;
86+
cameraUpVector = axisData.CameraUpVector;
87+
cameraEye = cameraPosition./dataAspectRatio;
88+
normFac = 0.5*abs(min(cameraEye));
89+
90+
%-aspect ratio-%
91+
scene.aspectratio.x = aspectRatio(1);
92+
scene.aspectratio.y = aspectRatio(2);
93+
scene.aspectratio.z = aspectRatio(3);
94+
95+
%-camera eye-%
96+
scene.camera.eye.x = cameraEye(1) / normFac;
97+
scene.camera.eye.y = cameraEye(2) / normFac;
98+
scene.camera.eye.z = cameraEye(3) / normFac;
99+
100+
%-camera up-%
101+
scene.camera.up.x = cameraUpVector(1);
102+
scene.camera.up.y = cameraUpVector(2);
103+
scene.camera.up.z = cameraUpVector(3);
104+
105+
%-camera projection-%
106+
% scene.camera.projection.type = axisData.Projection;
107+
108+
%-scene axis configuration-%
109+
scene.xaxis.range = axisData.XLim;
110+
scene.yaxis.range = axisData.YLim;
111+
scene.zaxis.range = axisData.ZLim;
112+
113+
scene.xaxis.zeroline = false;
114+
scene.yaxis.zeroline = false;
115+
scene.zaxis.zeroline = false;
116+
117+
scene.xaxis.showline = true;
118+
scene.yaxis.showline = true;
119+
scene.zaxis.showline = true;
120+
121+
scene.xaxis.ticklabelposition = 'outside';
122+
scene.yaxis.ticklabelposition = 'outside';
123+
scene.zaxis.ticklabelposition = 'outside';
124+
125+
scene.xaxis.title = axisData.XLabel.String;
126+
scene.yaxis.title = axisData.YLabel.String;
127+
scene.zaxis.title = axisData.ZLabel.String;
128+
129+
%-tick labels-%
130+
scene.xaxis.tickvals = axisData.XTick;
131+
scene.xaxis.ticktext = axisData.XTickLabel;
132+
scene.yaxis.tickvals = axisData.YTick;
133+
scene.yaxis.ticktext = axisData.YTickLabel;
134+
scene.zaxis.tickvals = axisData.ZTick;
135+
scene.zaxis.ticktext = axisData.ZTickLabel;
136+
137+
scene.xaxis.tickcolor = 'rgba(0,0,0,1)';
138+
scene.yaxis.tickcolor = 'rgba(0,0,0,1)';
139+
scene.zaxis.tickcolor = 'rgba(0,0,0,1)';
140+
scene.xaxis.tickfont.size = axisData.FontSize;
141+
scene.yaxis.tickfont.size = axisData.FontSize;
142+
scene.zaxis.tickfont.size = axisData.FontSize;
143+
scene.xaxis.tickfont.family = matlab2plotlyfont(axisData.FontName);
144+
scene.yaxis.tickfont.family = matlab2plotlyfont(axisData.FontName);
145+
scene.zaxis.tickfont.family = matlab2plotlyfont(axisData.FontName);
146+
147+
%-grid-%
148+
if strcmp(axisData.XGrid, 'off'), scene.xaxis.showgrid = false; end
149+
if strcmp(axisData.YGrid, 'off'), scene.yaxis.showgrid = false; end
150+
if strcmp(axisData.ZGrid, 'off'), scene.zaxis.showgrid = false; end
151+
152+
%-SET SCENE TO LAYOUT-%
153+
obj.layout = setfield(obj.layout, sprintf('scene%d', xSource), scene);
154+
end
155+
156+
function fillColor = getFaceColor(plotData, axisData)
157+
158+
%-initializations-%
159+
faceColor = plotData.FaceColor;
160+
cData = plotData.CData;
161+
cLim = axisData.CLim;
162+
colorMap = axisData.Colormap;
163+
164+
%-get face color depending of faceColor attribute
165+
if isnumeric(faceColor)
166+
numColor = 255 * faceColor;
167+
fillColor = sprintf('rgb(%f,%f,%f)', numColor);
168+
169+
elseif strcmpi(faceColor, 'flat')
170+
fillColor = getStringColor(cData, colorMap, cLim);
171+
172+
elseif strcmpi(faceColor, 'interp')
173+
if size(cData, 1) ~= 1
174+
for n = 1:size(cData, 2)
175+
fillColor{n} = getStringColor(mean(cData(:, n)), colorMap, cLim);
176+
end
177+
else
178+
% TODO
179+
end
180+
end
181+
end
182+
183+
function stringColor = getStringColor(cData, colorMap, cLim)
184+
nColors = size(colorMap, 1);
185+
cIndex = max( min( cData, cLim(2) ), cLim(1) );
186+
scaleColor = (cIndex - cLim(1)) / diff(cLim);
187+
cIndex = 1 + floor(scaleColor*(nColors-1));
188+
numColor = 255 * colorMap(cIndex, :);
189+
stringColor = sprintf('rgb(%f,%f,%f)', numColor);
190+
end

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy