160 lines
6.5 KiB
C#
160 lines
6.5 KiB
C#
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using XUGL;
|
|
|
|
namespace XCharts.Runtime
|
|
{
|
|
public static class Axis3DHelper
|
|
{
|
|
public static Vector3 Get3DGridPosition(GridCoord3D grid, XAxis3D xAxis, YAxis3D yAxis, ZAxis3D zAxis, double xValue, double yValue, double zValue)
|
|
{
|
|
var x = xAxis.GetDistance(xValue);
|
|
var y = yAxis.GetDistance(yValue);
|
|
var z = zAxis.GetDistance(zValue);
|
|
|
|
var dest = grid.context.pointA;
|
|
dest += xAxis.context.dire * x;
|
|
dest += yAxis.context.dire * y;
|
|
dest += zAxis.context.dire * z;
|
|
return dest;
|
|
}
|
|
|
|
public static Vector3 Get3DGridPosition(GridCoord3D grid, XAxis3D xAxis, YAxis3D yAxis, double xValue, double yValue)
|
|
{
|
|
var x = xAxis.GetDistance(xValue);
|
|
var y = yAxis.GetDistance(yValue);
|
|
|
|
var dest = grid.context.pointA;
|
|
dest += xAxis.context.dire * x;
|
|
dest += yAxis.context.dire * y;
|
|
return dest;
|
|
}
|
|
|
|
internal static void DrawAxisTick(VertexHelper vh, Axis axis, AxisTheme theme, DataZoom dataZoom,
|
|
Vector3 start, Vector3 end, Vector3 relativedDire)
|
|
{
|
|
var tickLength = axis.axisTick.GetLength(theme.tickLength);
|
|
var axisLength = Vector3.Distance(start, end);
|
|
var axisDire = (end - start).normalized;
|
|
|
|
if (axis.position == Axis.AxisPosition.Right)
|
|
{
|
|
relativedDire = -relativedDire;
|
|
}
|
|
|
|
if (AxisHelper.NeedShowSplit(axis))
|
|
{
|
|
var size = AxisHelper.GetScaleNumber(axis, axisLength, dataZoom);
|
|
if (axis.IsTime())
|
|
{
|
|
size += 1;
|
|
if (!ChartHelper.IsEquals(axis.GetLastLabelValue(), axis.context.maxValue))
|
|
size += 1;
|
|
}
|
|
var tickWidth = axis.axisTick.GetWidth(theme.tickWidth);
|
|
var tickColor = axis.axisTick.GetColor(theme.tickColor);
|
|
var current = start;
|
|
for (int i = 0; i < size; i++)
|
|
{
|
|
var scaleWidth = AxisHelper.GetScaleWidth(axis, axisLength, i + 1, dataZoom);
|
|
var hideTick = (i == 0 && (!axis.axisTick.showStartTick || axis.axisTick.alignWithLabel)) ||
|
|
(i == size - 1 && !axis.axisTick.showEndTick);
|
|
if (axis.axisTick.show && !hideTick)
|
|
{
|
|
UGL.DrawLine(vh, current, current + relativedDire * tickLength, tickWidth, tickColor);
|
|
}
|
|
current += axisDire * scaleWidth;
|
|
}
|
|
}
|
|
if (axis.show && axis.axisLine.show && axis.axisLine.showArrow)
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
public static void DrawAxisSplit(VertexHelper vh, Axis axis, AxisTheme theme, DataZoom dataZoom,
|
|
Vector3 start, Vector3 end, Axis relativedAxis)
|
|
{
|
|
if (relativedAxis == null) return;
|
|
var axisLength = Vector3.Distance(start, end);
|
|
var axisDire = (end - start).normalized;
|
|
var splitLength = relativedAxis.context.length;
|
|
var relativeDire = relativedAxis.context.dire;
|
|
var axisLineWidth = axis.axisLine.GetWidth(theme.lineWidth);
|
|
splitLength -= axisLineWidth;
|
|
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 = start;
|
|
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 -= axisDire * scaleWidth / 2;
|
|
|
|
if (axis.splitArea.show && i <= size - 1)
|
|
{
|
|
var p1 = current;
|
|
var p2 = current + relativeDire * splitLength;
|
|
var p3 = p2 + axisDire * scaleWidth;
|
|
var p4 = p1 + axisDire * scaleWidth;
|
|
UGL.DrawQuadrilateral(vh, p1, p2, p3, p4, axis.splitArea.GetColor(i, theme));
|
|
}
|
|
if (axis.splitLine.show)
|
|
{
|
|
if (axis.splitLine.NeedShow(i, size))
|
|
{
|
|
if (relativedAxis == null || !relativedAxis.axisLine.show
|
|
|| (Vector3.Distance(current, relativedAxis.context.start) > 0.5f && Vector3.Distance(current, relativedAxis.context.end) > 0.5f))
|
|
{
|
|
ChartDrawer.DrawLineStyle(vh,
|
|
lineType,
|
|
lineWidth,
|
|
current,
|
|
current + relativeDire * splitLength,
|
|
lineColor);
|
|
}
|
|
}
|
|
}
|
|
current += axisDire * scaleWidth;
|
|
}
|
|
}
|
|
|
|
public static Vector3 GetLabelPosition(int i, Axis axis, Axis relativedAxis, AxisTheme theme, float scaleWid)
|
|
{
|
|
var axisStart = axis.context.start;
|
|
var axisEnd = axis.context.end;
|
|
var axisDire = axis.context.dire;
|
|
var relativedDire = relativedAxis != null ? relativedAxis.context.dire : Vector3.zero;
|
|
var axisLength = Vector3.Distance(axisStart, axisEnd);
|
|
var inside = axis.axisLabel.inside;
|
|
var fontSize = axis.axisLabel.textStyle.GetFontSize(theme);
|
|
var current = axis.offset;
|
|
|
|
if (axis.position == Axis.AxisPosition.Right)
|
|
{
|
|
relativedDire = -relativedDire;
|
|
}
|
|
|
|
if (axis.IsTime() || axis.IsValue())
|
|
{
|
|
scaleWid = axis.context.minMaxRange != 0 ?
|
|
axis.GetDistance(axis.GetLabelValue(i), axisLength) :
|
|
0;
|
|
}
|
|
|
|
return axisStart + axisDire * scaleWid + axis.axisLabel.offset - relativedDire * (axis.axisLabel.distance + fontSize / 2);
|
|
}
|
|
|
|
|
|
}
|
|
} |