急:C# GDI+绘制曲线,坐标轴最大值和最小值问题

Demo+ 2011-05-05 04:11:59
想做一个根据时间点得到的数据绘制曲线的功能模块,现在遇到一个问题希望可以得到大家的指点.
Y轴是数据轴,如:在某个时间段内数据区间是 0.016 - 0.875

希望得到的效果是Y轴刻度根据数据区间不同最大值和最小值可以自动调整的,并且希望上,下都可以留出一小部分空间(就是最大值的点不要靠顶部显示,最小值的点也不要靠底部显示),类似上面的数据Y轴可以做成0-1或者0.1-0.9(极值相关不太远就行) 希望可以得到一个这类问题的具体算法.在线等,请高手指点...
...全文
434 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
snowman163254 2011-05-06
  • 打赏
  • 举报
回复
这有一段很早的代码,可以根据需要完善一下。

//CorMax 数据最大值
//CorMin 数据最小值
//CorNumber 刻度个数
public void Standard(ref double CorMax, ref double CorMin, int CorNumber)
{
double tmpMax, tmpMin;
double CorStep, tmpStep;
int tmpNumber;
double temp;
int extraNumber;
if (CorMax > CorMin)
{
//计算原始步长
CorStep = (CorMax - CorMin) / CorNumber;

//计算步长的数量级
if (Math.Pow(10, (int)(Math.Log(CorStep) / Math.Log(10))) == CorStep)
{
temp = Math.Pow(10, (int)(Math.Log(CorStep) / Math.Log(10)));
}
else
{
temp = Math.Pow(10, (int)(Math.Log(CorStep) / Math.Log(10)) + 1);
}


//将步长修正到(O,1)问
tmpStep = CorStep / temp;
//选取规范步长
if (tmpStep >= 0 && tmpStep <= 0.1)
{
tmpStep = 0.1;
}
else if (tmpStep >= 0.100001 && tmpStep <= 0.2)
{
tmpStep = 0.2;
}
else if (tmpStep >= 0.200001 && tmpStep <= 0.25)
{
tmpStep = 0.25;
}
else if (tmpStep >= 0.25001 && tmpStep <= 0.5)
{
tmpStep = 0.5;
}
else
{
tmpStep = 1;
}

//规范步长按数量级还原
tmpStep = tmpStep * temp;
//修正起点值
if ((int)(CorMin / tmpStep) != (CorMin / tmpStep))
{
CorMin = (int)(CorMin / tmpStep) * tmpStep;
}


if ((int)(CorMax / tmpStep) != (CorMax / tmpStep))
{
CorMax = (int)(CorMax / tmpStep + 1) * tmpStep;
}

//看最后修正是否必要,包括:刻度数、起点值、终点值

tmpNumber = Convert.ToInt32((CorMax - CorMin) / tmpStep);

if (tmpNumber < CorNumber)
{
extraNumber = CorNumber - tmpNumber;
if (extraNumber % 2 == 0)
{
CorMax = CorMax + tmpStep * (int)(extraNumber / 2);
}
else
{

CorMax = CorMax + tmpStep * (int)(extraNumber / 2 + 1);

}
CorMin = CorMin - tmpStep * (int)(extraNumber / 2);

if (CorMin < 0)
{
CorMax = CorMax - CorMin;
CorMin = 0;
}

}
CorNumber = tmpNumber;
}
}
Demo+ 2011-05-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wuxing2006 的回复:]
看了半天,还是不懂你在说什么
你要的是一个数,要计算出他在哪个区间,然后不要靠近这个区间的上下限,如 3 在 1-3之间,结果为2.9 ?
[/Quote]

比如:数据库里有一小时的数据,每分钟一条,现在要画出这一小时数据的曲线,Y轴用来表示数据的大小,但是Y轴的刻度需要根据实际数据的大小自动调整,(如:数据中最小值为0.016,最大值为0.875.)
现在用Y轴刻度来表示这个数据区间的大小,我的直接做法是Y轴最小值0.016,Y轴最大值0.875,再根据实际数据画点的位置,但是我想在Y轴的最小值下面和最大值上面都留一小部分空间,为的就是不让极值的点画在边上,需要一个类似这样的算法.
wuxing2006 2011-05-05
  • 打赏
  • 举报
回复
看了半天,还是不懂你在说什么
你要的是一个数,要计算出他在哪个区间,然后不要靠近这个区间的上下限,如 3 在 1-3之间,结果为2.9 ?
Demo+ 2011-05-05
  • 打赏
  • 举报
回复
Demo+ 2011-05-05
  • 打赏
  • 举报
回复
没有高手路过吗~?
Demo+ 2011-05-05
  • 打赏
  • 举报
回复

这么快沉了~ 在线等高手指点!

111,076

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