2015-07-20 60 views
2

我一直試圖在MATLAB中將HSV顏色空間建模到圓柱體上,但迄今爲止失敗了。我已經看過Modeling HSV Color Space in MATLAB,這對理解紋理貼圖非常有幫助,但是當我創建一個圓柱體並將它的X,Y和Z座標輸入到surf()時,我會得到一個開放的圓柱體。有沒有辦法生成一個可以輸入到surf()中的X,Y,Z座標的閉合圓柱體?下面是我一直在努力,因此到目前爲止,(非常類似於鏈接)代碼:在MATLAB中對HSV顏色空間圓柱體進行建模

clear; 
clc; 
close all; 

spSize = 500; 

% linspace(a,b,s) creates a vector with s values equally spaced from a 
% to b 
% repmat repeats a vector x*y times 
H = repmat(linspace(0,1,spSize),spSize,1);      % spSize-by-spSize hues 
% the spSize-value vector generated by linspace(0,1,spSize) is copied spSize times 
% one under the other, resulting in a spSize x spSize array: 
% 
%  1   2   3   spSize 
% 1 (0,0)  (0,.001)  (0,.002) ... (0,1) 
% 2 (.001,0) (.001,.001) (.001,.002) ... (.001,1) 
% ... 
% spSize (1,0)  (.001,1)  (.002,1) ... (1,1) 

S = repmat([linspace(0,1,spSize/2) linspace(1,0,spSize/2)].',1,spSize); % spSize-by-spSize saturations 
% same for the saturation. Because the saturation goes from 1 to 0 to 1, we 
% need first a vector that goes from 1 to 0 and a second from 0 to 1 
% ([linspace(0,1,spSize/2) linspace(1,0,spSize/2)]). The ' turnes the vector in a 
% row into a vector in a column. 

V = repmat([ones(1,spSize/2) linspace(1,0,spSize/2)].',1,spSize);  % spSize-by-spSize values 
% same procedure for the intensity. Because we map a picture on a 3D-shape, 
% one part of the picture has to indicate the colors of the top of the cone 
% (i.e., the color wheel) - that is the first part of the vector 
% (ones(1,spSize/2)) than we need to reduce the intensity to generate the rest of 
% the color for the rest for the rest of the cylinder surface. 

% Create an HSV image 
% once all three matrices ahave been independently generated, merge them 
% into a single 3-D matrix 
hsvImage = cat(3,H,S,V); 

% Convert it to an RGB image 
C = hsv2rgb(hsvImage); 

% Generate cylinder with XYZ coordinates 
[X,Y,Z] = cylinder(250); 
Z = Z * 400; 

% Finally, plot the texture-mapped surface 
figure; 
surf(X,Y,Z,C,'FaceColor','texturemap','EdgeColor','none'); 
axis equal 

回答

1

您需要添加一箇中心點爲您缸的頂部,這樣質地的一半可以在頂部被映射表面和一半的側面。你也必須翻轉你的Z座標。以下是如何產生的氣缸座標:

[X, Y, Z] = cylinder(250); 
X = [zeros(1, 21); X]; 
Y = [zeros(1, 21); Y]; 
Z = 400.*Z([2 2 1], :); 
figure; 
surf(X, Y, Z, C, 'FaceColor', 'texturemap', 'EdgeColor', 'none'); 
axis equal 

,你應該得到這樣的情節:

enter image description here

+0

耶!來自gnovice的回答! – rayryeng