/** * Convert OOXML arc specification to SVG path arc command. * Based on PPTXjs shapeArc() implementation. * * @param cx - Center X coordinate * @param cy - Center Y coordinate * @param rx - Horizontal radius * @param ry - Vertical radius * @param startAngle - Start angle in degrees * @param endAngle - End angle in degrees * @param isClose - Whether to close the path with Z * @returns SVG path string for the arc */ export function shapeArc( cx: number, cy: number, rx: number, ry: number, startAngle: number, endAngle: number, isClose: boolean ): string { const startRad = (startAngle * Math.PI) / 180 const endRad = (endAngle * Math.PI) / 180 const x1 = cx + rx * Math.cos(startRad) const y1 = cy + ry * Math.sin(startRad) const x2 = cx + rx * Math.cos(endRad) const y2 = cy + ry * Math.sin(endRad) // OOXML convention: always sweep clockwise from startAngle to endAngle. // Compute the clockwise sweep in degrees, handling angle wrapping. let sweepDeg = (((endAngle - startAngle) % 360) + 360) % 360 if (sweepDeg === 0 && startAngle !== endAngle) sweepDeg = 360 const largeArc = sweepDeg > 180 ? 1 : 0 const sweep = 1 // always clockwise let d = `M${x1},${y1} A${rx},${ry} 0 ${largeArc},${sweep} ${x2},${y2}` if (isClose) { d += ' Z' } return d }