www.gusucode.com > optim 案例源码 matlab代码程序 > optim/plotChimneyStacks.m

    function plotChimneyStacks(h, titleStr)
%PLOTCHIMNEYSTACKS Plot chimney stacks for air pollution example
%
%   PLOTCHIMNEYSTACKS(H) plots the chimney stacks for the air pollution
%   example at the specified heights. 
%
%   PLOTCHIMNEYSTACKS(H, TITLESTR) additionally sets the title of the plot.
%
%   See also PLOTSULFURDIOXIDE

%   Copyright 2008 The MathWorks, Inc.

% Create a figure and axes
hFig = figure('Color', 'w');
regDim = 4000;
hAx = axes('Parent', hFig, 'xGrid', 'on', 'yGrid', 'off', 'zGrid', 'off');

% Plot the ground
xx = [-regDim regDim];
[XX,YY] = meshgrid(xx);
ground = zeros(size(XX));
surf(hAx, XX, YY, ground, ...
    'facecolor', 'g', 'facealpha', 0.6, 'edgecolor','none');
view(hAx, [-20 30]);
set(hAx, 'XLim', [-regDim, regDim], 'YLim', [-regDim, regDim], ...
    'ZLim', [0 1.1*max(h)]);

% Labels and title
xlabel('x (m)');
ylabel('y (m)');
zlabel('Stack Height (m)');
if nargin > 1
    title(titleStr);
else
    title('Chimney stack height');
end

% Chimney locations
xpos = [-3000,-2600,-1100,1000,1000,2700,3000,-2000,0,1500];
ypos = [-2500,-300,-1700,-2500,2200,1000,-1600,2500,0,-1600];

% Number of chimneys
nChimneys = length(xpos);

% Chimney colors
brown = [139 69 19];
brown = brown/255;

% Plot the chimneys
rad = 140;
nPts = 51;
[x,y,z] = cylinder(rad, nPts);
tol = 0.02*rad;
for i = 1:nChimneys
    
    % Cylinder coordinates
    xCyl = x+xpos(i);
    yCyl = y+ypos(i);
    zCyl = h(i)*z;
    
    % Draw the cylinder
    surface(xCyl, yCyl, zCyl, ...
        'facecolor', brown,...
        'linestyle', 'none', ...
        'Parent', hAx);
    
    % Add edges of the cylinder
    hL1 = line([xpos(i)+rad+tol; xpos(i)+rad+tol], [ypos(i); ypos(i)], zCyl, ...
        'linewidth', 2, ...
        'color', 'k');
    hL2 = line([xpos(i)-rad-tol; xpos(i)-rad-tol], [ypos(i); ypos(i)], zCyl, ...
        'linewidth', 2, ...
        'color', 'k');
    
    % Add line around the top of the cylinder
    hL3 = line(xCyl(2, :), yCyl(2, :), zCyl(2, :), ...
        'linewidth', 1, ...
        'color', 'k');
    
    % Add line around the bottom of the cylinder
    idxSt = (nPts+1)/2 + 1;
    hL4 = line(xCyl(1, idxSt:end), yCyl(1, idxSt:end), zCyl(1, idxSt:end), ...
        'linewidth', 1, ...
        'color', 'k');

    % Bring lines to the top of the graphical stack and send ground to
    % bottom
    uistack([hL1; hL2; hL3; hL4], 'top');
    
end