/** * @module ol/geom/flat/transform */ /** * @param {Array} flatCoordinates Flat coordinates. * @param {number} offset Offset. * @param {number} end End. * @param {number} stride Stride. * @param {import("../../transform.js").Transform} transform Transform. * @param {Array} [dest] Destination. * @return {Array} Transformed coordinates. */ export function transform2D( flatCoordinates, offset, end, stride, transform, dest ) { dest = dest ? dest : []; let i = 0; for (let j = offset; j < end; j += stride) { const x = flatCoordinates[j]; const y = flatCoordinates[j + 1]; dest[i++] = transform[0] * x + transform[2] * y + transform[4]; dest[i++] = transform[1] * x + transform[3] * y + transform[5]; } if (dest && dest.length != i) { dest.length = i; } return dest; } /** * @param {Array} flatCoordinates Flat coordinates. * @param {number} offset Offset. * @param {number} end End. * @param {number} stride Stride. * @param {number} angle Angle. * @param {Array} anchor Rotation anchor point. * @param {Array} [dest] Destination. * @return {Array} Transformed coordinates. */ export function rotate( flatCoordinates, offset, end, stride, angle, anchor, dest ) { dest = dest ? dest : []; const cos = Math.cos(angle); const sin = Math.sin(angle); const anchorX = anchor[0]; const anchorY = anchor[1]; let i = 0; for (let j = offset; j < end; j += stride) { const deltaX = flatCoordinates[j] - anchorX; const deltaY = flatCoordinates[j + 1] - anchorY; dest[i++] = anchorX + deltaX * cos - deltaY * sin; dest[i++] = anchorY + deltaX * sin + deltaY * cos; for (let k = j + 2; k < j + stride; ++k) { dest[i++] = flatCoordinates[k]; } } if (dest && dest.length != i) { dest.length = i; } return dest; } /** * Scale the coordinates. * @param {Array} flatCoordinates Flat coordinates. * @param {number} offset Offset. * @param {number} end End. * @param {number} stride Stride. * @param {number} sx Scale factor in the x-direction. * @param {number} sy Scale factor in the y-direction. * @param {Array} anchor Scale anchor point. * @param {Array} [dest] Destination. * @return {Array} Transformed coordinates. */ export function scale( flatCoordinates, offset, end, stride, sx, sy, anchor, dest ) { dest = dest ? dest : []; const anchorX = anchor[0]; const anchorY = anchor[1]; let i = 0; for (let j = offset; j < end; j += stride) { const deltaX = flatCoordinates[j] - anchorX; const deltaY = flatCoordinates[j + 1] - anchorY; dest[i++] = anchorX + sx * deltaX; dest[i++] = anchorY + sy * deltaY; for (let k = j + 2; k < j + stride; ++k) { dest[i++] = flatCoordinates[k]; } } if (dest && dest.length != i) { dest.length = i; } return dest; } /** * @param {Array} flatCoordinates Flat coordinates. * @param {number} offset Offset. * @param {number} end End. * @param {number} stride Stride. * @param {number} deltaX Delta X. * @param {number} deltaY Delta Y. * @param {Array} [dest] Destination. * @return {Array} Transformed coordinates. */ export function translate( flatCoordinates, offset, end, stride, deltaX, deltaY, dest ) { dest = dest ? dest : []; let i = 0; for (let j = offset; j < end; j += stride) { dest[i++] = flatCoordinates[j] + deltaX; dest[i++] = flatCoordinates[j + 1] + deltaY; for (let k = j + 2; k < j + stride; ++k) { dest[i++] = flatCoordinates[k]; } } if (dest && dest.length != i) { dest.length = i; } return dest; }