//Calculate the min and max value of the each axis by whole data;
        public void CalculateLabelRange()
        {
            labelRange = new List <LabelMinMax>();
            for (int i = 0; i < labelNum; i++)
            {
                float _min, _max, _minRange, _maxRange;
                float tmp = data[0].data[i];
                _max      = -0xffffffff;
                _min      = _minRange = 0xffffffff;
                _maxRange = 0;


                for (int j = 0; j < data.Count; j++)
                {
                    _max = Math.Max(_max, data[j].data[i]);
                    _min = Math.Min(_min, data[j].data[i]);

                    //_maxRange = Math.Max(_maxRange, Math.Abs(pick_data[j].data[i] - tmp));
                    //_minRange = Math.Min(_minRange, Math.Abs(pick_data[j].data[i] - tmp));

                    tmp = data[j].data[i];
                }



                LabelMinMax lmm = new LabelMinMax(_max, _min, 5, false);
                labelRange.Add(lmm);
            }
        }
        //Calculate the min and max value of the each axis by condition
        public void CalculateLabelRange(List <Data> pick_data)
        {
            labelRange = new List <LabelMinMax>();
            for (int i = 0; i < labelNum; i++)
            {
                float _min, _max, _minRange, _maxRange;
                float tmp = pick_data[0].data[i];
                _max      = -0xffffffff;
                _min      = _minRange = 0xffffffff;
                _maxRange = 0;


                for (int j = 0; j < pick_data.Count; j++)
                {
                    _max = Math.Max(_max, pick_data[j].data[i]);
                    _min = Math.Min(_min, pick_data[j].data[i]);


                    _maxRange = Math.Max(_maxRange, Math.Abs(pick_data[j].data[i] - tmp));
                    _minRange = Math.Min(_minRange, Math.Abs(pick_data[j].data[i] - tmp));

                    tmp = pick_data[j].data[i];
                }


                if (_min == _max)
                {
                    //LabelMinMax lmm = new LabelMinMax(_max + Math.Abs(0.1f*_max), Math.Abs(_min - 0.1f*_min), 2);
                    LabelMinMax lmm = new LabelMinMax(_max + Math.Abs(0.1f * _max), Math.Abs(_min - 0.1f * _min), 2);
                    labelRange.Add(lmm);
                }
                else
                {
                    //LabelMinMax lmm = new LabelMinMax(_max, _min , Math.Min((int)((_max - _min) / ((_maxRange + _minRange) / 2))+2,10));
                    LabelMinMax lmm = new LabelMinMax(_max + _minRange, _min - _minRange, Math.Min((int)((_max - _min) / ((_maxRange + _minRange) / 2)) + 2, 5), false);
                    labelRange.Add(lmm);
                }

                //LabelMinMax lmm = new LabelMinMax(_max + Math.Abs(0.1f * _max), Math.Abs(_min - 0.1f * _min), (int)((_max - _min) / ((_maxRange + _minRange) / 2)) + 2);
                //labelRange.Add(lmm);
            }
        }
        public List <float> GetDateLabel(int n)
        {
            LabelMinMax lmm = new LabelMinMax(n + 1, 0, 1, false);

            return(lmm.value);
        }
        public void CalculateLabelRange(List <Data> pick_data, List <int> index, List <float> w)
        {
            labelRange = new List <LabelMinMax>();
            for (int i = 0; i < labelNum; i++)
            {
                LabelMinMax lmm = new LabelMinMax();
                labelRange.Add(lmm);
            }



            int indexA, indexB;

            indexA = index[0];
            indexB = index[1];
            float _minA, _maxA, _minRangeA, _maxRangeA;
            float _minB, _maxB, _minRangeB, _maxRangeB;
            float _minTmp, _maxTmp, _minRangeTmp, _maxRangeTmp;

            _maxA      = -0xffffffff;
            _minA      = _minRangeA = 0xffffffff;
            _maxRangeA = 0;

            _maxB      = -0xffffffff;
            _minB      = _minRangeB = 0xffffffff;
            _maxRangeB = 0;

            _maxTmp      = -0xffffffff;
            _minTmp      = _minRangeTmp = 0xffffffff;
            _maxRangeTmp = 0;
            float tmpA = pick_data[0].data[indexA];
            float tmpB = pick_data[0].data[indexB];

            for (int j = 0; j < pick_data.Count; j++)
            {
                //if (pick_data[j].data[indexA] * w[0] + w[1] - pick_data[j].data[indexB] < 1) ;

                //Console.WriteLine(pick_data[j].data[indexA] + " " + pick_data[j].data[indexB] + " " + w[0] + " " + w[1]);
                //Console.WriteLine((pick_data[j].data[indexA] * w[0] + w[1] - pick_data[j].data[indexB]));
                _maxA = Math.Max(_maxA, pick_data[j].data[indexA]);
                _minA = Math.Min(_minA, pick_data[j].data[indexA]);

                _maxTmp = Math.Max(_maxTmp, pick_data[j].data[indexA] * w[0] + w[1]);
                _minTmp = Math.Min(_minTmp, pick_data[j].data[indexA] * w[0] + w[1]);

                _maxB = Math.Max(_maxB, pick_data[j].data[indexB]);
                _minB = Math.Min(_minB, pick_data[j].data[indexB]);

                _maxRangeA = Math.Max(_maxRangeA, Math.Abs(pick_data[j].data[indexA] - tmpA));
                _minRangeA = Math.Min(_minRangeA, Math.Abs(pick_data[j].data[indexA] - tmpA));

                _maxRangeB = Math.Max(_maxRangeB, Math.Abs(pick_data[j].data[indexB] - tmpB));
                _minRangeB = Math.Min(_minRangeB, Math.Abs(pick_data[j].data[indexB] - tmpB));
            }



            if (_maxB > _maxTmp)
            {
                float x = _maxTmp - _minTmp;
                float y = _maxB - _maxTmp;

                _maxA += (_maxA - _minA) * (y / x);
            }
            if (_minB < _minTmp)
            {
                float x = _maxTmp - _minTmp;
                float y = _minTmp - _minB;


                _minA -= (_maxA - _minA) * (y / x);
            }

            _maxB = Math.Max(_maxB, _maxTmp);
            _minB = Math.Min(_minB, _minTmp);


            //_maxB = _maxTmp;
            //_minB = _minTmp;
            if (_minA == _maxA)
            {
                //LabelMinMax lmm = new LabelMinMax(_max + Math.Abs(0.1f*_max), Math.Abs(_min - 0.1f*_min), 2);
                LabelMinMax lmm = new LabelMinMax(_maxA + Math.Abs(0.1f * _maxA), Math.Abs(_minA - 0.1f * _minA), 2);
                labelRange[indexA] = lmm;
            }
            else
            {
                //LabelMinMax lmm = new LabelMinMax(_max, _min , Math.Min((int)((_max - _min) / ((_maxRange + _minRange) / 2))+2,10));
                LabelMinMax lmm = new LabelMinMax(_maxA + _minRangeA, _minA - _minRangeA, Math.Min((int)((_maxA - _minA) / ((_maxRangeA + _minRangeA) / 2)) + 2, 5), false);
                labelRange[indexA] = lmm;
            }

            if (_minB == _maxB)
            {
                //LabelMinMax lmm = new LabelMinMax(_max + Math.Abs(0.1f*_max), Math.Abs(_min - 0.1f*_min), 2);
                LabelMinMax lmm = new LabelMinMax(_maxB + Math.Abs(0.1f * _maxB), Math.Abs(_minB - 0.1f * _minB), 2);
                labelRange[indexB] = lmm;
            }
            else
            {
                //LabelMinMax lmm = new LabelMinMax(_max, _min , Math.Min((int)((_max - _min) / ((_maxRange + _minRange) / 2))+2,10));
                LabelMinMax lmm = new LabelMinMax(_maxB + _minRangeB, _minB - _minRangeB, Math.Min((int)((_maxB - _minB) / ((_maxRangeB + _minRangeB) / 2)) + 2, 5), false);
                labelRange[indexB] = lmm;
            }
            //LabelMinMax lmm = new LabelMinMax(_max + Math.Abs(0.1f * _max), Math.Abs(_min - 0.1f * _min), (int)((_max - _min) / ((_maxRange + _minRange) / 2)) + 2);
            //labelRange.Add(lmm);
        }