ohif-viewer/Packages/ohif-lesiontracker/client/lib/bidirectional/repositionBidirectionalArmHandle.js

66 lines
2.5 KiB
JavaScript

import { _ } from 'meteor/underscore';
import { OHIF } from 'meteor/ohif:core';
// Return the newPosition for the handle based on the mmStep and handles
export default function(image, handles, handleKey, mmStep, mmLimit=1) {
if (handleKey === 'textBox') return;
const lib = OHIF.lesiontracker.bidirectional;
// Defines how much the arm will increase/decrease
const columnPixelSpacing = (image && image.columnPixelSpacing) || 1;
const rowPixelSpacing = (image && image.rowPixelSpacing) || 1;
const stepX = mmStep * (1 / columnPixelSpacing);
const stepY = mmStep * (1 / rowPixelSpacing);
// Get the line angle and its handles
const keyA = handleKey;
const keyB = lib.inverseKeyMap[handleKey];
const handleA = handles[keyA];
const handleB = handles[keyB];
const angle = Math.atan2(handleA.y - handleB.y, handleA.x - handleB.x);
// Calculate the new position of the handle
const newPosition = {
x: handleA.x + Math.cos(angle) * stepX,
y: handleA.y + Math.sin(angle) * stepY
};
if (mmStep < 0) {
// Get the perpendicular handles
const keyC = lib.perpendicularKeyMap[keyA];
const keyD = lib.perpendicularKeyMap[keyB];
const handleC = handles[keyC];
const handleD = handles[keyD];
// Create the line segment for the arm being resized
const lineAB = {
start: _.pick(handleA, ['x', 'y']),
end: _.pick(handleB, ['x', 'y'])
};
// Create the line segment for the perpendicular arm
const lineCD = {
start: _.pick(handleC, ['x', 'y']),
end: _.pick(handleD, ['x', 'y'])
};
// Get the intersection point between the arms
const intersection = cornerstoneMath.lineSegment.intersectLine(lineAB, lineCD);
// Keep the minimum distance of 0.1 mm to the intersection point
const dx = (intersection.x - newPosition.x) * columnPixelSpacing;
const dy = (intersection.y - newPosition.y) * rowPixelSpacing;
const distance = Math.sqrt((dx * dx) + (dy * dy));
const newAngle = Math.atan2(newPosition.y - intersection.y, newPosition.x - intersection.x);
if (angle.toFixed(8) !== newAngle.toFixed(8) || distance < Math.abs(mmLimit)) {
Object.assign(newPosition, {
x: intersection.x - Math.cos(angle) * mmLimit * Math.sign(stepX),
y: intersection.y - Math.sin(angle) * mmLimit * Math.sign(stepY)
});
}
}
return newPosition;
}