1.圆弧倒角

image.png

  1. DVector2d vS = vecStart;
  2. DVector2d vE = vecEnd;
  3. if (vS.IsParallelTo(vE)) return ;
  4. vS.NormalizeInPlace();
  5. vE.NormalizeInPlace();
  6. DVector2d vMid = vS + vE;
  7. vMid.NormalizeInPlace();
  8. Angle halfAngel = vS.AngleTo(vMid);
  9. double sDis = R / Math.Tan(halfAngel.Radians);
  10. double cDis = R / Math.Sin(halfAngel.Radians);
  11. DVector2d ptCenter = ptInter + cDis * vMid;
  12. DVector2d ptArcStart = ptInter + sDis * vS;
  13. DVector2d ptArcEnd = ptInter + sDis * vE;

2.不规则倒角计算

image.png
image.png
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;