弧度制与角度制是角度测量中的两种特殊制度。我们大概对于角度制最为熟悉,甚至闭着眼都能画出45度或90度的角。圆的360度体系已经成为了一种文化,人们常说“180度转弯”就是指“转到相反的方向”,这里并不是指转弯的方向,而是指一种相反的观点。我们所讨论的角度,对于计算机来说,就是弧度。所以,不管你是否喜欢,都要对弧度制有所了解。
不论是否喜欢都要使用到它们,而且还需要掌握角度制与弧度制间的相互转换。以下是公式:
弧度(radians) = 角度(degrees) * Math.PI /180
角度(degrees) = 弧度(radians) * 180 / Math.PI
绘制正弦曲线,主要就是计算X坐标与Y坐标,X坐标我们只要累加1就可以,而Y坐标则需要通过(初始坐标+Math.Sin(角度)*范围)计算出来
那么代码也不多,直接贴上来吧
代码
double angle = 0;//初始弧度
double centerY = 200;//初始Y值 Y为0的坐标
double range = 50;//Y值范围
double xspeed = 1;
double yspeed = .05;
double xpos;
double ypos;
PathFigure pf;
Path path;
public Sin()
{
InitializeComponent();
xpos = 0;
#region 初始化PATH
path = new Path();
path.Stroke = new SolidColorBrush(Colors.Blue);
path.StrokeThickness = 2;
PathGeometry gm = new PathGeometry();
path.Data = gm;
LayoutRoot.Children.Add(path);
pf = new PathFigure();
gm.Figures.Add(pf);
pf.StartPoint = new Point(0, centerY);
#endregion
//添加刷新事件
CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
Application.Current.Host.Settings.MaxFrameRate = 45;
}
void CompositionTarget_Rendering(object sender, EventArgs e)
{
xpos += xspeed; //更新X坐标
angle += yspeed;//弧度累加
ypos = centerY + Math.Sin(angle) * range;//更新Y坐标
LineSegment ls = new LineSegment() { Point = new Point(xpos, ypos) };
pf.Segments.Add(ls);//新增LineSegment
//由于以上代码未能在界面中刷新显示出来,所以目前这么处理
path.Visibility = Visibility.Collapsed;
path.Visibility = Visibility.Visible;
if (xpos>500)
{
CompositionTarget.Rendering -= CompositionTarget_Rendering;
}
}
double centerY = 200;//初始Y值 Y为0的坐标
double range = 50;//Y值范围
double xspeed = 1;
double yspeed = .05;
double xpos;
double ypos;
PathFigure pf;
Path path;
public Sin()
{
InitializeComponent();
xpos = 0;
#region 初始化PATH
path = new Path();
path.Stroke = new SolidColorBrush(Colors.Blue);
path.StrokeThickness = 2;
PathGeometry gm = new PathGeometry();
path.Data = gm;
LayoutRoot.Children.Add(path);
pf = new PathFigure();
gm.Figures.Add(pf);
pf.StartPoint = new Point(0, centerY);
#endregion
//添加刷新事件
CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
Application.Current.Host.Settings.MaxFrameRate = 45;
}
void CompositionTarget_Rendering(object sender, EventArgs e)
{
xpos += xspeed; //更新X坐标
angle += yspeed;//弧度累加
ypos = centerY + Math.Sin(angle) * range;//更新Y坐标
LineSegment ls = new LineSegment() { Point = new Point(xpos, ypos) };
pf.Segments.Add(ls);//新增LineSegment
//由于以上代码未能在界面中刷新显示出来,所以目前这么处理
path.Visibility = Visibility.Collapsed;
path.Visibility = Visibility.Visible;
if (xpos>500)
{
CompositionTarget.Rendering -= CompositionTarget_Rendering;
}
}
这里有一点问题,我发现在PathFigure里添加了一个LineSegment界面上没有得到刷新,而当改变窗口大小或改变父容器大小等情况path上才显示出新增的Segment
不过发现频繁的修改canvas的width比较吃cpu,于是就换成了path的隐藏显示来达到效果.
参考书籍
Keith Peters' <<Making_Things_Move>>