C# 画正弦曲线的原理是什么呢?我已经找到代码了,求大神给我解释一下。 每一步是什么意思。画曲线的算法我看不太懂

时间:2021-02-02 17:05:51
C# 画正弦曲线的原理是什么呢?我已经找到代码了,求大神给我解释一下。 每一步是什么意思。画曲线的算法我看不太懂

22 个解决方案

#1


这是代码  ,

private void button1_Click(object sender, System.EventArgs e)
{
//参考资料
//  http://www.cnblogs.com/wd_318/articles/49980.html
//  一段画SIN曲线的代码
System.Drawing.Bitmap bmp = new Bitmap(400,220);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(new SolidBrush(Color.White),0,0,400,220);
this.pictureBox1.Image = bmp;
画曲线(bmp);
}
/// <summary>
/// 画曲线
/// </summary>
/// <param name="bmp"></param>
private void 画曲线(Bitmap bmp)
{
Graphics g = Graphics.FromImage(bmp);
Pen pen = new Pen(Color.Black,1);
double x1=10;
double y1=0;
for(double x=1;x<720;x++)
{
//SIN最大值为1,而我图上用了100像素,所以有
//100/1=100  故而y要乘100;
// x/180*Math.PI 这个表达式把角度换成弧度值
double y=Math.Sin(x/180*Math.PI)*100;

//SIN值一个循环为360度,而我图上用了200像素表示,所以有:
//360/200=1.8 故而x值要除1.8
g.DrawLine(pen,(float)x1,(float)y1+110,(float)(x/1.8)+10,(float)y+110);
x1=x/1.8+10;
y1=y;
}
}

#2


C# 画正弦曲线的原理是什么呢?我已经找到代码了,求大神给我解释一下。 每一步是什么意思。画曲线的算法我看不太懂  这是效果图

#3


这看不懂吗,根据x值,通过三角函数算出y值,就是个公式,分别求出x,y的值,然后画在bitmap上

#4


引用 3 楼 bdmh 的回复:
这看不懂吗,根据x值,通过三角函数算出y值,就是个公式,分别求出x,y的值,然后画在bitmap上
  不是正弦函数吗

#5


这不就是循环x,从1到720
计算每一个x对应的y值,确定一个点(x,y)
然后每两个点之间连线

#6


三角函数应该知道吧
那个循环其实就是均匀取720个点,将相邻两个点应直线连起来,取的点越多(如1440,2880.。。),画的线就越光滑,
取的点越少(如180,90.。。)画的就越粗糙

#7


引用 6 楼 gxingmin 的回复:
三角函数应该知道吧
那个循环其实就是均匀取720个点,将相邻两个点应直线连起来,取的点越多(如1440,2880.。。),画的线就越光滑,
取的点越少(如180,90.。。)画的就越粗糙
   意图我看懂了, 算法不是很懂。虽然写了注释

#8


实际上就跟你尺规作图的原理是一模一样的
曲线上有无数个点,你不可能把所有点都计算出来画上去
只能抽样,然后连线
抽样率越高,曲线就越接近真实

#9


引用 6 楼 gxingmin 的回复:
三角函数应该知道吧
那个循环其实就是均匀取720个点,将相邻两个点应直线连起来,取的点越多(如1440,2880.。。),画的线就越光滑,
取的点越少(如180,90.。。)画的就越粗糙
   我要做一个更为复杂的,所以必须要看懂算法

#10


这有什么算法?
不就是一个sin正旋函数吗?你要是不了解三角函数,那几句话肯定说不清,你要是了解三角函数,那这段代码基本没啥算法

#11


引用 8 楼 Z65443344 的回复:
实际上就跟你尺规作图的原理是一模一样的
曲线上有无数个点,你不可能把所有点都计算出来画上去
只能抽样,然后连线
抽样率越高,曲线就越接近真实
   嗯 有点明白了 我先思考思考。

#12


double y=Math.Sin(x/180*Math.PI)*100;
这不就是正弦曲线函数么
根据x计算y,有什么不懂的

#13


引用 10 楼 gxingmin 的回复:
这有什么算法?
不就是一个sin正旋函数吗?你要是不了解三角函数,那几句话肯定说不清,你要是了解三角函数,那这段代码基本没啥算法
  三角函数我知道,    sin =  对边/斜边         他这样写的   double y=Math.Sin(x/180*Math.PI)*100;

#14


至于那个除以1.8和乘以100之类的,那就更好理解了,
因为如果不这样处理画出来的图特别小(只有一个像素单位),所以他在横竖坐标上做了放大处理

#15


正弦,余弦,勾股定理,这些不都是三角函数么....

#16


我明白了,谢谢各位。 我一直纠结于 正弦函数公式。   实际上 这是正弦曲线函数 公式 。我走错路了

#17


x/180*Math.PI是将角度转换成弧度
90度=1/2pi吧,90/180*PI=1/2PI....

#18


正弦曲线可表示为y=Asin(ωx+φ)+k,定义为函数y=Asin(ωx+φ)+k在直角坐标系上的图象,其中sin为正弦符号,x是直角坐标系x轴上的数值,y是在同一直角坐标系上函数对应的y值,k、ω和φ是常数(k、ω、φ∈R且ω≠0)

#19


他把y放大了100倍,就是y=1时,高度其实是100
那么相应的,x轴也必须放大100倍,否则就不是等比例放大了,也不是正弦曲线了

#20


引用 19 楼 Z65443344 的回复:
他把y放大了100倍,就是y=1时,高度其实是100
那么相应的,x轴也必须放大100倍,否则就不是等比例放大了,也不是正弦曲线了
  g.DrawLine(pen,(float)x1,(float)y1+110,(float)(x/1.8)+10,(float)y+110);  里面的y+110 是什么意思。。 求解。其他的弄懂了

#21


+110是将起始点往下移110个像素,否则画到波峰时超出界面了

#22


我想问一下为什么this.picturebox1.image这句picturebox没有用

#1


这是代码  ,

private void button1_Click(object sender, System.EventArgs e)
{
//参考资料
//  http://www.cnblogs.com/wd_318/articles/49980.html
//  一段画SIN曲线的代码
System.Drawing.Bitmap bmp = new Bitmap(400,220);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(new SolidBrush(Color.White),0,0,400,220);
this.pictureBox1.Image = bmp;
画曲线(bmp);
}
/// <summary>
/// 画曲线
/// </summary>
/// <param name="bmp"></param>
private void 画曲线(Bitmap bmp)
{
Graphics g = Graphics.FromImage(bmp);
Pen pen = new Pen(Color.Black,1);
double x1=10;
double y1=0;
for(double x=1;x<720;x++)
{
//SIN最大值为1,而我图上用了100像素,所以有
//100/1=100  故而y要乘100;
// x/180*Math.PI 这个表达式把角度换成弧度值
double y=Math.Sin(x/180*Math.PI)*100;

//SIN值一个循环为360度,而我图上用了200像素表示,所以有:
//360/200=1.8 故而x值要除1.8
g.DrawLine(pen,(float)x1,(float)y1+110,(float)(x/1.8)+10,(float)y+110);
x1=x/1.8+10;
y1=y;
}
}

#2


C# 画正弦曲线的原理是什么呢?我已经找到代码了,求大神给我解释一下。 每一步是什么意思。画曲线的算法我看不太懂  这是效果图

#3


这看不懂吗,根据x值,通过三角函数算出y值,就是个公式,分别求出x,y的值,然后画在bitmap上

#4


引用 3 楼 bdmh 的回复:
这看不懂吗,根据x值,通过三角函数算出y值,就是个公式,分别求出x,y的值,然后画在bitmap上
  不是正弦函数吗

#5


这不就是循环x,从1到720
计算每一个x对应的y值,确定一个点(x,y)
然后每两个点之间连线

#6


三角函数应该知道吧
那个循环其实就是均匀取720个点,将相邻两个点应直线连起来,取的点越多(如1440,2880.。。),画的线就越光滑,
取的点越少(如180,90.。。)画的就越粗糙

#7


引用 6 楼 gxingmin 的回复:
三角函数应该知道吧
那个循环其实就是均匀取720个点,将相邻两个点应直线连起来,取的点越多(如1440,2880.。。),画的线就越光滑,
取的点越少(如180,90.。。)画的就越粗糙
   意图我看懂了, 算法不是很懂。虽然写了注释

#8


实际上就跟你尺规作图的原理是一模一样的
曲线上有无数个点,你不可能把所有点都计算出来画上去
只能抽样,然后连线
抽样率越高,曲线就越接近真实

#9


引用 6 楼 gxingmin 的回复:
三角函数应该知道吧
那个循环其实就是均匀取720个点,将相邻两个点应直线连起来,取的点越多(如1440,2880.。。),画的线就越光滑,
取的点越少(如180,90.。。)画的就越粗糙
   我要做一个更为复杂的,所以必须要看懂算法

#10


这有什么算法?
不就是一个sin正旋函数吗?你要是不了解三角函数,那几句话肯定说不清,你要是了解三角函数,那这段代码基本没啥算法

#11


引用 8 楼 Z65443344 的回复:
实际上就跟你尺规作图的原理是一模一样的
曲线上有无数个点,你不可能把所有点都计算出来画上去
只能抽样,然后连线
抽样率越高,曲线就越接近真实
   嗯 有点明白了 我先思考思考。

#12


double y=Math.Sin(x/180*Math.PI)*100;
这不就是正弦曲线函数么
根据x计算y,有什么不懂的

#13


引用 10 楼 gxingmin 的回复:
这有什么算法?
不就是一个sin正旋函数吗?你要是不了解三角函数,那几句话肯定说不清,你要是了解三角函数,那这段代码基本没啥算法
  三角函数我知道,    sin =  对边/斜边         他这样写的   double y=Math.Sin(x/180*Math.PI)*100;

#14


至于那个除以1.8和乘以100之类的,那就更好理解了,
因为如果不这样处理画出来的图特别小(只有一个像素单位),所以他在横竖坐标上做了放大处理

#15


正弦,余弦,勾股定理,这些不都是三角函数么....

#16


我明白了,谢谢各位。 我一直纠结于 正弦函数公式。   实际上 这是正弦曲线函数 公式 。我走错路了

#17


x/180*Math.PI是将角度转换成弧度
90度=1/2pi吧,90/180*PI=1/2PI....

#18


正弦曲线可表示为y=Asin(ωx+φ)+k,定义为函数y=Asin(ωx+φ)+k在直角坐标系上的图象,其中sin为正弦符号,x是直角坐标系x轴上的数值,y是在同一直角坐标系上函数对应的y值,k、ω和φ是常数(k、ω、φ∈R且ω≠0)

#19


他把y放大了100倍,就是y=1时,高度其实是100
那么相应的,x轴也必须放大100倍,否则就不是等比例放大了,也不是正弦曲线了

#20


引用 19 楼 Z65443344 的回复:
他把y放大了100倍,就是y=1时,高度其实是100
那么相应的,x轴也必须放大100倍,否则就不是等比例放大了,也不是正弦曲线了
  g.DrawLine(pen,(float)x1,(float)y1+110,(float)(x/1.8)+10,(float)y+110);  里面的y+110 是什么意思。。 求解。其他的弄懂了

#21


+110是将起始点往下移110个像素,否则画到波峰时超出界面了

#22


我想问一下为什么this.picturebox1.image这句picturebox没有用