type Coordinates = { x: number | null; y: number | null; }; type CreatePolylineType = ( penCoordinates: Coordinates, color: string, opacity: number, strokeWidth: number, ) => SVGPolylineElement; type CompletePathType = ( pathElement: SVGPolylineElement | null, penCoordinates: Coordinates, ) => void; export const createPolyline: CreatePolylineType = ( penCoordinates, color, opacity, strokeWidth, ) => { const path = document.createElementNS( 'http://www.w3.org/2000/svg', 'polyline', ); path.setAttribute('fill', 'none'); path.setAttribute('stroke', color); path.setAttribute('stroke-width', strokeWidth.toString()); path.setAttribute('stroke-opacity', (opacity * 0.01).toString()); path.setAttribute('points', `${penCoordinates.x},${penCoordinates.y}`); return path; }; export const completePath: CompletePathType = (pathElement, penCoordinates) => { if (pathElement && penCoordinates.x) { let points = pathElement.getAttribute('points') || ''; points += ` ${penCoordinates.x},${penCoordinates.y}`; pathElement.setAttribute('points', points); } }; export const pointCalc = ( _points: PointType[][], h: number, s: number, ): PointType[][] => { const reducer = _points.reduce( (acc: PointType[][], cur: PointType[]): PointType[][] => { const p = cur.map((point: PointType) => ({ x: point.x * s, y: h - point.y * s, })); acc.push(p); return acc; }, [], ); return reducer; }; export const rectCalcWithPoint = ( pointsGroup: PointType[][], borderWidth: number, ): HTMLCoordinateType => { const xArray: number[] = []; const yArray: number[] = []; pointsGroup[0].forEach((point: PointType) => { xArray.push(point.x); yArray.push(point.y); }); const top = Math.min(...yArray); const left = Math.min(...xArray); const bottom = Math.max(...yArray); const right = Math.max(...xArray); return { top, left, width: right - left + borderWidth, height: bottom - top + borderWidth, }; }; export const calcViewBox = ( { top, left, width, height }: HTMLCoordinateType, borderWidth: number, ): string => { const distance = borderWidth / 2; return ` ${left - distance} ${top - distance} ${width + distance} ${height + distance} `; };