我想生成一个背景色为rgb颜色的三角形。这用于显示颜色值。
我可以找到如何计算这样一个三角形中的位置
function [x,y] = RGBtoCartCoordXY(R, G, B)
RGB = R + G + B;
r = R / RGB; g = G / RGB; b = B / RGB;
XYr = [-0.5; -0.5]; XYb = [+0.5; -0.5]; XYg = [+0.0; +0.5];
xy = (r * XYr + b * XYb + g * XYg) / ( r + g + b );
x = xy(1); y = xy(2);
但我在绘图中用点绘制这样一个三角形的方法并不是很成功,并且需要很长时间才能获得有用的点数(此处> 100000)
好像这些点有阴影,我想在背景中没有空白区域。我希望这个情节尽可能快,因为我想在顶部绘制一条简单的曲线 - 这是情节中的实际信息。 编辑:
该图基于以下代码:
for r = linspace(0,1,points)
for g = linspace(0,1,points)
for b = linspace(0,1,points)
index = index + 1;
RBGtriple(index, :) = [r g b];
end
end
end
for k = 1:size(RBGtriple,1)
R = RBGtriple(k,1);
G = RBGtriple(k,2);
B = RBGtriple(k,3);
[x y] = RGBtoCartCoordXY(R,G,B);
xaxis(k) = x;
data(k) = y;
end
hold on;
for k = 1:size(RBGtriple,1)
hplot = plot (xaxis(k), data(k));
set(hplot, ...
'Marker', 'square', ...
'LineStyle','none' , ...
'MarkerSize' ,3 , ...
'LineWidth' , 0.1, ...
'MarkerEdgeColor',RBGtriple(k, :) , ...
'MarkerFaceColor',RBGtriple(k, :));
end
hold off;
答案 0 :(得分:3)
如果想要为平面中的所有点设置颜色值,为什么不对每个点计算颜色值,而是采用颜色值并计算应该出现的点?显然,你的颜色输入值都不会产生xy
[ - 49, - 。49],因此[-.5, - 。5]中的红色标记在其区域中是唯一的。
此外,您正在连续绘制各个点,这当然不是很快。 (在你发布的代码的前三分之二中,你的循环内部有矩阵增长,但我猜最慢的部分是最后一部分)。尝试创建要首先显示的值的矩阵,然后显示它。
试试这段代码:
imgsize = 500;
for i=1:length(xaxis),
m(1+floor((xaxis+0.5)*imgsize),1+floor((data+0.5)*imgsize),:)=RGBtriple(i,:);
end
image(m);
对我来说,这个(或类似的代码改编自你的)会产生一个颜色分布相似的三角形,但是转向90°,并带有默认的黑色背景。
答案 1 :(得分:0)
如果有人想知道它,我在书中使用MATLAB'计算色彩科学找到了一个非常简单的解决方案。绘制RGB三角形:
xy=[0 0; 1 0; 0.5 sqrt(3)/2];
col=[1 0 0; 0 1 0; 0 0 1];
patch('Vertices',xy, 'Faces',[1:size(xy,1)], 'EdgeColor','none','FaceVertexCData', col,'FaceColor','interp');
axis off
text(xy(1,1), xy(1,2)-0.05,'Vertice 1','HorizontalAlignment', 'center')
text(xy(2,1), xy(2,2)-0.05,'Vertice 2','HorizontalAlignment', 'center')
text(xy(3,1), xy(3,2)+0.05,'Vertice 3','HorizontalAlignment', 'center')