export const get_coordinates_of_clicked_image = ( | |
evt: MouseEvent | |
): [number, number] | null => { | |
let image; | |
if (evt.currentTarget instanceof Element) { | |
image = evt.currentTarget.querySelector("img") as HTMLImageElement; | |
} else { | |
return [NaN, NaN]; | |
} | |
const imageRect = image.getBoundingClientRect(); | |
const xScale = image.naturalWidth / imageRect.width; | |
const yScale = image.naturalHeight / imageRect.height; | |
if (xScale > yScale) { | |
const displayed_height = image.naturalHeight / xScale; | |
const y_offset = (imageRect.height - displayed_height) / 2; | |
var x = Math.round((evt.clientX - imageRect.left) * xScale); | |
var y = Math.round((evt.clientY - imageRect.top - y_offset) * xScale); | |
} else { | |
const displayed_width = image.naturalWidth / yScale; | |
const x_offset = (imageRect.width - displayed_width) / 2; | |
var x = Math.round((evt.clientX - imageRect.left - x_offset) * yScale); | |
var y = Math.round((evt.clientY - imageRect.top) * yScale); | |
} | |
if (x < 0 || x >= image.naturalWidth || y < 0 || y >= image.naturalHeight) { | |
return null; | |
} | |
return [x, y]; | |
}; | |