binzhouweichao@163.com
2013-10-19
修改前面的项目。
在之前的项目中,对数据data的处理是通过手动运算的方法,来放大足够的倍数,以取得合适的视图。
本节,对原始数据data不做处理,只是通过调整坐标系scale的方法来放大视图,得到合适的结果。
1. 修改data的声明定义
为了防止数据丢失,对data数据的类型调整为float,即把Point改成PointF。
打开GlobalVars.cs,将原先对data的定义部分注释掉,修改为:
//类似于#define宏定义,设置三个常量
public const int POINTCNT = 50;//点数,POINTCNT <= XMAX - XMIN
//public const int XMAX = 200;//X轴最大值,也就是2π对应的值
//public const int XMIN = 0;//X轴最小值
//public const double times = (XMAX - XMIN) / (2 * Math.PI - 0);//放大倍数
public const float XMAX = (float)(2 * Math.PI);//不放大情况下的x的最大值
public const float XMIN = 0F;//不放大情况下x的最小值
public const float xInterval = (XMAX - XMIN) / (POINTCNT - 1);//i增量对应的data.X增量
//类似于全局变量,可以重新赋值
/*
//坐标点变量
private static Point[] data = new Point[POINTCNT];
public static Point[] Data
{
get { return data; }
set { data = value; }
}
* */
//使用调整坐标系Scale的方法调整视图,对原始数据运算不做处理
private static PointF[] data = new PointF[POINTCNT];
public static PointF[] Data
{
get { return data; }
set { data = value; }
}
2. sin求值运算的处理
由于是通过坐标系调整的方法,且data坐标类型为float,所以在计算sin函数值时,直接使用原始数据即可。
打开TriPaint.cs,把对data赋值的地方修改成直接运算:
//对数据进行处理
/*
for (int i = 0; i < GlobalVars.POINTCNT; i++)
{
GlobalVars.Data[i].X = (int)(i * GlobalVars.xInterval);//i对应的data.X
GlobalVars.Data[i].Y = (int)(GlobalVars.times * Math.Sin(GlobalVars.Data[i].X / GlobalVars.times));//sin函数求值
GlobalVars.Data[i].Y = (int)(GlobalVars.Data[i].Y + GlobalVars.times * 1);//Y轴向正向平移1,即1*times,令最高点(也就是3π/2对应的-1点)的值为0
}
* */
//直接运算,倍数及平移稍后处理
for (int i = 0; i < GlobalVars.POINTCNT; i++)
{
GlobalVars.Data[i].X = i