@minofrk/xelto-diagram-canvas
Version:
An implementation of <xelto-diagram> in TypeScript.
49 lines (42 loc) • 1.35 kB
text/typescript
import { LeftTopAlignedArea, Point, CenterAlignedArea } from '../../types';
import { getScales } from '../scale';
import {
plus,
minus,
times,
square,
floor,
elementWiseTimes,
} from '../../point-ops';
export default function getPhysicalValues(
virtualArea: LeftTopAlignedArea,
canvasSize: Point,
): LeftTopAlignedArea & CenterAlignedArea & { lineWidth: number } {
const physicalScale = getScales(canvasSize);
const rawSize = elementWiseTimes(virtualArea.size, physicalScale);
const rawHalfWidth = times(minus(rawSize, square(1)), 1 / 2);
const rawCenter = plus(
elementWiseTimes(virtualArea.leftTop, physicalScale),
rawHalfWidth,
);
const lineWidth = Math.max(
1,
Math.ceil(Math.max(physicalScale.x, physicalScale.y) / 15),
);
const gapSize = square(Math.floor(lineWidth - 1) / 2);
const intLeftTop = plus(
plus(floor(minus(rawCenter, rawHalfWidth)), square(1 / 2)),
gapSize,
);
const intRightBottom = minus(
plus(floor(plus(rawCenter, rawHalfWidth)), square(1 / 2)),
gapSize,
);
const intSize = minus(intRightBottom, intLeftTop);
return {
leftTop: times(intSize, -1 / 2),
center: times(plus(intLeftTop, intRightBottom), 1 / 2),
size: intSize,
lineWidth,
};
}