C#中如何反转通过数组构建的SVG曲线
SVG相对贝塞尔弧反转解决方案
首选无额外反转函数方案
你之前直接调用生成函数的思路正确,仅缺失固定圆心的参数,伪代码修正逻辑:
- 先调用一次原生成函数获取计算得到的圆心坐标
(xCenter, yCenter) - 生成反向弧时传入参数:
- 起始角度:
(StartAngle + SweepAngle) % (2 * Math.PI) - 扫过角度:保持原
SweepAngle不变 - 方向参数:
!Clockwise - 显式传入上一步得到的
(xCenter, yCenter),禁止函数自动计算圆心
该方案无需额外数组处理逻辑,避免坐标转换误差。
- 起始角度:
相对路径三次贝塞尔曲线反转通用逻辑
如果需要手动实现数组反转,遵循以下步骤即可:
- 坐标统一转绝对
你原生成函数输出的数组arcArray[2,4]的坐标属性:
arcArray[0,0]/arcArray[1,0]:贝塞尔起点绝对坐标S(Sx, Sy)arcArray[0,1]/arcArray[1,1]:第一个控制点相对起点的偏移(CP1x_rel, CP1y_rel),对应绝对坐标CP1(Sx + CP1x_rel, Sy + CP1y_rel)arcArray[0,2]/arcArray[1,2]:第二个控制点的绝对坐标CP2(CP2x, CP2y)(注意这里是生成函数的特殊输出,不是相对偏移)arcArray[0,3]/arcArray[1,3]:终点相对起点的偏移(Ex_rel, Ey_rel),对应绝对坐标E(Sx + Ex_rel, Sy + Ey_rel)
- 反转点序
反向贝塞尔的点顺序为E → CP2 → CP1 → S - 转回相对坐标
反向贝塞尔的起点为E,所有坐标转成相对E的偏移:
新数组[0,0] = 0, 新数组[1,0] = 0 // 相对当前起点偏移为0 新数组[0,1] = CP2.x - E.x 新数组[1,1] = CP2.y - E.y 新数组[0,2] = CP1.x - E.x 新数组[1,2] = CP1.y - E.y 新数组[0,3] = S.x - E.x 新数组[1,3] = S.y - E.y
原有反转函数错误原因
你之前的实现未处理生成函数输出中[*,2]是绝对坐标的特殊逻辑,直接用相对原起点的偏移与原终点绝对坐标做减法,导致控制点出现全局偏移。
内容的提问来源于stack exchange,提问作者Human Interface Device
相关产品推荐
相关产品推荐

