Пример #1
0
        public static void AutoSetLineMinMax(VisualMap visualMap, Serie serie, XAxis xAxis, YAxis yAxis)
        {
            if (!IsNeedGradient(visualMap) || !visualMap.autoMinMax)
            {
                return;
            }
            float min = 0;
            float max = 0;

            switch (visualMap.direction)
            {
            case VisualMap.Direction.Default:
            case VisualMap.Direction.X:
                min = xAxis.IsCategory() ? 0 : xAxis.runtimeMinValue;
                max = xAxis.IsCategory() ? serie.dataCount : xAxis.runtimeMaxValue;
                SetMinMax(visualMap, min, max);
                break;

            case VisualMap.Direction.Y:
                min = yAxis.IsCategory() ? 0 : yAxis.runtimeMinValue;
                max = yAxis.IsCategory() ? serie.dataCount : yAxis.runtimeMaxValue;
                SetMinMax(visualMap, min, max);
                break;
            }
        }
Пример #2
0
        private void DrawPiecewiseVisualMap(VertexHelper vh, VisualMap visualMap)
        {
            var centerPos = chart.chartPosition + visualMap.location.GetPosition(chart.chartWidth, chart.chartHeight);
            var pos1      = Vector3.zero;
            var pos2      = Vector3.zero;
            var dir       = Vector3.zero;
            var halfWid   = visualMap.itemWidth / 2;
            var halfHig   = visualMap.itemHeight / 2;
            var splitNum  = visualMap.runtimeInRange.Count;
            var colors    = visualMap.runtimeInRange;

            switch (visualMap.orient)
            {
            case Orient.Horizonal:
                for (int i = 0; i < visualMap.pieces.Count; i++)
                {
                    var piece = visualMap.pieces[i];
                }
                break;

            case Orient.Vertical:
                var each = visualMap.itemHeight + visualMap.itemGap;
                for (int i = 0; i < visualMap.pieces.Count; i++)
                {
                    var piece = visualMap.pieces[i];
                    var pos   = new Vector3(centerPos.x, centerPos.y - each * i);
                    UGL.DrawRectangle(vh, pos, halfWid, halfHig, piece.color);
                }
                break;
            }
        }
Пример #3
0
        private void CheckVisualMap(VisualMap visualMap)
        {
            if (visualMap == null || !visualMap.enable || !visualMap.show)
            {
                return;
            }
            Vector2 local;

            if (chart.canvas == null)
            {
                return;
            }

            if (!chart.ScreenPointToChartPoint(Input.mousePosition, out local))
            {
                if (visualMap.runtimeSelectedIndex >= 0)
                {
                    visualMap.runtimeSelectedIndex = -1;
                    chart.RefreshChart();
                }
                return;
            }
            if (local.x < chart.chartX || local.x > chart.chartX + chart.chartWidth ||
                local.y < chart.chartY || local.y > chart.chartY + chart.chartHeight ||
                !visualMap.IsInRangeRect(local, chart.chartRect))
            {
                if (visualMap.runtimeSelectedIndex >= 0)
                {
                    visualMap.runtimeSelectedIndex = -1;
                    chart.RefreshChart();
                }
                return;
            }
            var    pos1          = Vector3.zero;
            var    pos2          = Vector3.zero;
            var    halfHig       = visualMap.itemHeight / 2;
            var    centerPos     = chart.chartPosition + visualMap.location.GetPosition(chart.chartWidth, chart.chartHeight);
            var    selectedIndex = -1;
            double value         = 0;

            switch (visualMap.orient)
            {
            case Orient.Horizonal:
                pos1          = centerPos + Vector3.left * halfHig;
                pos2          = centerPos + Vector3.right * halfHig;
                value         = visualMap.min + (local.x - pos1.x) / (pos2.x - pos1.x) * (visualMap.max - visualMap.min);
                selectedIndex = visualMap.GetIndex(value);
                break;

            case Orient.Vertical:
                pos1          = centerPos + Vector3.down * halfHig;
                pos2          = centerPos + Vector3.up * halfHig;
                value         = visualMap.min + (local.y - pos1.y) / (pos2.y - pos1.y) * (visualMap.max - visualMap.min);
                selectedIndex = visualMap.GetIndex(value);
                break;
            }
            visualMap.runtimeSelectedValue = value;
            visualMap.runtimeSelectedIndex = selectedIndex;
            chart.RefreshChart();
        }
        public static Color32 GetLineGradientColor(VisualMap visualMap, Vector3 pos, CoordinateChart chart, Axis axis,
                                                   Color32 defaultColor)
        {
            float value = 0;
            var   min   = 0f;
            var   max   = 0f;

            if (visualMap.dimension == 0)
            {
                min = axis.runtimeMinValue;
                max = axis.runtimeMaxValue;
                var grid = chart.GetAxisGridOrDefault(axis);
                if (axis.IsCategory() && axis.boundaryGap)
                {
                    float startX = grid.runtimeX + axis.runtimeScaleWidth / 2;
                    value = (int)(min + (pos.x - startX) / (grid.runtimeWidth - axis.runtimeScaleWidth) * (max - min));
                }
                else
                {
                    value = min + (pos.x - grid.runtimeX) / grid.runtimeWidth * (max - min);
                }
            }
            else
            {
                Axis yAxis;
                if (axis is YAxis)
                {
                    yAxis = chart.xAxes[axis.index];
                    min   = yAxis.runtimeMinValue;
                    max   = yAxis.runtimeMaxValue;
                }
                else
                {
                    yAxis = chart.yAxes[axis.index];
                    min   = yAxis.runtimeMinValue;
                    max   = yAxis.runtimeMaxValue;
                }
                var grid = chart.GetAxisGridOrDefault(axis);
                if (yAxis.IsCategory() && yAxis.boundaryGap)
                {
                    float startY = grid.runtimeY + yAxis.runtimeScaleWidth / 2;
                    value = (int)(min + (pos.y - startY) / (grid.runtimeHeight - yAxis.runtimeScaleWidth) * (max - min));
                }
                else
                {
                    value = min + (pos.y - grid.runtimeY) / grid.runtimeHeight * (max - min);
                }
            }
            var color = visualMap.GetColor(value);

            if (ChartHelper.IsClearColor(color))
            {
                return(defaultColor);
            }
            else
            {
                return(color);
            }
        }
