1. 程式人生 > >規範化軸的最大最小值 和 間隔

規範化軸的最大最小值 和 間隔

想做一個根據時間點得到的資料繪製曲線的功能模組,現在遇到一個問題希望可以得到大家的指點.
Y軸是資料軸,如:在某個時間段內資料區間是 0.016 - 0.875

希望得到的效果是Y軸刻度根據資料區間不同最大值和最小值可以自動調整的,並且希望上,下都可以留出一小部分空間(就是最大值的點不要靠頂部顯示,最小值的點也不要靠底部顯示),類似上面的資料Y軸可以做成0-1或者0.1-0.9(極值相關不太遠就行) 希望可以得到一個這類問題的具體演算法.線上等,請高手指點...

------Solutions------

這麼快沉了~   線上等高手指點! 
------Solutions------
沒有高手路過嗎~?   
------Solutions------

------Solutions------
看了半天,還是不懂你在說什麼
你要的是一個數,要計算出他在哪個區間,然後不要靠近這個區間的上下限,如 3 在 1-3之間,結果為2.9  ? 
------Solutions------

引用 4 樓 wuxing2006 的回覆:
看了半天,還是不懂你在說什麼
你要的是一個數,要計算出他在哪個區間,然後不要靠近這個區間的上下限,如 3 在 1-3之間,結果為2.9 ?


比如:資料庫裡有一小時的資料,每分鐘一條,現在要畫出這一小時資料的曲線,Y軸用來表示資料的大小,但是Y軸的刻度需要根據實際資料的大小自動調整,(如:資料中最小值為0.016,最大值為0.875.)
現在用Y軸刻度來表示這個資料區間的大小,我的直接做法是Y軸最小值0.016,Y軸最大值0.875,再根據實際資料畫點的位置,但是我想在Y軸的最小值下面和最大值上面都留一小部分空間,為的就是不讓極值的點畫在邊上,需要一個類似這樣的演算法. 

------Solutions------
這有一段很早的程式碼,可以根據需要完善一下。

   //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;
            }
        }