private void UpdateXYPosition(GridCoord grid, bool isY, Axis axis, Axis relativedAxis, int i, float categoryWidth, float barWidth, bool isStack, double value, ref float pX, ref float pY) { if (isY) { if (axis.IsCategory()) { pY = grid.context.y + i * categoryWidth + (axis.boundaryGap ? 0 : -categoryWidth * 0.5f); } else { if (axis.context.minMaxRange <= 0) { pY = grid.context.y; } else { var valueLen = (float)((value - axis.context.minValue) / axis.context.minMaxRange) * grid.context.height; pY = grid.context.y + valueLen - categoryWidth * 0.5f; } } pX = AxisHelper.GetAxisValuePosition(grid, relativedAxis, categoryWidth, 0); if (isStack) { for (int n = 0; n < m_StackSerieData.Count - 1; n++) { pX += m_StackSerieData[n][i].context.stackHeight; } } } else { if (axis.IsCategory()) { pX = grid.context.x + i * categoryWidth + (axis.boundaryGap ? 0 : -categoryWidth * 0.5f); } else { if (axis.context.minMaxRange <= 0) { pX = grid.context.x; } else { var valueLen = (float)((value - axis.context.minValue) / axis.context.minMaxRange) * grid.context.width; pX = grid.context.x + valueLen - categoryWidth * 0.5f; } } pY = AxisHelper.GetAxisValuePosition(grid, relativedAxis, categoryWidth, 0); if (isStack) { for (int n = 0; n < m_StackSerieData.Count - 1; n++) { pY += m_StackSerieData[n][i].context.stackHeight; } } } }
private static float GetDataHig(Axis axis, double value, float totalWidth) { if (axis.IsLog()) { int minIndex = axis.GetLogMinIndex(); float nowIndex = axis.GetLogValue(value); return((nowIndex - minIndex) / axis.splitNumber * totalWidth); } else if (axis.IsCategory()) { if (axis.boundaryGap) { float tick = (float)(totalWidth / (axis.context.minMaxRange + 1)); return(tick / 2 + (float)(value - axis.context.minValue) * tick); } else { return((float)((value - axis.context.minValue) / axis.context.minMaxRange * totalWidth)); } } else { return((float)((value - axis.context.minValue) / axis.context.minMaxRange * totalWidth)); } }
private void SetTooltipIndicatorLabel(Tooltip tooltip, Axis axis, ChartLabel label) { if (label == null) { return; } if (double.IsPositiveInfinity(axis.context.pointerValue)) { return; } label.SetActive(true); label.SetTextActive(true); label.SetPosition(axis.context.pointerLabelPosition); if (axis.IsCategory()) { label.SetText(axis.GetData((int)axis.context.pointerValue)); } else { label.SetText(axis.context.pointerValue.ToString("f2")); } var textColor = axis.axisLabel.textStyle.GetColor(chart.theme.axis.textColor); if (ChartHelper.IsClearColor(tooltip.indicatorLabelStyle.background.color)) { label.color = textColor; } else { label.color = tooltip.indicatorLabelStyle.background.color; } label.SetTextColor(Color.white); }
public static Color32 GetLineGradientColor(VisualMap visualMap, Vector3 pos, GridCoord grid, Axis axis, Axis relativedAxis, Color32 defaultColor) { double value = 0; double min = 0; double max = 0; if (visualMap.dimension == 0) { min = axis.context.minValue; max = axis.context.maxValue; if (axis.IsCategory() && axis.boundaryGap) { float startX = grid.context.x + axis.context.scaleWidth / 2; value = (min + (pos.x - startX) / (grid.context.width - axis.context.scaleWidth) * (max - min)); if (visualMap.IsPiecewise()) { value = (int)value; } } else { value = min + (pos.x - grid.context.x) / grid.context.width * (max - min); } } else { min = relativedAxis.context.minValue; max = relativedAxis.context.maxValue; if (relativedAxis.IsCategory() && relativedAxis.boundaryGap) { float startY = grid.context.y + relativedAxis.context.scaleWidth / 2; value = (min + (pos.y - startY) / (grid.context.height - relativedAxis.context.scaleWidth) * (max - min)); if (visualMap.IsPiecewise()) { value = (int)value; } } else { value = min + (pos.y - grid.context.y) / grid.context.height * (max - min); } } var color = visualMap.GetColor(value); if (ChartHelper.IsClearColor(color)) { return(defaultColor); } else { if (color.a != 0) { color.a = defaultColor.a; } return(color); } }
private void UpdateXYPosition(GridCoord grid, bool isY, Axis axis, Axis relativedAxis, int i, float categoryWidth, float barWidth, double value, ref float pX, ref float pY) { if (isY) { if (axis.IsCategory()) { pY = grid.context.y + i * categoryWidth + (axis.boundaryGap ? 0 : -categoryWidth * 0.5f); } else { if (axis.context.minMaxRange <= 0) { pY = grid.context.y; } else { pY = grid.context.y + (float)((value - axis.context.minValue) / axis.context.minMaxRange) * (grid.context.height - barWidth); } } pX = AxisHelper.GetAxisValuePosition(grid, relativedAxis, categoryWidth, 0); } else { if (axis.IsCategory()) { pX = grid.context.x + i * categoryWidth + (axis.boundaryGap ? 0 : -categoryWidth * 0.5f); } else { if (axis.context.minMaxRange <= 0) { pX = grid.context.x; } else { pX = grid.context.x + (float)((value - axis.context.minValue) / axis.context.minMaxRange) * (grid.context.width - barWidth); } } pY = AxisHelper.GetAxisValuePosition(grid, relativedAxis, categoryWidth, 0); } }
private void GetStartEndPos(Axis xAxis, Axis yAxis, GridCoord grid, double value, ref Vector3 sp, ref Vector3 ep) { if (xAxis.IsCategory()) { var pY = AxisHelper.GetAxisPosition(grid, yAxis, value); sp = new Vector3(grid.context.x, pY); ep = new Vector3(grid.context.x + grid.context.width, pY); } else { var pX = AxisHelper.GetAxisPosition(grid, xAxis, value); sp = new Vector3(pX, grid.context.y); ep = new Vector3(pX, grid.context.y + grid.context.height); } }
public static bool NeedShowSplit(Axis axis) { if (!axis.show) { return(false); } if (axis.IsCategory() && axis.GetDataList().Count <= 0) { return(false); } else { return(true); } }
private Vector3 GetPosition(Axis xAxis, Axis yAxis, GridCoord grid, double value, bool start) { if (yAxis.IsCategory()) { var pX = AxisHelper.GetAxisPosition(grid, xAxis, value); return(start ? new Vector3(pX, grid.context.y + grid.context.height) : new Vector3(pX, grid.context.y)); } else { var pY = AxisHelper.GetAxisPosition(grid, yAxis, value); return(start ? new Vector3(grid.context.x, pY + grid.context.height) : new Vector3(grid.context.x + grid.context.width, pY)); } }
/// <summary> /// 获得分割线条数 /// </summary> /// <param name="dataZoom"></param> /// <returns></returns> public static int GetScaleNumber(Axis axis, float coordinateWidth, DataZoom dataZoom = null) { int splitNum = GetSplitNumber(axis, coordinateWidth, dataZoom); if (splitNum == 0) { return(0); } if (axis.IsCategory()) { var dataCount = axis.GetDataList(dataZoom).Count; var scaleNum = 0; if (axis.boundaryGap) { scaleNum = dataCount > 2 && dataCount % splitNum == 0 ? splitNum + 1 : splitNum + 2; } else { if (dataCount < splitNum) { scaleNum = splitNum; } else { scaleNum = dataCount > 2 && dataCount % splitNum == 0 ? splitNum : splitNum + 1; } } return(scaleNum); } else if (axis.IsTime()) { return(splitNum); } else { return(splitNum + 1); } }
private static float GetAxisPositionInternal(GridCoord grid, Axis axis, float scaleWidth, double value, bool includeGridXY, bool realLength) { var isY = axis is YAxis; var gridHeight = isY ? grid.context.height : grid.context.width; var gridXY = isY ? grid.context.y : grid.context.x; if (axis.IsLog()) { int minIndex = axis.GetLogMinIndex(); float nowIndex = axis.GetLogValue(value); return(includeGridXY ? gridXY + (nowIndex - minIndex) / axis.splitNumber * gridHeight : (nowIndex - minIndex) / axis.splitNumber * gridHeight); } else if (axis.IsCategory()) { var categoryIndex = (int)value; return(includeGridXY ? gridXY + (axis.boundaryGap ? scaleWidth / 2 : 0) + scaleWidth * categoryIndex : (axis.boundaryGap ? scaleWidth / 2 : 0) + scaleWidth * categoryIndex); } else { var yDataHig = 0f; if (axis.context.minMaxRange != 0) { if (realLength) { yDataHig = (float)(value * gridHeight / axis.context.minMaxRange); } else { yDataHig = (float)((value - axis.context.minValue) / axis.context.minMaxRange * gridHeight); } } return(includeGridXY ? gridXY + yDataHig : yDataHig); } }
public static float GetAxisPosition(GridCoord grid, Axis axis, double value, int dataCount = 0, DataZoom dataZoom = null) { var gridHeight = axis is YAxis ? grid.context.height : grid.context.width; var gridXY = axis is YAxis ? grid.context.y : grid.context.x; if (axis.IsCategory()) { if (dataCount == 0) { dataCount = axis.data.Count; } var categoryIndex = (int)value; var scaleWid = AxisHelper.GetDataWidth(axis, gridHeight, dataCount, dataZoom); float startY = gridXY + (axis.boundaryGap ? scaleWid / 2 : 0); return(startY + scaleWid * categoryIndex); } else { var yDataHig = (axis.context.minMaxRange == 0) ? 0f : (float)((value - axis.context.minValue) / axis.context.minMaxRange * gridHeight); return(gridXY + yDataHig); } }
/// <summary> /// 获得分割段宽度 /// </summary> /// <param name="coordinateWidth"></param> /// <param name="dataZoom"></param> /// <returns></returns> public static float GetScaleWidth(Axis axis, float coordinateWidth, int index, DataZoom dataZoom = null) { if (index < 0) { return(0); } int num = GetScaleNumber(axis, coordinateWidth, dataZoom); int splitNum = GetSplitNumber(axis, coordinateWidth, dataZoom); if (num <= 0) { num = 1; } if (axis.IsTime() || axis.IsValue()) { var value = axis.GetLabelValue(index); var lastValue = axis.GetLabelValue(index - 1); return(axis.context.minMaxRange == 0 ? 0 : (float)(coordinateWidth * (value - lastValue) / axis.context.minMaxRange)); } else { var data = axis.GetDataList(dataZoom); if (axis.IsCategory() && data.Count > 0) { var count = axis.boundaryGap ? data.Count : data.Count - 1; int tick = count / splitNum; if (count <= 0) { return(0); } var each = coordinateWidth / count; if (axis.insertDataToHead) { var max = axis.boundaryGap ? splitNum : splitNum - 1; if (index == 1) { if (axis.axisTick.alignWithLabel) { return(each * tick); } else { return(coordinateWidth - each * tick * max); } } else { if (count < splitNum) { return(each); } else { return(each * (count / splitNum)); } } } else { var max = axis.boundaryGap ? num - 1 : num; if (index >= max) { if (axis.axisTick.alignWithLabel) { return(each * tick); } else { return(coordinateWidth - each * tick * (index - 1)); } } else { if (count < splitNum) { return(each); } else { return(each * (count / splitNum)); } } } } else { if (splitNum <= 0) { return(0); } else { return(coordinateWidth / splitNum); } } } }