|
回复 楼主 hitzk 的帖子
这个问题好像是不能通过更改Figre Properties来实现的。下面的程序可以实现这个功能,不过是先按照图像处理的方法来做的。
主函数
- function applyhatch(h,patterns,colorlist)
- %APPLYHATCH Apply hatched patterns to a figure
- % APPLYHATCH(H,PATTERNS) creates a new figure from the figure H by
- % replacing distinct colors in H with the black and white
- % patterns in PATTERNS. The format for PATTERNS can be
- % a string of the characters '/', '\', '|', '-', '+', 'x', '.'
- % a cell array of matrices of zeros (white) and ones (black)
- %
- % APPLYHATCH(H,PATTERNS,COLORS) maps the colors in the n by 3
- % matrix COLORS to PATTERNS. Each row of COLORS specifies an RGB
- % color value.
- %
- % Note this function makes a bitmap image of H and so is limited
- % to low-resolution, bitmap output.
- %
- % Example 1:
- % bar(rand(3,4));
- % applyhatch(gcf,'\-x.');
- %
- % Example 2:
- % colormap(cool(6));
- % pie(rand(6,1));
- % legend('Jan','Feb','Mar','Apr','May','Jun');
- % applyhatch(gcf,'|-+.\/',cool(6));
- %
- % See also: MAKEHATCH
- % By Ben Hinkle, bhinkle@mathworks.com
- % This code is in the public domain.
-
- oldppmode = get(h,'paperpositionmode');
- oldunits = get(h,'units');
- set(h,'paperpositionmode','auto');
- set(h,'units','pixels');
- figsize = get(h,'position');
- if nargin == 2
- colorlist = [];
- end
- bits = hardcopy(h,'-dzbuffer','-r0');
- set(h,'paperpositionmode',oldppmode);
- bwidth = size(bits,2);
- bheight = size(bits,1);
- bsize = bwidth * bheight;
- if ~isempty(colorlist)
- colorlist = uint8(255*colorlist);
- [colors,colori] = nextnonbw(0,colorlist,bits);
- else
- colors = (bits(:,:,1) ~= bits(:,:,2)) | ...
- (bits(:,:,1) ~= bits(:,:,3));
- end
- pati = 1;
- colorind = find(colors);
- while ~isempty(colorind)
- colorval(1) = bits(colorind(1));
- colorval(2) = bits(colorind(1)+bsize);
- colorval(3) = bits(colorind(1)+2*bsize);
- if iscell(patterns)
- pattern = patterns{pati};
- elseif isa(patterns,'char')
- pattern = makehatch(patterns(pati));
- else
- pattern = patterns;
- end
- pattern = uint8(255*(1-pattern));
- pheight = size(pattern,2);
- pwidth = size(pattern,1);
- ratioh = ceil(bheight/pheight);
- ratiow = ceil(bwidth/pwidth);
- bigpattern = repmat(pattern,[ratioh ratiow]);
- if ratioh*pheight > bheight
- bigpattern(bheight+1:end,:) = [];
- end
- if ratiow*pwidth > bwidth
- bigpattern(:,bwidth+1:end) = [];
- end
- bigpattern = repmat(bigpattern,[1 1 3]);
- color = (bits(:,:,1) == colorval(1)) & ...
- (bits(:,:,2) == colorval(2)) & ...
- (bits(:,:,3) == colorval(3));
- color = repmat(color,[1 1 3]);
- bits(color) = bigpattern(color);
- if ~isempty(colorlist)
- [colors,colori] = nextnonbw(colori,colorlist,bits);
- else
- colors = (bits(:,:,1) ~= bits(:,:,2)) | ...
- (bits(:,:,1) ~= bits(:,:,3));
- end
- colorind = find(colors);
- pati = (pati + 1);
- if pati > length(patterns)
- pati = 1;
- end
- end
- newfig = figure('units','pixels','visible','off');
- imaxes = axes('parent',newfig,'units','pixels');
- im = image(bits,'parent',imaxes);
- fpos = get(newfig,'position');
- set(newfig,'position',[fpos(1:2) figsize(3) figsize(4)+1]);
- set(imaxes,'position',[0 0 figsize(3) figsize(4)+1],'visible','off');
- set(newfig,'visible','on');
- function [colors,out] = nextnonbw(ind,colorlist,bits)
- out = ind+1;
- colors = [];
- while out <= size(colorlist,1)
- if isequal(colorlist(out,:),[255 255 255]) | ...
- isequal(colorlist(out,:),[0 0 0])
- out = out+1;
- else
- colors = (colorlist(out,1) == bits(:,:,1)) & ...
- (colorlist(out,2) == bits(:,:,2)) & ...
- (colorlist(out,3) == bits(:,:,3));
- return
- end
- end
复制代码 需调用的函数
- function A = makehatch(hatch)
- %MAKEHATCH Predefined hatch patterns
- % MAKEHATCH(HATCH) returns a matrix with the hatch pattern for HATCH
- % according to the following table:
- % HATCH pattern
- % ------- ---------
- % / right-slanted lines
- % \ left-slanted lines
- % | vertical lines
- % - horizontal lines
- % + crossing vertical and horizontal lines
- % x criss-crossing lines
- % . single dots
- %
- % See also: APPLYHATCH
- % By Ben Hinkle, bhinkle@mathworks.com
- % This code is in the public domain.
- n = 6;
- A=zeros(n);
- switch (hatch)
- case '/'
- A = fliplr(eye(n));
- case '\'
- A = eye(n);
- case '|'
- A(:,1) = 1;
- case '-'
- A(1,:) = 1;
- case '+'
- A(:,1) = 1;
- A(1,:) = 1;
- case 'x'
- A = eye(n) | fliplr(diag(ones(n-1,1),-1));
- case '.'
- A(1:2,1:2)=1;
- otherwise
- error(['Undefined hatch pattern "' hatch '".']);
- end
复制代码 这个就是注释中例子的效果图。 |
-
评分
-
1
查看全部评分
-
|