Пример #5
0
 public static bool IsNeedGradient(VisualMap visualMap)
 {
     if (!visualMap.enable || visualMap.inRange.Count <= 0)
     {
         return(false);
     }
     return(true);
 }
Пример #6
0
        public static int GetDimension(VisualMap visualMap, int serieDataCount)
        {
            var dimension = visualMap.enable && visualMap.dimension >= 0 ? visualMap.dimension : serieDataCount - 1;

            if (dimension > serieDataCount - 1)
            {
                dimension = serieDataCount - 1;
            }
            return(dimension);
        }
Пример #7
0
 protected void OnDragVisualMapEnd(VisualMap visualMap)
 {
     if (!visualMap.enable || !visualMap.show || !visualMap.calculable)
     {
         return;
     }
     if (visualMap.runtimeMinDrag || visualMap.runtimeMaxDrag)
     {
         chart.RefreshChart();
         visualMap.runtimeMinDrag = false;
         visualMap.runtimeMaxDrag = false;
     }
 }
Пример #8
0
 public static void SetMinMax(VisualMap visualMap, float min, float max)
 {
     if (visualMap.enable && (visualMap.min != min || visualMap.max != max))
     {
         if (max >= min)
         {
             visualMap.min = min;
             visualMap.max = max;
         }
         else
         {
             throw new Exception("SetMinMax:max < min:" + min + "," + max);
         }
     }
 }
 public static void GetLineGradientColor(VisualMap visualMap, float xValue, float yValue,
                                         out Color32 startColor, out Color32 toColor)
 {
     startColor = ChartConst.clearColor32;
     toColor    = ChartConst.clearColor32;
     if (visualMap.dimension == 0)
     {
         startColor = visualMap.IsPiecewise() ? visualMap.GetColor(xValue) : visualMap.GetColor(xValue - 1);
         toColor    = visualMap.IsPiecewise() ? startColor : visualMap.GetColor(xValue);
     }
     else
     {
         startColor = visualMap.IsPiecewise() ? visualMap.GetColor(yValue) : visualMap.GetColor(yValue - 1);
         toColor    = visualMap.IsPiecewise() ? startColor : visualMap.GetColor(yValue);
     }
 }
Пример #10
0
        public static void GetLineGradientColor(VisualMap visualMap, float xValue, float yValue,
                                                out Color32 startColor, out Color32 toColor)
        {
            startColor = ChartConst.clearColor32;
            toColor    = ChartConst.clearColor32;
            switch (visualMap.direction)
            {
            case VisualMap.Direction.Default:
            case VisualMap.Direction.X:
                startColor = visualMap.IsPiecewise() ? visualMap.GetColor(xValue) : visualMap.GetColor(xValue - 1);
                toColor    = visualMap.IsPiecewise() ? startColor : visualMap.GetColor(xValue);
                break;

            case VisualMap.Direction.Y:
                startColor = visualMap.IsPiecewise() ? visualMap.GetColor(yValue) : visualMap.GetColor(yValue - 1);
                toColor    = visualMap.IsPiecewise() ? startColor : visualMap.GetColor(yValue);
                break;
            }
        }
