公司插件的梁齐斜板功能更新,设计师提出需求可以拆分弧梁,并能对齐到板顶。
本文只讨论拆分弧梁,椭圆再后续更新。
-
首先看以下弧形的创建api
API中提供了三种方法
第一种时指定起点与终点,最后选择顶点形成的弧形
第二种是指定面,半径,起点角度与终点角度
第三种则是弧形中心点,半径,起点角度,终点角度,x向量,y向量 -
拆分弧形,意思就是如果遇到板边界需要拆分,需要将此弧形按照板边界划分成两个弧形,第一种办法肯定无法实现,后两种的化就需要了解什么是起点角度与终点角度,并如何计算
-
下面是我的理解,后面彻底完成后再继续补充,可能有些混乱,怕后面忘记(所有的弧形是逆时针旋转)
- 弧形内部有三个参数(xDir,yDir,normal),这三个参数代表横向向量,纵向向量,和法向量
- 下面是两个相反的值比较,可以发现法向量在俩面决定了整个弧形方向,此处可以使用右手法则理解
- 也就是说,此处如果按照常规布置,我们可以求startangle和endangle,公式如下所示:
var dir0 = (arc.GetEndPoint(0) - arc.Center).Normalize();
var dir1 = (arc.GetEndPoint(1) - arc.Center).Normalize();
- 从上图可以看出α代表的startAngle大于β的endAngle,整个角度大小是整相反,所以我们拆分的时候可以反方向拆分便可以获得相应的新弧线
double endAngle = dir0.AngleOnPlaneTo(arc.XDirection, arc.Normal);
double startAngle = dir1.AngleOnPlaneTo(arc.XDirection, arc.Normal);
double intersectAngle = dir.AngleOnPlaneTo(arc.XDirection, arc.Normal);
- 前文说到法向量和Y关系右手法则
- 倒叙组合便能够形成新的arc弧形,完成拆分
var fakeNewLine = Arc.Create(arc.Center, arc.Radius, startAngle, intersectAngle, arc.XDirection,
-arc.YDirection);
newLine = fakeNewLine.CreateReversed();
var fakeLine = Arc.Create(arc.Center, arc.Radius, intersectAngle, endAngle, arc.XDirection,
-arc.YDirection);
line = fakeLine.CreateReversed();
- 此处还没有完成梁齐斜板,因为我们是逆时针去拆分,所以需要将整个arc倒置以下才能够完成最后的样式转换,下面是结果图