samer@0: % mt_calibrate - Set spatial calibration of melody triangle system. samer@0: % samer@0: % mt_calibrate :: samer@0: % mt_system ~'system to calibrate', samer@0: % I:[[1,E]->[3]] ~'list triangle corners being updated', samer@0: % P:[[3,E]] ~'X-Y coordinates of the E corners being updated' samer@0: % -> mt_system ~'calibrated system'. samer@0: samer@0: function Sys=mt_calibrate(Sys,I,PI) samer@0: samer@0: if nargin>2, Sys.refpoints(:,I) = PI; end samer@0: P = Sys.refpoints; samer@2: fprintf('\nCalibrating for triangle vertices at:\n'); disp(P); samer@0: p0 = P(:,1); samer@3: [Sys.map, Sys.revmap] = info_map_fn(p0,P(:,2:3)-repmat(p0,1,2)); samer@0: end samer@0: samer@3: function [f,g]=info_map_fn(p0,M) samer@3: iM=inv(M); samer@3: f=@(p)clip_tri(iM*(p-p0)); samer@3: g=@(p)p0+M*p; samer@0: end samer@0: samer@0: function x=clip_tri(x) samer@0: if x(2)<0 samer@0: x(2)=0; samer@0: if x(1)<0, x(1)=0; samer@0: elseif x(1)>1, x(1)=1; samer@0: end samer@0: elseif x(1)<0 samer@0: x(1)=0; samer@0: if x(2)<0, x(2)=1; samer@0: elseif x(2)>1, x(2)=1; samer@0: end samer@0: else samer@0: d = [1,1]*x - 1; samer@0: if d>0 samer@0: x = x - d/2; samer@0: if x(1)<0, x=[0;1]; samer@0: elseif x(2)<0, x=[1;0]; samer@0: end samer@0: end samer@0: end samer@0: end samer@0: