●●●●●●那位能提供一个用画直线的方式画圆弧、椭圆弧。要求比较精确●●●●●●● 椭圆倒是好画,可圆弧总是不精确,根调用GDI+画得不一样起始位置,结束位置不对多谢了…… 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 椭圆和画圆差不多嘛,加1个系数n,确定分圆为2的n次方条直线就OK 了。最上点,和最左,最右,最下的特征点一定要经过。2的2次方=4,画1个圆至少4条线,所以n>=2,一般下于7就OK 了!椭圆就是把确定下来的点,映射到椭圆上就OK了(就是比列换算嘛)。 以圆(椭圆)中心为圆点(x0,y0),假设椭圆的横向半径为R1,纵向半径为R2; 圆的半径为R;圆上的点(x,y) 映射到椭圆上的点就是((x-x0)*R1/R, (y-y0)*R2/R ) private void DrawArc(Graphics Gra,Pen DrawPen,float X,float Y,float Width,float Height,float BeginAngle,float SweepAngle){// Gra.Clear(this.BackColor); float Pi=3.1415926f; //圆心座标 float X0=X+Width/2; float Y0=Y+Height/2; //半径 float R1=Width/2; float R2=Height/2; //焦点到原点的距离 float Rj=(float)Math.Sqrt(Math.Abs(R1*R1-R2*R2)); //焦点座标 Gra.DrawRectangle(DrawPen,(float)X,(float)Y,(float)X+Width,(float)Y+Height); Gra.DrawLine(DrawPen,X0,Y,X0,Y+Height); Gra.DrawLine(DrawPen,X,Y0,X+Width,Y0 ); //开始角度正切值 float Bsin=(float)Math.Sin(BeginAngle/180*Pi); float Bcos=(float)Math.Cos(BeginAngle/180*Pi); float BTan=Bsin/Bcos; //起点座标 float X1=X0+R1*R2/(float)Math.Sqrt(R2*R2+R1*R1*BTan*BTan); float Y1=Y0+R1*R2/(float)Math.Sqrt(R2*R2/BTan/BTan+R1*R1); //结束角度的正切值 float Esin=(float)Math.Sin((BeginAngle+SweepAngle)/180*Pi); float Ecos=(float)Math.Cos((BeginAngle+SweepAngle)/180*Pi); float ETan=Esin/Ecos; //终点座标 float X2=X0-R1*R2/(float)Math.Sqrt(R2*R2+R1*R1*ETan*ETan); float Y2=Y0+R1*R2/(float)Math.Sqrt(R2*R2/ETan/ETan+R1*R1); //获取最小和最大的X座标,准备循环 float X11=Math.Min(X1,X2); float X22=Math.Max(X1,X2); float Xp=X11; float Yp=Y0+(float)Math.Sqrt((1-((X11-X0)*(X11-X0)/R1/R1)))*R2; for(float Xi=X11;Xi<X22;Xi+=1) { float Yt=(float)Math.Sqrt((1-((Xi-X0)*(Xi-X0)/R1/R1))); float Yi=Y0+Yt*R2; Gra.DrawLine(DrawPen,Xi,Yi,Xp,Yp); Xp=Xi; Yp=Yi; }} 固定的随机数字如何产生?下午求教 IList问题 js的错误。。。 IPAddress关Configuration鸟事? 实现MSN的画板功能 如何在Gridview中用JavaScript用提示框来显示鼠标经过的行号 求一个算法 如何将一个XML字符串,写入到DataSet里去? 我做了一个子窗体,想通过textbox传过一个值给父窗体?how 急,web问题! 菜鸟提问:怎么样在DataGrid的footer里添加一个textbox的html控件呀? dataGrid 绑定数据源以后,如何调整显示列的标题。
最上点,和最左,最右,最下的特征点一定要经过。2的2次方=4,画1个圆至少4条线,所以n>=2,一般下于7就OK 了!椭圆就是把确定下来的点,映射到椭圆上就OK了(就是比列换算嘛)。
{
// Gra.Clear(this.BackColor);
float Pi=3.1415926f; //圆心座标
float X0=X+Width/2;
float Y0=Y+Height/2;
//半径
float R1=Width/2;
float R2=Height/2;
//焦点到原点的距离
float Rj=(float)Math.Sqrt(Math.Abs(R1*R1-R2*R2)); //焦点座标
Gra.DrawRectangle(DrawPen,(float)X,(float)Y,(float)X+Width,(float)Y+Height);
Gra.DrawLine(DrawPen,X0,Y,X0,Y+Height);
Gra.DrawLine(DrawPen,X,Y0,X+Width,Y0 ); //开始角度正切值
float Bsin=(float)Math.Sin(BeginAngle/180*Pi);
float Bcos=(float)Math.Cos(BeginAngle/180*Pi);
float BTan=Bsin/Bcos;
//起点座标
float X1=X0+R1*R2/(float)Math.Sqrt(R2*R2+R1*R1*BTan*BTan);
float Y1=Y0+R1*R2/(float)Math.Sqrt(R2*R2/BTan/BTan+R1*R1); //结束角度的正切值
float Esin=(float)Math.Sin((BeginAngle+SweepAngle)/180*Pi);
float Ecos=(float)Math.Cos((BeginAngle+SweepAngle)/180*Pi);
float ETan=Esin/Ecos;
//终点座标
float X2=X0-R1*R2/(float)Math.Sqrt(R2*R2+R1*R1*ETan*ETan);
float Y2=Y0+R1*R2/(float)Math.Sqrt(R2*R2/ETan/ETan+R1*R1); //获取最小和最大的X座标,准备循环
float X11=Math.Min(X1,X2);
float X22=Math.Max(X1,X2); float Xp=X11;
float Yp=Y0+(float)Math.Sqrt((1-((X11-X0)*(X11-X0)/R1/R1)))*R2; for(float Xi=X11;Xi<X22;Xi+=1)
{
float Yt=(float)Math.Sqrt((1-((Xi-X0)*(Xi-X0)/R1/R1)));
float Yi=Y0+Yt*R2;
Gra.DrawLine(DrawPen,Xi,Yi,Xp,Yp);
Xp=Xi;
Yp=Yi;
}
}