|
学习创作不是学完了在干,干本身就是学
----------牢记伟人教导,实践工作实践一,用画线段的方法画曲线———
万里江山 2013-09
当今科技知识迅速膨胀,想搞点有点智能化的电子作品涉及的知识面可真广,这不,近期搞得一个“温湿度数据无线采集器
(待完工,进行中…)”遇到的一个问题就是:如何在电脑上编一个程序,让温度值以曲线的形式画出来?下面分享我学习过程
中的收获,和大家共同学习研究.
首先,将我个人情况自我介绍一下:热衷电子、单片机的爱好者,有一定的C语言基础,电脑上编程是自学的,数学水平一般
般。了解“面向对象的编程”这么一回事 .
开始谈谈我想法的吧:
“如何在电脑上编一个程序,让温度值以曲线的形式画出来” 我选择 VS 2010(C#),因为
它兼容C语言,继承了以前学习锻炼掌握到的C知识,这样搞起来就方便多了.
看看这个C#编译器的样子吧,呵呵:
C#中的画图控件可能有很多,查阅资料我得知有一类:Draw ,可以画直线,椭圆,圆…
而我们记录的温湿度就是一个直角坐标平面上的曲线,这个曲线是任意变化的,没啥特别的规律.那么到底该掌握哪些必
须知识就够了呢?
对了,坐标系就是一条条的直线,而曲线嘛…呵呵正式本文的重点. 好了,开始正题.
查阅资料得知:g.DrawLine(), C# 中画图中的画直线方法,g只的作图的“画布”,是自己定义的名字. 只要告诉编译器两个
点A,B的坐标(x0,y1) ,(x1,y1) 以及画笔的样式,
那么通过DrawLine()方法,例如A(40,5), B (100,100)
g.DrawLine(myPen, 40, 5, 100, 100);//两点确定一线段
就可以在屏幕上画一条线段了.
private void Form1_Paint(object sender, PaintEventArgs e)
{
// bmp();
Font = new Font("方正姚体", 9);
Graphics g = this.CreateGraphics(); //建立画布
Pen myPen = new Pen(Color.Red, 3);//画笔:红色,粗细3号
g.DrawLine(myPen, 40, 5, 100, 100);//画-线段
}
}
呵呵,原来C#画线段如此的简单啊!刚才说了,“温湿度就是一个直角坐标平面上的曲线,这个曲线是任意变化的,没啥
特别的规律.”,实际上,C#不提供也不可能提供一种画任意曲线的方法的.那么能否用现有知识学习得到新的技能呢?记得
高中时候,数学老师讲《解析几何》说过,一条曲线,如果我们把它细分,只要你分的的线段足够短,那么这段曲线可以
近似看做就是线段!分的越短,近似程度就越高. 哈哈,又开始用到数学知识了. 为了证明这个方法画曲线的万能性,我
们试着画一个圆验证看看(尽管有画圆的标准方法,但这里作为研究,不采用)
验证题设: 在电脑屏幕某个位置画一个半径为R的圆.如下图.示:
分析: 要在屏幕上画曲线转变为画“线段”必须把这个圆周细分为许许多多的小段(点),
比如分成360点,在计算这些点各自的坐标.X,Y. 好了,既然是圆这个东东,我看用极坐标表示比较方便. 设原点的坐标为
(x0,y0),半径为R,则圆上任意一点坐标可表示为:
X=x0+R*cos (360/N); //N指点M的和X轴的夹角
Y= y0+R*sin (360/N);
按照这样算法,我们得到360点的坐标X,Y, 这个繁琐的工作当然不是我们自己算了,让电脑
去算啦.
好了,把这样的算法翻译成C语言,并且编译试试效果,请看下图!!
呼呼,OK了,和自己最初的想法是一致的.
void bmp(int x0, int y0, int R)
{
int i;
int M=360;
int[] X = new int[M];//取点数量720
int[] Y = new int[M];//取点数量720
/*******求圆上任意点M坐标M(X,Y),存入数组X[],Y[]**/
for (i = 0; i < M; i++)
{
X = (int)(x0 + R *Math.Cos(360/M*i));
Y = (int)(y0 + R * Math.Sin(360 / M*i));
}
/*****************************************************/
Font = new Font("方正姚体", 9);
Graphics g = this.CreateGraphics();
Pen myPen = new Pen(Color.Red, 1);//画笔
/******************相邻两点线段相连 (坐标值X,Y),最终变成员********************/
for (i = 0; i < (M-1); i++)
{
g.DrawLine(myPen, X, Y, X[i+1], Y[i+1]);//画线段
}
}
/**************************************************************************************/
private void Form1_Paint(object sender, PaintEventArgs e)
{
bmp(200,200,100);
}
/**************************************************************************************/
来来,试试一下画整个坐标系,并在图上画曲线.(次数是正比例函数值,因此是折线)
后话:
学习创作不是学完了在干,干本身就是学.
高中毕业10年了,遥想高中当年,我的数学知识一般,我们的数学老师每次给我解答问题时,基本难以直接跟上老师的思
维步调,看得出老师似乎有些不耐烦的表情.好在我一直尊重老师的.自己学不好不能全怪老师. 数学不好,给我解答物理问
题带来了不少麻烦,很多问题不能用刚刚学到的知识去解答,只能用原始的数学算法解答了.物理老师也赞赏我热爱物理
的兴趣,总是不轻易间间接传授我们一些数学知识,并将讲数学在物理中的含义说的很透彻. 国庆节假期(2日),高中老
同学20来人进行了一次隆重的聚会,我因为工作原因没能回去参加, 想想当年一起读高中的同学,现在有的是小老板,更
多的是财务,护理,物流
…非理工类的活儿. 有时我还在想:要是我能参加聚会,在聚会的饭桌上当着老同学和数学老师、物理老师的面,说“遥想
高中当年,我的数学知识一般,但10年后的今天,我依然使用着数学在搞电子、单片机程序”试想,老师同学们是何想法呢
?呵呵。 再次感谢给我们传授知识的老师们!
|
评分
-
1
查看全部评分
-
|