63 lines
1.8 KiB
Plaintext
63 lines
1.8 KiB
Plaintext
import getLineVector from './getLineVector'
|
|
|
|
/**
|
|
* Update the perpendicular line handles when the measurement is being created.
|
|
* This method will make the perpendicular line intersect in the middle of the
|
|
* long line and assume half the size of the long line.
|
|
*
|
|
* @param {*} eventData Data object associated with the event
|
|
* @param {*} measurementData Data from current bidirectional tool measurement
|
|
*
|
|
* @returns {boolean} False in case the handle is not locked or true when moved
|
|
*/
|
|
export default function updatePerpendicularLineHandles(
|
|
eventData,
|
|
measurementData
|
|
) {
|
|
if (!measurementData.handles.perpendicularStart.locked) {
|
|
return false
|
|
}
|
|
|
|
let startX, startY, endX, endY
|
|
|
|
const { start, end } = measurementData.handles
|
|
const { columnPixelSpacing = 1, rowPixelSpacing = 1 } = eventData.image
|
|
|
|
if (start.x === end.x && start.y === end.y) {
|
|
startX = start.x
|
|
startY = start.y
|
|
endX = end.x
|
|
endY = end.y
|
|
} else {
|
|
// Mid point of long-axis line
|
|
const mid = {
|
|
x: (start.x + end.x) / 2,
|
|
y: (start.y + end.y) / 2
|
|
}
|
|
|
|
// Inclination of the perpendicular line
|
|
const vector = getLineVector(
|
|
columnPixelSpacing,
|
|
rowPixelSpacing,
|
|
start,
|
|
end
|
|
)
|
|
|
|
const perpendicularLineLength = vector.length / 2
|
|
const rowMultiplier = perpendicularLineLength / (2 * rowPixelSpacing)
|
|
const columnMultiplier = perpendicularLineLength / (2 * columnPixelSpacing)
|
|
|
|
startX = mid.x + columnMultiplier * vector.y
|
|
startY = mid.y - rowMultiplier * vector.x
|
|
endX = mid.x - columnMultiplier * vector.y
|
|
endY = mid.y + rowMultiplier * vector.x
|
|
}
|
|
|
|
measurementData.handles.perpendicularStart.x = startX
|
|
measurementData.handles.perpendicularStart.y = startY
|
|
measurementData.handles.perpendicularEnd.x = endX
|
|
measurementData.handles.perpendicularEnd.y = endY
|
|
|
|
return true
|
|
}
|