File talk:Planckian-locus.png

From Wikimedia Commons, the free media repository
Jump to navigation Jump to search

MATLAB code[edit]

N=1000; % size of the image
x=linspace(0.1,0.45,N);      % area of interest
y=linspace(0.25,0.4,N*15/35);% area of interest
[u,v,Y]=meshgrid(x,y,50);
xyz=applycform(cat(3,u,v,Y),makecform('uvl2xyz'));
M=max(xyz,[],3);
srgb=applycform(xyz./cat(3,M,M,M),makecform('xyz2srgb'));
image(x,y,srgb);
axis image;
set(gca,'YDir','normal');   % right way up
hold;

[LAMBDA, XFCN, YFCN, ZFCN]=colorMatchFcn('Judd_Vos');
sl=applycform(cat(3,XFCN,YFCN,ZFCN),makecform('xyz2uvl'));
sl_loopx=[sl(:,:,1) sl(:,1,1)]; % make a closed polygon
sl_loopy=[sl(:,:,2) sl(:,1,2)]; % make a closed polygon
set(patch([0.45 0.1 0.1 0.45 sl_loopx 0.45],...
    [0.4 0.4 0.25 0.25 sl_loopy 0.25],[0.5 0.5 0.5]),'EdgeColor','none');
plot(sl_loopx,sl_loopy,'k-');   % k- means solid (-) black (k) line
axis([0.1 0.45 0.25 0.4]);
xlabel('u');
ylabel('v');
shg;
grid;

[lambda,T]=meshgrid(LAMBDA,[1e3:100:1.1e4 2.5e4 5e4 1e5 5e5 1e6]);
spd=lambda.^(-5)./(exp(1.4387752e+7./(lambda.*T))-1);
XYZbb=spd*[XFCN' YFCN' ZFCN'];
uvbb=applycform(XYZbb./(XYZbb(:,2)*[1 1 1]),makecform('xyz2uvl'));
plot(uvbb(:,1),uvbb(:,2),'Color',[0.5 0.5 0.5],'LineWidth',1.5);

xyz_wp=[ [1 1 1] ; ...
    whitepoint('a') ; ...
    whitepoint('c') ; ...
    whitepoint('d50') ; ...
    whitepoint('d55') ; ...
    whitepoint('d65') ];
uvl_wp=applycform(xyz_wp,makecform('xyz2uvl'));
plot(uvl_wp(:,1),uvl_wp(:,2),'xk');

slope=diff(uvbb(:,[1 2]));
for i=1:10:100
    xi=uvbb(i,1);
    yi=uvbb(i,2);
    a=-slope(i,1)/slope(i,2);
    l=0.05/sqrt(1+a^2);
    plot([xi-l xi+l],[yi-a*l yi+a*l],'Color',[0.5 0.5 0.5]);
end