<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri",sans-serif;
mso-fareast-language:EN-US;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-GB" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">Hello,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I want to plot a function of three independent variables ( v = f(x, y, z) ) so that I can visualize it.<o:p></o:p></p>
<p class="MsoNormal">Essentially, this requires a 4-D plot but I can do it by using param3d to give me three independent axes then representing the value of the function at each point by using the colour or size of the dot.<o:p></o:p></p>
<p class="MsoNormal">This all works nicely but the problem is the slowness of the plotting operation:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">for i = 1: size(dots, 'r') do<o:p></o:p></p>
<p class="MsoNormal"> param3d(dots(i, 1), dots(i, 2), dots(i, 3));<o:p></o:p></p>
<p class="MsoNormal"> pl = gce();<o:p></o:p></p>
<p class="MsoNormal"> pl.line_mode = 'off';<o:p></o:p></p>
<p class="MsoNormal"> pl.mark_mode = 'on';<o:p></o:p></p>
<p class="MsoNormal"> pl.mark_size_unit = 'point';<o:p></o:p></p>
<p class="MsoNormal"> pl.mark_size = 10; // Using dot colour to display the dependent variable<o:p></o:p></p>
<p class="MsoNormal"> pl.mark_foreground = dots(i, 4);<o:p></o:p></p>
<p class="MsoNormal">// pl.mark_size = dots(i, 4); // Using dot size to display the dependent variable<o:p></o:p></p>
<p class="MsoNormal">// pl.mark_foreground = size(cmap, 'r') - 1;<o:p></o:p></p>
<p class="MsoNormal">end<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Is it possible to 'vectorize' this operation ?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">At present the dot information is stored in a single matrix using columns for x, y, z & colour: it needn't be done this way.<o:p></o:p></p>
<p class="MsoNormal">Notice the line_mode, mark_mode etc. switching - I haven't found a way to set these values as defaults.<o:p></o:p></p>
<p class="MsoNormal">Instead of plotting each dot I tried plotting a single, master dot, then copying its handle to all the other points. The effect of this was that changing the colour of one changed the colour of them all.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The full test programme is given below.<o:p></o:p></p>
<p class="MsoNormal">I'm using Windows 7 and Scilab 5.4.1<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Many thanks in anticipation,<o:p></o:p></p>
<p class="MsoNormal">Adrian.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">//*******************************************************************************<o:p></o:p></p>
<p class="MsoNormal">// 3D plot trial.<o:p></o:p></p>
<p class="MsoNormal">//*******************************************************************************<o:p></o:p></p>
<p class="MsoNormal">// 1) The number of colours in the colour map sets the granularity of the displayed values.<o:p></o:p></p>
<p class="MsoNormal">// 2) A step size, in conjunction with the range of each of the three independent variables, sets<o:p></o:p></p>
<p class="MsoNormal">// the total number of dots.<o:p></o:p></p>
<p class="MsoNormal">// 3) For all combinations of the independent variable values, calculate the dependent variable.<o:p></o:p></p>
<p class="MsoNormal">// 4) Optionally, remove all dependent variable values lying outside prescribed limits.<o:p></o:p></p>
<p class="MsoNormal">// 5) Convert all (remaining) dependent variable values to a colour number.<o:p></o:p></p>
<p class="MsoNormal">// 6) Plot all dots using the calculated colour map.<o:p></o:p></p>
<p class="MsoNormal">// 7) Dot size could be varied, as an alternative to dot colour.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">xdel(winsid());<o:p></o:p></p>
<p class="MsoNormal">clear;<o:p></o:p></p>
<p class="MsoNormal">clearglobal;<o:p></o:p></p>
<p class="MsoNormal">resethistory;<o:p></o:p></p>
<p class="MsoNormal">clc;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">//-------------------------------------------------------------------------------<o:p></o:p></p>
<p class="MsoNormal">// Graded-colour generator.<o:p></o:p></p>
<p class="MsoNormal">// xgrade is a continuous parameter, range 0 to 1, which varies the colour grade (brightness)<o:p></o:p></p>
<p class="MsoNormal">// between limits pale & dark where pale = 255 would mean white and dark = 0 would mean black.<o:p></o:p></p>
<p class="MsoNormal">// Practical values are pale = 220, dark = 120.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">function RGB = SetColour(pale, dark, colour, xgrade)<o:p></o:p></p>
<p class="MsoNormal"> k1 = pale + 255 - dark;<o:p></o:p></p>
<p class="MsoNormal"> k2 = round(xgrade * k1);<o:p></o:p></p>
<p class="MsoNormal"> if xgrade <= pale / k1 then<o:p></o:p></p>
<p class="MsoNormal"> p = 255;<o:p></o:p></p>
<p class="MsoNormal"> s = pale - k2;<o:p></o:p></p>
<p class="MsoNormal"> else<o:p></o:p></p>
<p class="MsoNormal"> p = pale + 255 - k2;<o:p></o:p></p>
<p class="MsoNormal"> s = 0;<o:p></o:p></p>
<p class="MsoNormal"> end<o:p></o:p></p>
<p class="MsoNormal"> select colour<o:p></o:p></p>
<p class="MsoNormal"> case #rd then<o:p></o:p></p>
<p class="MsoNormal"> RGB = [p, s, s];<o:p></o:p></p>
<p class="MsoNormal"> case #yw then<o:p></o:p></p>
<p class="MsoNormal"> RGB = [p, p, s];<o:p></o:p></p>
<p class="MsoNormal"> case #gn then<o:p></o:p></p>
<p class="MsoNormal"> RGB = [s, p, s];<o:p></o:p></p>
<p class="MsoNormal"> case #cn then<o:p></o:p></p>
<p class="MsoNormal"> RGB = [s, p, p];<o:p></o:p></p>
<p class="MsoNormal"> case #be then<o:p></o:p></p>
<p class="MsoNormal"> RGB = [s, s, p];<o:p></o:p></p>
<p class="MsoNormal"> case #ma then<o:p></o:p></p>
<p class="MsoNormal"> RGB = [p, s, p];<o:p></o:p></p>
<p class="MsoNormal"> else<o:p></o:p></p>
<p class="MsoNormal"> RGB = [0, 0, 0];<o:p></o:p></p>
<p class="MsoNormal"> end<o:p></o:p></p>
<p class="MsoNormal">endfunction<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">#rd = 1<o:p></o:p></p>
<p class="MsoNormal">#yw = 2<o:p></o:p></p>
<p class="MsoNormal">#gn = 3<o:p></o:p></p>
<p class="MsoNormal">#cn = 4<o:p></o:p></p>
<p class="MsoNormal">#be = 5<o:p></o:p></p>
<p class="MsoNormal">#ma = 6<o:p></o:p></p>
<p class="MsoNormal">Ncolour = 6<o:p></o:p></p>
<p class="MsoNormal">Ngrade = 11<o:p></o:p></p>
<p class="MsoNormal">pale = 220<o:p></o:p></p>
<p class="MsoNormal">dark = 120<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">//-------------------------------------------------------------------------------<o:p></o:p></p>
<p class="MsoNormal">// Graded-colour colour-map generator.<o:p></o:p></p>
<p class="MsoNormal">// Colours are mapped consecutively in blocks of Ngrade RGB values.<o:p></o:p></p>
<p class="MsoNormal">// The RGB triplet for a particular colour and grade is accessed by calculating the row index using:<o:p></o:p></p>
<p class="MsoNormal">// r = Ngrade(colour - 1) + grade.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">function cmap = ColourMap(Ncolour, Ngrade)<o:p></o:p></p>
<p class="MsoNormal"> cmap = []<o:p></o:p></p>
<p class="MsoNormal"> for colour = 1: Ncolour do<o:p></o:p></p>
<p class="MsoNormal"> for xgrade = linspace(0, 1, Ngrade) do<o:p></o:p></p>
<p class="MsoNormal"> RGB = SetColour(pale, dark, colour, xgrade) / 255;<o:p></o:p></p>
<p class="MsoNormal"> cmap = [cmap; RGB];<o:p></o:p></p>
<p class="MsoNormal"> end<o:p></o:p></p>
<p class="MsoNormal"> end<o:p></o:p></p>
<p class="MsoNormal"> cmap = [cmap; [0, 0, 0]]; // Add black & white<o:p></o:p></p>
<p class="MsoNormal"> cmap = [cmap; [1, 1, 1]]<o:p></o:p></p>
<p class="MsoNormal">endfunction<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">//-------------------------------------------------------------------------------<o:p></o:p></p>
<p class="MsoNormal">// An arbitrary example function, suitable for plotting, which generates values between 1 & 11<o:p></o:p></p>
<p class="MsoNormal">// dependent on the three input variables.<o:p></o:p></p>
<p class="MsoNormal">// The output range 1..11 suits the colour-map range.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">function v = F(x, y, z)<o:p></o:p></p>
<p class="MsoNormal"> v = round((x/10 + y/10 + (z - 5.5)^2/20.25 - 0.2)/0.28) + 1;<o:p></o:p></p>
<p class="MsoNormal">endfunction<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">//-------------------------------------------------------------------------------<o:p></o:p></p>
<p class="MsoNormal">// Generate the dots to be plotted.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">colour = #rd<o:p></o:p></p>
<p class="MsoNormal">index = Ngrade * (colour - 1)<o:p></o:p></p>
<p class="MsoNormal">N = 10<o:p></o:p></p>
<p class="MsoNormal">values = linspace(1, 10, N)<o:p></o:p></p>
<p class="MsoNormal">dots = []<o:p></o:p></p>
<p class="MsoNormal">for x = values do<o:p></o:p></p>
<p class="MsoNormal"> for y = values do<o:p></o:p></p>
<p class="MsoNormal"> for z = values do<o:p></o:p></p>
<p class="MsoNormal"> dots = [dots; x, y, z, F(x, y, z) + index];<o:p></o:p></p>
<p class="MsoNormal"> end<o:p></o:p></p>
<p class="MsoNormal"> end<o:p></o:p></p>
<p class="MsoNormal">end<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">//-------------------------------------------------------------------------------<o:p></o:p></p>
<p class="MsoNormal">// Prepare a 3D plot with appropriate colour-map.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">cmap = ColourMap(Ncolour, Ngrade);<o:p></o:p></p>
<p class="MsoNormal">fg = scf();<o:p></o:p></p>
<p class="MsoNormal">//fg.figure_position = [,];<o:p></o:p></p>
<p class="MsoNormal">//fg.figure_size = [,];<o:p></o:p></p>
<p class="MsoNormal">fg.color_map = cmap;<o:p></o:p></p>
<p class="MsoNormal">fg.background = size(cmap, 'r');<o:p></o:p></p>
<p class="MsoNormal">da = gda();<o:p></o:p></p>
<p class="MsoNormal">da.line_mode = 'off';<o:p></o:p></p>
<p class="MsoNormal">da.mark_mode = 'on';<o:p></o:p></p>
<p class="MsoNormal">da.mark_size_unit = 'point';<o:p></o:p></p>
<p class="MsoNormal">da.mark_size = 10;<o:p></o:p></p>
<p class="MsoNormal">//da.mark_foreground = size(cmap, 'r') - 1;<o:p></o:p></p>
<p class="MsoNormal">ax = newaxes();<o:p></o:p></p>
<p class="MsoNormal">ax.margins = [0.07,0.07,0.03,0.07];<o:p></o:p></p>
<p class="MsoNormal">ax.tight_limits = 'on';<o:p></o:p></p>
<p class="MsoNormal">ax.data_bounds = [0.8,0.8,0.8;10.2,10.2,10.2];<o:p></o:p></p>
<p class="MsoNormal">ax.cube_scaling = 'on';<o:p></o:p></p>
<p class="MsoNormal">ax.zoom_box = [0.8,0.8,10.2,10.2,0.8,10.2];<o:p></o:p></p>
<p class="MsoNormal">ax.hidden_axis_color = size(cmap, 'r') - 1;<o:p></o:p></p>
<p class="MsoNormal">//ax.line_mode = 'off'<o:p></o:p></p>
<p class="MsoNormal">//ax.mark_mode = 'on'<o:p></o:p></p>
<p class="MsoNormal">//ax.mark_size_unit = 'point'<o:p></o:p></p>
<p class="MsoNormal">//ax.mark_size = 10<o:p></o:p></p>
<p class="MsoNormal">//ax.mark_foreground = 1<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">//-------------------------------------------------------------------------------<o:p></o:p></p>
<p class="MsoNormal">// Plot all dots as separate polylines, each having just one point, in its own colour value.<o:p></o:p></p>
<p class="MsoNormal">// Dot size can be used instead of dot colour.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">for i = 1: size(dots, 'r') do<o:p></o:p></p>
<p class="MsoNormal"> param3d(dots(i, 1), dots(i, 2), dots(i, 3));<o:p></o:p></p>
<p class="MsoNormal"> pl = gce();<o:p></o:p></p>
<p class="MsoNormal"> pl.line_mode = 'off';<o:p></o:p></p>
<p class="MsoNormal"> pl.mark_mode = 'on';<o:p></o:p></p>
<p class="MsoNormal"> pl.mark_size_unit = 'point';<o:p></o:p></p>
<p class="MsoNormal"> pl.mark_size = 10; // Using dot colour to display the dependent variable<o:p></o:p></p>
<p class="MsoNormal"> pl.mark_foreground = dots(i, 4);<o:p></o:p></p>
<p class="MsoNormal">// pl.mark_size = dots(i, 4); // Using dot size to display the dependent variable<o:p></o:p></p>
<p class="MsoNormal">// pl.mark_foreground = size(cmap, 'r') - 1;<o:p></o:p></p>
<p class="MsoNormal">end<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">//*******************************************************************************<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><b><span style="font-size:12.0pt;font-family:"Arial",sans-serif;color:#231F20;mso-fareast-language:EN-GB">Adrian Weeks.<o:p></o:p></span></b></p>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Arial",sans-serif;mso-fareast-language:EN-GB">Engineer, Hardware Engineering EMEA.<br>
Office: +44 (0) 2920 528500 | Direct: +44 (0) 2920 528523 <br>
Email: aweeks@hidglobal.com</span><span style="mso-fareast-language:EN-GB"><br>
<br>
</span><a href="http://www.hidglobal.com/"><span style="color:#05549C;mso-fareast-language:EN-GB;text-decoration:none"><img border="0" width="234" height="36" style="width:2.4375in;height:.375in" id="Picture_x0020_1" src="cid:image001.gif@01D4B48C.497013D0" alt="HID Global Logo"></span></a><span style="mso-fareast-language:EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Arial",sans-serif;color:#7F7F7F;mso-fareast-language:EN-GB">HID Global, 3 Cae Gwrydd, Green Meadow Springs, Cardiff, CF15 7AB , United Kingdom<br>
</span></b><span style="font-size:10.0pt;font-family:"Arial",sans-serif;mso-fareast-language:EN-GB"><a href="http://www.hidglobal.com/"><span style="color:#05549C">www.hidglobal.com</span></a></span><span style="mso-fareast-language:EN-GB"><o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>