c# 中画正弦曲线问题
利用Graphics和Pen的ScaleTransform方法把坐标长度转换了一下,实现了在新的坐标下pen(画笔)的宽度与新坐标符合,但是DrawElipse没有相应的转换方法,这
导致画出来的椭圆非常大,而不是小到一个点,难看之极。
有什么解决办法吗?
public void DrawPicture(System.Windows .Forms .PictureBox pb)
{
System.Drawing .Bitmap bmp=new Bitmap (pb.Width ,pb.Height );
Image img=(Image)bmp;
System.Drawing .Graphics g=Graphics.FromImage (img);
//定义坐标
int MaxY=pb.Height; //最大Y坐标
int MaxX=pb.Width ; //最大X坐标
int OX=0; //原点X坐标
int OY=0; //原点Y坐标
int NewOX=50; //新坐标原点X
int NewOY=MaxY/2; //新坐标原点Y
//定义画笔
Pen pen=new Pen (Color.Blue,1);
//画坐标线
//g.ScaleTransform (20,20,System.Drawing .Drawing2D .MatrixOrder .Append );
g.TranslateTransform (NewOX,NewOY);//平移坐标系
float CurveX=(float)(2*System.Math .PI)+1 ; //新的坐标最大值
float CurveY=11; //新的坐标最大值
float scaleX=2*CurveX/MaxX; //X方向缩放比例
float scaleY=2*CurveY/MaxY; //Y方向缩放比例
g.ScaleTransform (1/scaleX,1/scaleY); //变换坐标
pen.ScaleTransform (scaleX,scaleY); //变换pen坐标
MaxX=(int)(2*CurveX);
MaxY=(int)(2*CurveY);
int XLeft=-1; //X轴左端点
int XRight=MaxX; //X轴右端点
int XY=OY; //X轴Y坐标
int YTop=-MaxY/2; //Y轴上端点
int YBottom=MaxY/2; //Y轴下端点
int YX=OX; //Y轴X坐标
g.DrawLine (pen,new Point (XLeft,XY),new Point (XRight,XY));//X轴
g.DrawLine (pen,new Point (YX,YTop),new Point (YX,YBottom));//Y轴
g.DrawEllipse (pen,0,0,1,1);//画原点
double x;
double y;
Pen redPen=new Pen (Color.Red ,1);
redPen.ScaleTransform (scaleX,scaleY); //变换pen坐标
for(double i=0;i<=2*Math.PI ;i=i+0.01) //循环画正弦曲线
{
x=i;
y=this._A *Math.Sin ((this._N )*x);
g.DrawEllipse (redPen,(float)x,(float)y,1,1);
}
//为pb赋值
pb.Image =img;
}
问题点数:100、回复次数:4Top
1 楼vivianfdlpw()回复于 2004-05-02 22:50:49 得分 0
关键是g.DrawEllipse (redPen,(float)x,(float)y,1,1)这句
新的坐标中X轴的长度大约6.28,可是这个椭圆的宽度就已经是1了,
画出来非常大,我需要的是椭圆相对于坐标来说是一个点
Top
2 楼cuike519(I will be back!)回复于 2004-05-02 23:34:20 得分 20
作图我不熟悉所以不敢乱说,下面这个例子也许对你有所帮助!
http://www.codeproject.com/csharp/ZedGraph.aspTop
3 楼elusion(落)回复于 2004-05-02 23:41:07 得分 80
什么意思啊
不能这样么 g.DrawEllipse (redPen,(float)x,(float)y,0.1f,0.1f);Top
4 楼vivianfdlpw()回复于 2004-05-03 13:30:02 得分 0
汗。。。我真傻,看了几遍没看见这个重载方法。。。Top




