这个程序的主体结构已经给出了,只需要在空白处补充相应的代码即可
要求尽量逻辑清晰,代码简单
private void button1_Click(object sender, System.EventArgs e)
{
Graphics dc=this.CreateGraphics();
Pen BlackPen=new Pen(Color.Black,8);
Point[] px=new Point[5];
px[0].X=10;
px[0].Y=10; px[1].X=40;
px[1].Y=100; px[2].X=80;
px[2].Y=120; px[3].X=100;
px[3].Y=180;
px[4].X=210;
px[4].Y=80;
.....(这是需要补充的代码)
}
要求尽量逻辑清晰,代码简单
private void button1_Click(object sender, System.EventArgs e)
{
Graphics dc=this.CreateGraphics();
Pen BlackPen=new Pen(Color.Black,8);
Point[] px=new Point[5];
px[0].X=10;
px[0].Y=10; px[1].X=40;
px[1].Y=100; px[2].X=80;
px[2].Y=120; px[3].X=100;
px[3].Y=180;
px[4].X=210;
px[4].Y=80;
.....(这是需要补充的代码)
}
Pen BlackPen=new Pen(Color.Black,8);
应该为:
Pen BlackPen=new Pen(Color.Black,1);
我的笔误
1、对于数组px按照方向不同,分成单独的线段
2、对于每一条单独线段根据Dashline的要求,重新构造pt的Point树组,并且计算余差
3、对于构造pt,可以根据Dashline的要求,从起点开始,考虑上一条线段的余差,Dash长度
的奇数倍就是要画的实线,并且最后计算出本次的余差。
4、对于pt数组,只要从头开始到尾连起来就行了说明:属于个人暂时看法,没有优化我试一下,成功了,就马上把代码贴出来,楼主要给分呦,呵呵
private ArrayList ptAryList=new System.Collections.ArrayList();//存储构造后的点数组
private double SingleLine(Point point1,Point point2,double its)
{
double TotleLineLen;//线段长度
double deltaX;//X轴上的投影
double deltaY;//Y轴上的投影
int StrokeLen;//dashline的长度
nt FregNum;//线段含有StrokeLen*2的整数倍
double itsSingle;//上一次的余差
double angle;
Point Tmppt1=new Point(); StrokeLen=20;
deltaX=(double)(point2.X - point1.X );
deltaY=(double)(point2.Y - point1.Y );
if (deltaX==0 && deltaY>0)
{
angle=Math.PI/2;
}
else if(deltaX==0 && deltaY<0)
{
angle=3*Math.PI/2;
}
else if(deltaY==0 && deltaX>0)
{
angle=0*Math.PI/2;
}
else if(deltaY==0 && deltaX<0)
{
angle=2*Math.PI/2;
}
else {
angle=Math.Atan(deltaY/deltaX);//线段的角度
}
Point[] AryPoint;
Tmppt1.X=(int)(point1.X-Math.Cos(angle)*its);
Tmppt1.Y=(int)(point1.Y-Math.Sin(angle)*its);
TotleLineLen= Math.Sqrt(deltaX*deltaX + deltaY*deltaY)+its;//线段的长度
FregNum=(int) TotleLineLen / StrokeLen;
itsSingle=TotleLineLen-FregNum*StrokeLen;
if(FregNum==0)
{
AryPoint=new Point[2];
AryPoint[0]=point1;
AryPoint[1]=point2;
}
else
{
AryPoint=new Point[FregNum+2];
AryPoint[0]=point1;
for(int i=1;i<AryPoint.Length-1;i++)
{
AryPoint[i].X=(int)(Tmppt1.X+Math.Cos(angle)*StrokeLen*i);
AryPoint[i].Y=(int)(Tmppt1.Y+Math.Sin(angle)*StrokeLen*i); }
AryPoint[AryPoint.Length-1].X=point2.X;
AryPoint[AryPoint.Length-1].Y=point2.Y;
}
for(int i=0;i<AryPoint.Length;i++)
{
ptAryList.Add(AryPoint[i]);
}
return itsSingle;}
private void Pline(Point[] pt)
{
Point pt1=new Point();
Point pt2=new Point();
double its;
double Tmpits;
its=0;
ptAryList.Clear();
for(int i=1;i<pt.Length;i++)
{
pt1=pt[i-1];
pt2=pt[i];
Tmpits=SingleLine(pt1,pt2,its);
its=Tmpits; }}
private void button1_Click(object sender, System.EventArgs e)
{
Graphics dc=this.CreateGraphics();
Pen BlackPen=new Pen(Color.Black,8);
Pen WhitePen=new Pen(Color.White,1);
Point[] px=new Point[7];
px[0].X=10;
px[0].Y=10; px[1].X=40;
px[1].Y=100; px[2].X=80;
px[2].Y=120; px[3].X=100;
px[3].Y=180; px[4].X=200;
px[4].Y=180; px[5].X=210;
px[5].Y=180; px[6].X=210;
px[6].Y=80; Pline(px);
dc.Clear(Color.White);
//开始绘制对照实线线
for(int i=1;i<px.Length;i++)
{
dc.DrawLine(BlackPen,px[i-1],px[i]);
}
//开始绘制dash线 Point tmpPtStart,tmpPtEnd;
for(int i=1;i<ptAryList.Count;i=i+2)
{
tmpPtStart=(Point)ptAryList[i-1];
tmpPtEnd=(Point)ptAryList[i];
dc.DrawLine(WhitePen,tmpPtStart,tmpPtEnd);
}
}
我测试了,成功了,但是可能很多地方可以优化
关于角度angle的计算
我修正了一下:
if (deltaX==0 && deltaY>0)
{
angle=Math.PI/2;
}
else if(deltaX==0 && deltaY<0)
{
angle=3*Math.PI/2;
}
else if(deltaY==0 && deltaX>0)
{
angle=0*Math.PI/2;
}
else if(deltaY==0 && deltaX<0)
{
angle=2*Math.PI/2;
} else if(deltaX>0 && deltaY>0)
{
angle=Math.Atan(deltaY/deltaX);
}
else if(deltaX<0 && deltaY>0)
{
angle=Math.PI+Math.Atan(deltaY/deltaX);
}
else if(deltaX<0 && deltaY<0)
{
angle=2*Math.PI+Math.Atan(deltaY/deltaX);
}
else {
angle=Math.Atan(deltaY/deltaX);//线段的角度
}另外我认为你的arraylist存储了一半的不用数据
可以优化