antvis / util

utility library for AntV products.
MIT License
74 stars 28 forks source link

path-util 中计算三次贝塞尔曲线切线有误 #65

Closed xiaoiver closed 3 years ago

xiaoiver commented 3 years ago

以下计算切线方法未考虑控制点与起点/终点重合的情况:

// 起点与控制点1
segment.startTangent = [prePoint[0] - cp1[0], prePoint[1] - cp1[1]];
// 终点与控制点2
segment.endTangent = [currentPoint[0] - cp2[0], currentPoint[1] - cp2[1]];

导致计算水平直线时,会得到 [0, 0]['C', 100, 100, 100, 100, 200, 200]

正确做法应该是判定重合时,使用两个控制点计算:

if (segment.startTangent[0] === 0 && segment.startTangent[1] === 0) {
    segment.startTangent = [cp1[0] - cp2[0], cp1[1] - cp2[1]];
}
if (segment.endTangent[0] === 0 && segment.endTangent[1] === 0) {
    segment.endTangent = [cp2[0] - cp1[0], cp2[1] - cp1[1]];
}
xiaoiver commented 3 years ago

Fixed in v2.0.10