我现在做的一个绘图软件要求对封闭图形有单线等距外扩内缩功能。我自己做了一个,可是不正确(代码贴在下面),现请求高手支援给个算法,非常感谢。偏移量:是要偏移的距离
偏移次数:偏移的次数
效果如下:里面的是原图,外面的是偏移3次后的效果
 
下面是个出错的效果
 
/// <summary>
        /// 获取折线等距线点集合
        /// </summary>
        /// <param name="pts">坐标点</param>
        /// <param name="d">折线轨迹偏移距离</param>
        /// <returns>坐标点</returns>
        public static List<Point> GetPeaks(List<Point> pts, float d)
        {
            
            Point newPeak = new Point();//新的顶点
            List<Point> Peaks = new List<Point>();            for (int i = 0; i < pts.Count; i++)
            {
                if (i == 0 || i == pts.Count - 1)
                {
                    newPeak = GetNewPoint(pts[pts.Count - 1], pts[0], pts[1],d);                    Peaks.Add(newPeak);
                }
                for (int j = i + 1; j < pts.Count; j++)
                {
                    for (int k = i + 2; k < pts.Count; k++)
                    {
                        newPeak = GetNewPoint(pts[i], pts[j], pts[k],d);                        Peaks.Add(newPeak);
                        break;
                    }
                    break;
                }
            }
            return Peaks;
        }
        /// <summary>
        /// 获取新的顶点
        /// </summary>
        /// <param name="pt1"></param>
        /// <param name="pt2"></param>
        /// <param name="pt3"></param>
        /// <param name="d"></param>
        /// <returns></returns>
        private static Point GetNewPoint(Point pt1, Point pt2, Point pt3,double d)
        {
            double k1, k2;//斜率
            double anglePeak, angleBisection,angle;//弧度
            double angle1, angle2;
            double direction;//向量
            Point newPeak=new Point ();
            //该角的一条边
            if (pt1.X == pt2.X)
            {
                angle1 = Math.PI / 2;
            }
            else
            {
                if (pt1.Y == pt2.Y)
                {
                    angle1 = Math.PI;
                }
                else
                {
                    k1 = CsCommunal.GetSlope(pt1,pt2);
                    angle1 = Math.Atan(k1);
                }
            }
            //该角的另一条边
            if (pt2.X == pt3.X)
            {
                angle2 = Math.PI / 2;
            }
            else
            {
                if (pt2.Y == pt3.Y)
                {
                    angle2 = Math.PI;
                }
                else
                {
                    k2 = CsCommunal.GetSlope(pt3,pt2);
                    angle2 = (k2);
                }
            }            anglePeak = angle2 - angle1;//求顶点夹角            angleBisection = angle2 - (anglePeak / 2);//角平分线与X轴的夹角
            angle = Math.PI / 2 - angleBisection;            #region 角度换算
            //Math.Cos(a) = X / r;
            //Math.Sin(a)=Y/r;
            //Math.Tan(a)=Y/X;
            #endregion            direction = d / Math.Cos(angle);//斜边:角平分线上两点之间的距离
            newPeak.X = (int)(Math.Cos(angleBisection) * direction + pt2.X);
            newPeak.Y = (int)(Math.Sin(angleBisection) * direction + pt2.Y);            return newPeak;
        }