求单线等距功能算法
我现在做的一个绘图软件要求对封闭图形有单线等距外扩内缩功能。我自己做了一个,可是不正确(代码贴在下面),现请求高手支援给个算法,非常感谢。
偏移量:是要偏移的距离
偏移次数:偏移的次数
效果如下:里面的是原图,外面的是偏移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;
}
--------------------编程问答-------------------- 数学问题而已.加加减减就有出来了
比如:
e.Graphics.DrawRectangle(Pens.Red,10,10 ,100,100);
e.Graphics.DrawRectangle(Pens.Red,10-5,10-5,110,110);
用得着,那么麻烦吗? --------------------编程问答-------------------- 如果可以那样的话,我早就加加减减的完成了,就不用求算法了。因为我的数学烂所以才发的……唉,你是牛人 --------------------编程问答-------------------- 为什么没有动静?? --------------------编程问答--------------------
补充:.NET技术 , C#