UNPKG

ol

Version:

OpenLayers mapping library

158 lines (151 loc) 4.03 kB
/** * @module ol/geom/flat/transform */ /** * @param {Array<number>} flatCoordinates Flat coordinates. * @param {number} offset Offset. * @param {number} end End. * @param {number} stride Stride. * @param {import("../../transform.js").Transform} transform Transform. * @param {Array<number>} [dest] Destination. * @param {number} [destinationStride] Stride of destination coordinates; if unspecified, assumed to be 2. * @return {Array<number>} Transformed coordinates. */ export function transform2D( flatCoordinates, offset, end, stride, transform, dest, destinationStride, ) { dest = dest ? dest : []; destinationStride = destinationStride ? destinationStride : 2; 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]; for (let k = 2; k < destinationStride; k++) { dest[i++] = flatCoordinates[j + k]; } } if (dest && dest.length != i) { dest.length = i; } return dest; } /** * @param {Array<number>} flatCoordinates Flat coordinates. * @param {number} offset Offset. * @param {number} end End. * @param {number} stride Stride. * @param {number} angle Angle. * @param {Array<number>} anchor Rotation anchor point. * @param {Array<number>} [dest] Destination. * @return {Array<number>} 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<number>} 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<number>} anchor Scale anchor point. * @param {Array<number>} [dest] Destination. * @return {Array<number>} 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<number>} 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<number>} [dest] Destination. * @return {Array<number>} 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; }