1.圆弧倒角
DVector2d vS = vecStart;
DVector2d vE = vecEnd;
if (vS.IsParallelTo(vE)) return ;
vS.NormalizeInPlace();
vE.NormalizeInPlace();
DVector2d vMid = vS + vE;
vMid.NormalizeInPlace();
Angle halfAngel = vS.AngleTo(vMid);
double sDis = R / Math.Tan(halfAngel.Radians);
double cDis = R / Math.Sin(halfAngel.Radians);
DVector2d ptCenter = ptInter + cDis * vMid;
DVector2d ptArcStart = ptInter + sDis * vS;
DVector2d ptArcEnd = ptInter + sDis * vE;
2.不规则倒角计算
In:ptInter,vecStart,vecEnd,vecHaunch
Out:ptStart,ptEnd
只要保证三个矢量方向正确就可以了
vecHaunch一定是从VecStart指向VecEnd
在函数构建好VecHaunch,这样就可以适用于各种方向了,如上图
if (vecStart.IsParallelTo(vecEnd))
return ;
double angInter = vecStart.AngleTo(vecEnd).Radians;
double angStart = Angle.PI.Radians - vecStart.AngleTo(vecHaunch).Radians;
double angEnd = vecEnd.AngleTo(vecHaunch).Radians;
// 已知,角A,B,C, 边a,求:b,c
// 根据公式:
// a/sinA = b/sinB = c/sinC
// b = a(sinB/sinA)
// c = a(sinC/sinA)
vecStart.NormalizeInPlace();
vecEnd.NormalizeInPlace();
double leng = vecHaunch.MagnitudeXY;
double lStart = Math.Sin(angEnd) * leng / Math.Sin(angInter);
double lEnd = Math.Sin(angStart) * leng / Math.Sin(angInter);
DVector2d ptStart = ptInter + lStart * vecStart;
DVector2d ptEnd = ptInter + lEnd * vecEnd;