Пример #11
0
        internal static Color32 GetLineGradientColor(VisualMap visualMap, Vector3 pos, CoordinateChart chart, Axis axis, Color32 defaultColor)
        {
            float value = 0;

            switch (visualMap.direction)
            {
            case VisualMap.Direction.Default:
            case VisualMap.Direction.X:
                var min  = axis.runtimeMinValue;
                var max  = axis.runtimeMaxValue;
                var grid = chart.GetAxisGridOrDefault(axis);
                value = min + (pos.x - grid.runtimeX) / grid.runtimeWidth * (max - min);
                break;

            case VisualMap.Direction.Y:
                if (axis is YAxis)
                {
                    var yAxis = chart.xAxes[axis.index];
                    min = yAxis.runtimeMinValue;
                    max = yAxis.runtimeMaxValue;
                }
                else
                {
                    var yAxis = chart.yAxes[axis.index];
                    min = yAxis.runtimeMinValue;
                    max = yAxis.runtimeMaxValue;
                }
                grid  = chart.GetAxisGridOrDefault(axis);
                value = min + (pos.y - grid.runtimeY) / grid.runtimeHeight * (max - min);
                break;
            }
            var color = visualMap.GetColor(value);

            if (ChartHelper.IsClearColor(color))
            {
                return(defaultColor);
            }
            else
            {
                return(color);
            }
        }
Пример #12
0
        protected void OnDragVisualMapStart(VisualMap visualMap)
        {
            if (!visualMap.enable || !visualMap.show || !visualMap.calculable)
            {
                return;
            }
            var inMinRect = visualMap.IsInRangeMinRect(chart.pointerPos, chart.chartRect, chart.theme.visualMap.triangeLen);
            var inMaxRect = visualMap.IsInRangeMaxRect(chart.pointerPos, chart.chartRect, chart.theme.visualMap.triangeLen);

            if (inMinRect || inMaxRect)
            {
                if (inMinRect)
                {
                    visualMap.runtimeMinDrag = true;
                }
                else
                {
                    visualMap.runtimeMaxDrag = true;
                }
            }
        }
        public static void AutoSetLineMinMax(VisualMap visualMap, Serie serie, XAxis xAxis, YAxis yAxis)
        {
            if (!IsNeedGradient(visualMap) || !visualMap.autoMinMax)
            {
                return;
            }
            float min = 0;
            float max = 0;

            if (visualMap.dimension == 0)
            {
                min = xAxis.IsCategory() ? 0 : xAxis.runtimeMinValue;
                max = xAxis.IsCategory() ? serie.dataCount - 1 : xAxis.runtimeMaxValue;
                SetMinMax(visualMap, min, max);
            }
            else
            {
                min = yAxis.IsCategory() ? 0 : yAxis.runtimeMinValue;
                max = yAxis.IsCategory() ? serie.dataCount - 1 : yAxis.runtimeMaxValue;
                SetMinMax(visualMap, min, max);
            }
        }
Пример #14
0
        protected void OnDragVisualMap(VisualMap visualMap)
        {
            if (!visualMap.enable || !visualMap.show || !visualMap.calculable)
            {
                return;
            }
            if (!visualMap.runtimeMinDrag && !visualMap.runtimeMaxDrag)
            {
                return;
            }

            var value = visualMap.GetValue(chart.pointerPos, chart.chartRect);

            if (visualMap.runtimeMinDrag)
            {
                visualMap.rangeMin = value;
            }
            else
            {
                visualMap.rangeMax = value;
            }
            chart.RefreshChart();
        }
