protected void DrawAxisSplit(VertexHelper vh, AxisTheme theme, DataZoom dataZoom, Orient orient, float startX, float startY, float axisLength, float splitLength, Axis relativedAxis = null) { Axis axis = component; var lineColor = axis.splitLine.GetColor(theme.splitLineColor); var lineWidth = axis.splitLine.GetWidth(theme.lineWidth); var lineType = axis.splitLine.GetType(theme.splitLineType); var size = AxisHelper.GetScaleNumber(axis, axisLength, dataZoom); if (axis.IsTime()) { size += 1; if (!ChartHelper.IsEquals(axis.GetLastLabelValue(), axis.context.maxValue)) { size += 1; } } var current = orient == Orient.Horizonal ? startX : startY; for (int i = 0; i < size; i++) { var scaleWidth = AxisHelper.GetScaleWidth(axis, axisLength, axis.IsTime() ? i : i + 1, dataZoom); if (axis.boundaryGap && axis.axisTick.alignWithLabel) { current -= scaleWidth / 2; } if (axis.splitArea.show && i <= size - 1) { if (orient == Orient.Horizonal) { UGL.DrawQuadrilateral(vh, new Vector2(current, startY), new Vector2(current, startY + splitLength), new Vector2(current + scaleWidth, startY + splitLength), new Vector2(current + scaleWidth, startY), axis.splitArea.GetColor(i, theme)); } else { UGL.DrawQuadrilateral(vh, new Vector2(startX, current), new Vector2(startX + splitLength, current), new Vector2(startX + splitLength, current + scaleWidth), new Vector2(startX, current + scaleWidth), axis.splitArea.GetColor(i, theme)); } } if (axis.splitLine.show) { if (axis.splitLine.NeedShow(i)) { if (orient == Orient.Horizonal) { if (relativedAxis == null || !MathUtil.Approximately(current, GetAxisLineXOrY())) { ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, new Vector3(current, startY), new Vector3(current, startY + splitLength), lineColor); } } else { if (relativedAxis == null || !MathUtil.Approximately(current, GetAxisLineXOrY())) { ChartDrawer.DrawLineStyle(vh, lineType, lineWidth, new Vector3(startX, current), new Vector3(startX + splitLength, current), lineColor); } } } } current += scaleWidth; } }
internal static Vector3 GetLabelPosition(int i, Orient orient, Axis axis, Axis relativedAxis, AxisTheme theme, float scaleWid, float axisStartX, float axisStartY, float axisLength, float relativedLength) { var inside = axis.axisLabel.inside; var fontSize = axis.axisLabel.textStyle.GetFontSize(theme); var current = axis.offset; if (axis.IsTime() || axis.IsValue()) { scaleWid = axis.context.minMaxRange != 0 ? axis.GetDistance(axis.GetLabelValue(i), axisLength) : 0; } if (orient == Orient.Horizonal) { if (axis.axisLabel.onZero && relativedAxis != null) { axisStartY += relativedAxis.context.offset; } if (axis.IsTop()) { axisStartY += relativedLength; } if ((inside && axis.IsBottom()) || (!inside && axis.IsTop())) { current += axisStartY + axis.axisLabel.distance + fontSize / 2; } else { current += axisStartY - axis.axisLabel.distance - fontSize / 2; } return(new Vector3(axisStartX + scaleWid, current) + axis.axisLabel.offset); } else { if (axis.axisLabel.onZero && relativedAxis != null) { axisStartX += relativedAxis.context.offset; } if (axis.IsRight()) { axisStartX += relativedLength; } if ((inside && axis.IsLeft()) || (!inside && axis.IsRight())) { current += axisStartX + axis.axisLabel.distance; } else { current += axisStartX - axis.axisLabel.distance; } return(new Vector3(current, axisStartY + scaleWid) + axis.axisLabel.offset); } }
internal static void DrawAxisTick(VertexHelper vh, Axis axis, AxisTheme theme, DataZoom dataZoom, Orient orient, float startX, float startY, float axisLength) { var lineWidth = axis.axisLine.GetWidth(theme.lineWidth); var tickLength = axis.axisTick.GetLength(theme.tickLength); if (AxisHelper.NeedShowSplit(axis)) { var size = AxisHelper.GetScaleNumber(axis, axisLength, dataZoom); var current = orient == Orient.Horizonal ? startX : startY; for (int i = 0; i < size; i++) { var scaleWidth = AxisHelper.GetScaleWidth(axis, axisLength, i + 1, dataZoom); if (i == 0 && (!axis.axisTick.showStartTick || axis.axisTick.alignWithLabel)) { current += scaleWidth; continue; } if (i == size - 1 && !axis.axisTick.showEndTick) { current += scaleWidth; continue; } if (axis.axisTick.show) { if (orient == Orient.Horizonal) { float pX = axis.IsTime() ? (startX + axis.GetDistance(axis.GetLabelValue(i), axisLength)) : current; if (axis.boundaryGap && axis.axisTick.alignWithLabel) { pX -= scaleWidth / 2; } var sY = 0f; var eY = 0f; if ((axis.axisTick.inside && axis.IsBottom()) || (!axis.axisTick.inside && axis.IsTop())) { sY = startY + lineWidth; eY = sY + tickLength; } else { sY = startY - lineWidth; eY = sY - tickLength; } UGL.DrawLine(vh, new Vector3(pX, sY), new Vector3(pX, eY), axis.axisTick.GetWidth(theme.tickWidth), axis.axisTick.GetColor(theme.tickColor)); } else { float pY = axis.IsTime() ? (startY + axis.GetDistance(axis.GetLabelValue(i), axisLength)) : current; if (axis.boundaryGap && axis.axisTick.alignWithLabel) { pY -= scaleWidth / 2; } var sX = 0f; var eX = 0f; if ((axis.axisTick.inside && axis.IsLeft()) || (!axis.axisTick.inside && axis.IsRight())) { sX = startX + lineWidth; eX = sX + tickLength; } else { sX = startX - lineWidth; eX = sX - tickLength; } UGL.DrawLine(vh, new Vector3(sX, pY), new Vector3(eX, pY), axis.axisTick.GetWidth(theme.tickWidth), axis.axisTick.GetColor(theme.tickColor)); } } current += scaleWidth; } } if (axis.show && axis.axisLine.show && axis.axisLine.showArrow) { var lineY = startY + axis.offset; var inverse = axis.IsValue() && axis.inverse; var axisArrow = axis.axisLine.arrow; if (orient == Orient.Horizonal) { if (inverse) { var startPos = new Vector3(startX + axisLength, lineY); var arrowPos = new Vector3(startX, lineY); UGL.DrawArrow(vh, startPos, arrowPos, axisArrow.width, axisArrow.height, axisArrow.offset, axisArrow.dent, axisArrow.GetColor(axis.axisLine.GetColor(theme.lineColor))); } else { var arrowPosX = startX + axisLength + lineWidth; var startPos = new Vector3(startX, lineY); var arrowPos = new Vector3(arrowPosX, lineY); UGL.DrawArrow(vh, startPos, arrowPos, axisArrow.width, axisArrow.height, axisArrow.offset, axisArrow.dent, axisArrow.GetColor(axis.axisLine.GetColor(theme.lineColor))); } } else { if (inverse) { var startPos = new Vector3(startX, startY + axisLength); var arrowPos = new Vector3(startX, startY); UGL.DrawArrow(vh, startPos, arrowPos, axisArrow.width, axisArrow.height, axisArrow.offset, axisArrow.dent, axisArrow.GetColor(axis.axisLine.GetColor(theme.lineColor))); } else { var startPos = new Vector3(startX, startY); var arrowPos = new Vector3(startX, startY + axisLength + lineWidth); UGL.DrawArrow(vh, startPos, arrowPos, axisArrow.width, axisArrow.height, axisArrow.offset, axisArrow.dent, axisArrow.GetColor(axis.axisLine.GetColor(theme.lineColor))); } } } }
internal void UpdateAxisTickValueList(Axis axis) { if (axis.IsTime()) { var lastCount = axis.context.labelValueList.Count; DateTimeUtil.UpdateTimeAxisDateTimeList(axis.context.labelValueList, (int)axis.context.minValue, (int)axis.context.maxValue, axis.splitNumber); if (axis.context.labelValueList.Count != lastCount) { axis.SetAllDirty(); } } else if (axis.IsValue()) { var list = axis.context.labelValueList; var lastCount = list.Count; list.Clear(); var range = axis.context.maxValue - axis.context.minValue; if (range <= 0) { return; } double tick = axis.interval; if (axis.interval == 0) { if (axis.splitNumber > 0) { tick = range / axis.splitNumber; } else { var each = GetTick(range); tick = each; if (range / tick > 8) { tick = 2 * each; } else if (range / tick < 4) { tick = each / 2; } } } var value = 0d; if (Mathf.Approximately((float)(axis.context.minValue % tick), 0)) { value = axis.context.minValue; } else { list.Add(axis.context.minValue); value = Math.Ceiling(axis.context.minValue / tick) * tick; } var maxSplitNumber = chart.settings.axisMaxSplitNumber; while (value <= axis.context.maxValue) { list.Add(value); value += tick; if (maxSplitNumber > 0 && list.Count > maxSplitNumber) { break; } } if (!ChartHelper.IsEquals(axis.context.maxValue, list[list.Count - 1])) { list.Add(axis.context.maxValue); } if (lastCount != list.Count) { axis.SetAllDirty(); } } }