function callbackClickARectangleLowerRight(src, eventData, pointCloud)
% CALLBACKCLICKARECTANGLELOWERRIGTH mouse click callback function for
% GETRMATRIX
%
% The transformation between the viewing frame and the point cloud frame
% is calculated using the camera viewing direction and the 'up' vector.
% Then, the point cloud is transformed into the viewing frame. Finally,
% the z coordinate in this frame is ignored and the x and y coordinates
% of all the points are compared with the mouse click location and the
% closest point is selected.
% SELECTEDPOINT cointains the points within the plane formed by
% UPPERLEFTINDEX and LOWERRIGHTINDEX.
%
% by Gemma Parra using the functions developed by Babak Taati File ID:
% #7594
% June 5, 2012
global UpperLeftIndex
global LowerRightIndex
global selectedPoint
point = get(gca, 'CurrentPoint'); % mouse click position
camPos = get(gca, 'CameraPosition'); % camera position
camTgt = get(gca, 'CameraTarget'); % where the camera is pointing to
camDir = camPos - camTgt; % camera direction
camUpVect = get(gca, 'CameraUpVector'); % camera 'up' vector
% build an orthonormal frame based on the viewing direction and the
% up vector (the "view frame")
zAxis = camDir/norm(camDir);
upAxis = camUpVect/norm(camUpVect);
xAxis = cross(upAxis, zAxis);
yAxis = cross(zAxis, xAxis);
rot = [xAxis; yAxis; zAxis]; % view rotation
% the point cloud represented in the view frame
rotatedPointCloud = rot * pointCloud;
% the clicked point represented in the view frame
rotatedPointFront = rot * point' ;
% find the nearest neighbour to the clicked point
pointCloudIndex = dsearchn(rotatedPointCloud(1:2,:)', ...
rotatedPointFront(1:2));
h = findobj(gca,'Tag','pt'); % try to find the old point
selectedPoint = pointCloud(:, pointCloudIndex);
if isempty(h) % if it's the first click (i.e. no previous point to delete)
% highlight the selected point
h = plot3(selectedPoint(1,:), selectedPoint(2,:), ...
selectedPoint(3,:), 'g.', 'MarkerSize', 20);
set(h,'Tag','pt'); % set its Tag property for later use
else % if it is not the first click
delete(h); % delete the previously selected point
% highlight the newly selected point
h = plot3(selectedPoint(1,:), selectedPoint(2,:), ...
selectedPoint(3,:), 'g.', 'MarkerSize', 20);
set(h,'Tag','pt'); % set its Tag property for later use
end
LowerRightIndex = pointCloudIndex;
pointsWithinRectangleIndex = rotatedPointCloud(1,:) > rotatedPointCloud(1, UpperLeftIndex) & ...
rotatedPointCloud(1,:) < rotatedPointCloud(1, LowerRightIndex) & ...
rotatedPointCloud(2,:) < rotatedPointCloud(2, UpperLeftIndex) & ...
rotatedPointCloud(2,:) > rotatedPointCloud(2, LowerRightIndex);
selectedPoint = pointCloud(:, pointsWithinRectangleIndex);
hold on
plot3(selectedPoint(1,:), selectedPoint(2,:), selectedPoint(3,:), 'm.', 'MarkerSize', 20);