Пример #15
0
        private void DrawContinuousVisualMap(VertexHelper vh, VisualMap visualMap)
        {
            var centerPos  = chart.chartPosition + visualMap.location.GetPosition(chart.chartWidth, chart.chartHeight);
            var pos1       = Vector3.zero;
            var pos2       = Vector3.zero;
            var dir        = Vector3.zero;
            var halfWid    = visualMap.itemWidth / 2;
            var halfHig    = visualMap.itemHeight / 2;
            var xRadius    = 0f;
            var yRadius    = 0f;
            var splitNum   = visualMap.runtimeInRange.Count;
            var splitWid   = visualMap.itemHeight / (splitNum - 1);
            var isVertical = false;
            var colors     = visualMap.runtimeInRange;
            var triangeLen = chart.theme.visualMap.triangeLen;

            switch (visualMap.orient)
            {
            case Orient.Horizonal:
                pos1       = centerPos + Vector3.left * halfHig;
                pos2       = centerPos + Vector3.right * halfHig;
                dir        = Vector3.right;
                xRadius    = splitWid / 2;
                yRadius    = halfWid;
                isVertical = false;
                if (visualMap.calculable)
                {
                    var p0    = pos1 + Vector3.right * visualMap.runtimeRangeMinHeight;
                    var p1    = p0 + Vector3.up * halfWid;
                    var p2    = p0 + Vector3.up * (halfWid + triangeLen);
                    var p3    = p2 + Vector3.left * triangeLen;
                    var color = visualMap.GetColor(visualMap.rangeMin);
                    UGL.DrawTriangle(vh, p1, p2, p3, color);
                    p0    = pos1 + Vector3.right * visualMap.runtimeRangeMaxHeight;
                    p1    = p0 + Vector3.up * halfWid;
                    p2    = p0 + Vector3.up * (halfWid + triangeLen);
                    p3    = p2 + Vector3.right * triangeLen;
                    color = visualMap.GetColor(visualMap.rangeMax);
                    UGL.DrawTriangle(vh, p1, p2, p3, color);
                }
                break;

            case Orient.Vertical:
                pos1       = centerPos + Vector3.down * halfHig;
                pos2       = centerPos + Vector3.up * halfHig;
                dir        = Vector3.up;
                xRadius    = halfWid;
                yRadius    = splitWid / 2;
                isVertical = true;
                if (visualMap.calculable)
                {
                    var p0    = pos1 + Vector3.up * visualMap.runtimeRangeMinHeight;
                    var p1    = p0 + Vector3.right * halfWid;
                    var p2    = p0 + Vector3.right * (halfWid + triangeLen);
                    var p3    = p2 + Vector3.down * triangeLen;
                    var color = visualMap.GetColor(visualMap.rangeMin);
                    UGL.DrawTriangle(vh, p1, p2, p3, color);
                    p0    = pos1 + Vector3.up * visualMap.runtimeRangeMaxHeight;
                    p1    = p0 + Vector3.right * halfWid;
                    p2    = p0 + Vector3.right * (halfWid + triangeLen);
                    p3    = p2 + Vector3.up * triangeLen;
                    color = visualMap.GetColor(visualMap.rangeMax);
                    UGL.DrawTriangle(vh, p1, p2, p3, color);
                }
                break;
            }
            if (visualMap.calculable && (visualMap.rangeMin > visualMap.min ||
                                         visualMap.rangeMax < visualMap.max))
            {
                var rangeMin = visualMap.rangeMin;
                var rangeMax = visualMap.rangeMax;
                var diff     = (visualMap.max - visualMap.min) / (splitNum - 1);
                for (int i = 1; i < splitNum; i++)
                {
                    var splitMin = visualMap.min + (i - 1) * diff;
                    var splitMax = splitMin + diff;
                    if (rangeMin > splitMax || rangeMax < splitMin)
                    {
                        continue;
                    }
                    else if (rangeMin <= splitMin && rangeMax >= splitMax)
                    {
                        var splitPos   = pos1 + dir * (i - 1 + 0.5f) * splitWid;
                        var startColor = colors[i - 1];
                        var toColor    = visualMap.IsPiecewise() ? startColor : colors[i];
                        UGL.DrawRectangle(vh, splitPos, xRadius, yRadius, startColor, toColor, isVertical);
                    }
                    else if (rangeMin > splitMin && rangeMax >= splitMax)
                    {
                        var p0          = pos1 + dir * visualMap.runtimeRangeMinHeight;
                        var splitMaxPos = pos1 + dir * i * splitWid;
                        var splitPos    = p0 + (splitMaxPos - p0) / 2;
                        var startColor  = visualMap.GetColor(visualMap.rangeMin);
                        var toColor     = visualMap.IsPiecewise() ? startColor : colors[i];
                        var yRadius1    = Vector3.Distance(p0, splitMaxPos) / 2;
                        if (visualMap.orient == Orient.Vertical)
                        {
                            UGL.DrawRectangle(vh, splitPos, xRadius, yRadius1, startColor, toColor, isVertical);
                        }
                        else
                        {
                            UGL.DrawRectangle(vh, splitPos, yRadius1, yRadius, startColor, toColor, isVertical);
                        }
                    }
                    else if (rangeMax < splitMax && rangeMin <= splitMin)
                    {
                        var p0          = pos1 + dir * visualMap.runtimeRangeMaxHeight;
                        var splitMinPos = pos1 + dir * (i - 1) * splitWid;
                        var splitPos    = splitMinPos + (p0 - splitMinPos) / 2;
                        var startColor  = colors[i - 1];
                        var toColor     = visualMap.IsPiecewise() ? startColor : visualMap.GetColor(visualMap.rangeMax);
                        var yRadius1    = Vector3.Distance(p0, splitMinPos) / 2;
                        if (visualMap.orient == Orient.Vertical)
                        {
                            UGL.DrawRectangle(vh, splitPos, xRadius, yRadius1, startColor, toColor, isVertical);
                        }
                        else
                        {
                            UGL.DrawRectangle(vh, splitPos, yRadius1, yRadius, startColor, toColor, isVertical);
                        }
                    }
                    else
                    {
                        var p0         = pos1 + dir * visualMap.runtimeRangeMinHeight;
                        var p1         = pos1 + dir * visualMap.runtimeRangeMaxHeight;
                        var splitPos   = (p0 + p1) / 2;
                        var startColor = visualMap.GetColor(visualMap.rangeMin);
                        var toColor    = visualMap.GetColor(visualMap.rangeMax);
                        var yRadius1   = Vector3.Distance(p0, p1) / 2;
                        if (visualMap.orient == Orient.Vertical)
                        {
                            UGL.DrawRectangle(vh, splitPos, xRadius, yRadius1, startColor, toColor, isVertical);
                        }
                        else
                        {
                            UGL.DrawRectangle(vh, splitPos, yRadius1, yRadius, startColor, toColor, isVertical);
                        }
                    }
                }
            }
            else
            {
                for (int i = 1; i < splitNum; i++)
                {
                    var splitPos   = pos1 + dir * (i - 1 + 0.5f) * splitWid;
                    var startColor = colors[i - 1];
                    var toColor    = visualMap.IsPiecewise() ? startColor : colors[i];
                    UGL.DrawRectangle(vh, splitPos, xRadius, yRadius, startColor, toColor, isVertical);
                }
            }

            if (visualMap.rangeMin > visualMap.min)
            {
                var p0 = pos1 + dir * visualMap.runtimeRangeMinHeight;
                UGL.DrawRectangle(vh, pos1, p0, visualMap.itemWidth / 2, chart.theme.visualMap.backgroundColor);
            }
            if (visualMap.rangeMax < visualMap.max)
            {
                var p1 = pos1 + dir * visualMap.runtimeRangeMaxHeight;
                UGL.DrawRectangle(vh, p1, pos2, visualMap.itemWidth / 2, chart.theme.visualMap.backgroundColor);
            }

            if (visualMap.hoverLink)
            {
                if (visualMap.runtimeSelectedIndex >= 0)
                {
                    var p0         = pos1 + dir * visualMap.runtimeRangeMinHeight;
                    var p1         = pos1 + dir * visualMap.runtimeRangeMaxHeight;
                    var pointerPos = chart.pointerPos;
                    if (visualMap.orient == Orient.Vertical)
                    {
                        var p2 = new Vector3(centerPos.x + halfWid, Mathf.Clamp(pointerPos.y + (triangeLen / 2), p0.y, p1.y));
                        var p3 = new Vector3(centerPos.x + halfWid, Mathf.Clamp(pointerPos.y - (triangeLen / 2), p0.y, p1.y));
                        var p4 = new Vector3(centerPos.x + halfWid + triangeLen / 2, pointerPos.y);
                        UGL.DrawTriangle(vh, p2, p3, p4, colors[visualMap.runtimeSelectedIndex]);
                    }
                    else
                    {
                        var p2 = new Vector3(Mathf.Clamp(pointerPos.x + (triangeLen / 2), p0.x, p1.x), centerPos.y + halfWid);
                        var p3 = new Vector3(Mathf.Clamp(pointerPos.x - (triangeLen / 2), p0.x, p1.x), centerPos.y + halfWid);
                        var p4 = new Vector3(pointerPos.x, centerPos.y + halfWid + triangeLen / 2);
                        UGL.DrawTriangle(vh, p2, p3, p4, colors[visualMap.runtimeSelectedIndex]);
                    }
                }
            }
        }