objectarx 批量倒角

这个插件支持AcDbPolyline的倒角,封闭的和没封闭的都可以。刚开始做的时候,发现倒一个角借助云幽课堂里的代码就可以做,后来做一条从左开始画的非封闭的多段线,发现向上凹和向下凹的角不能同时被倒,代码只能倒向上凹的,向下凹的代码时反着的,后来我把凸度取反,向下凹的又可以倒角了。这时我觉得就行了,后来又出现问题,发现顺时针或逆时针画个半包围的图形时,在顶上的角或者底下的角倒出的角又是反着的。最后是画只有一个角的多段线,根据代码的bug,一个个的写判断条件瞎做出来的。光是if else 我都写了一两百行吧。因为自己不懂凸度,没有深入的去想课堂里学的倒角功能的代码,觉得只要会用,有得抄就可以了,根本不去下功夫理解。也不想在写代码的过程中停下来先学会凸度在做,自己就瞎写,我现在觉得这样是不对的,所谓磨刀不误砍柴功,这些道理知道是知道,但真正做的时候,就做不到了。这里我就不想贴出我写的代码了,主要思路是:
判断要倒角的点所在的两条边的向量,根据终边的向量所处与起边的向量的位置关系,根据向量的x,y值确定它是在哪一个象限的,加入向量vec1是1象限,我就把vec2处于2象限的情况都写倒条件里面去,然后写上凸度,跑程序,画线,看结果这样试出来的。还要考虑90度的情况,判断的时候最好不要用等于去判断,用个误差范围去判断。

把云幽课堂的代码倒一个角的代码拿出来,是.C#语言写的的,但改成C++的也很简单。

/// <summary>
        /// 倒圆角。生成两点,按左右上下序。
        /// </summary>
        /// <param name="vertex">要被倒角的点</param>
        /// <param name="vec1">角两边的向量,向量的起点是vertex</param>
        /// <param name="vec2"></param>
        /// <param name="radius">倒角半径</param>
        /// <returns>生成的点</returns>
        public static Point2d[] Fillet(Point2d vertex,
            Vector2d vec1, Vector2d vec2, double radius)
        {
            var uvec1 = vec1.GetNormal();
            var uvec2 = vec2.GetNormal();
            var vecToCenterUnit = (uvec1 + uvec2).GetNormal();

            var vecToCenter = vecToCenterUnit * radius /
                Math.Sin(Math.Min(vecToCenterUnit.GetAngleTo(uvec1),
                         vecToCenterUnit.GetAngleTo(uvec2)));

            var projVec1 = uvec1 * uvec1.DotProduct(vecToCenter);
            var projVec2 = uvec2 * uvec2.DotProduct(vecToCenter);

            return new[] { vertex + projVec1, vertex + projVec2 }
                .OrderBy(p => p.X)
                .ThenBy(p => p.Y)
                .ToArray();
        }

 凸度的计算:
bulge = tan((CMathUtil::PI() - vec2.angleTo(vec1)) / 4);

最后总结平时自己写的代码 大部分都是东平西凑,没有百度,我根本就做不出来。

猜你喜欢

转载自www.cnblogs.com/HelloQLQ/p/12307614.html
今日推荐