增加Axis可通过inverse参数设置坐标轴反向

This commit is contained in:
monitor1394
2020-04-18 08:19:17 +08:00
parent 4d3e7f1605
commit d5fbce2e36
13 changed files with 141 additions and 83 deletions

View File

@@ -275,8 +275,8 @@ namespace XCharts
for (int n = 0; n < serie.data.Count; n++)
{
var serieData = serie.data[n];
var xdata = serieData.data[0];
var ydata = serieData.data[1];
var xdata = serieData.GetData(0, xAxis.inverse);
var ydata = serieData.GetData(1, yAxis.inverse);
var symbolSize = serie.symbol.GetSize(serieData == null ? null : serieData.data);
if (Mathf.Abs(xValue - xdata) / xRate < symbolSize
&& Mathf.Abs(yValue - ydata) / yRate < symbolSize)
@@ -799,25 +799,28 @@ namespace XCharts
{
if (axis is XAxis)
{
m_Series.GetXMinMaxValue(m_DataZoom, axisIndex, true, out tempMinValue, out tempMaxValue);
m_Series.GetXMinMaxValue(m_DataZoom, axisIndex, true, axis.inverse, out tempMinValue, out tempMaxValue);
}
else
{
m_Series.GetYMinMaxValue(m_DataZoom, axisIndex, true, out tempMinValue, out tempMaxValue);
m_Series.GetYMinMaxValue(m_DataZoom, axisIndex, true, axis.inverse, out tempMinValue, out tempMaxValue);
}
}
else
{
m_Series.GetYMinMaxValue(m_DataZoom, axisIndex, false, out tempMinValue, out tempMaxValue);
m_Series.GetYMinMaxValue(m_DataZoom, axisIndex, false, axis.inverse, out tempMinValue, out tempMaxValue);
}
axis.AdjustMinMaxValue(ref tempMinValue, ref tempMaxValue, true);
if (tempMinValue != axis.runtimeMinValue || tempMaxValue != axis.runtimeMaxValue)
{
m_CheckMinMaxValue = true;
axis.UpdateMinValue(tempMinValue, !m_IsPlayingAnimation);
axis.UpdateMaxValue(tempMaxValue, !m_IsPlayingAnimation);
m_IsPlayingAnimation = true;
var needCheck = !m_IsPlayingAnimation && axis.runtimeLastCheckInverse == axis.inverse;
axis.UpdateMinValue(tempMinValue, needCheck);
axis.UpdateMaxValue(tempMaxValue, needCheck);
axis.runtimeZeroXOffset = 0;
axis.runtimeZeroYOffset = 0;
axis.runtimeLastCheckInverse = axis.inverse;
if (tempMinValue != 0 || tempMaxValue != 0)
{
if (axis is XAxis && axis.IsValue())
@@ -1135,7 +1138,7 @@ namespace XCharts
Vector3 np = Vector3.zero;
float minValue = 0;
float maxValue = 0;
m_Series.GetYMinMaxValue(null, 0, IsValue(), out minValue, out maxValue);
m_Series.GetYMinMaxValue(null, 0, IsValue(), axis.inverse, out minValue, out maxValue);
axis.AdjustMinMaxValue(ref minValue, ref maxValue, true);
int rate = 1;
@@ -1149,7 +1152,7 @@ namespace XCharts
for (int i = 0; i < maxCount; i += rate)
{
float value = SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage, i,
serie.animation.GetUpdateAnimationDuration(), ref dataChanging);
serie.animation.GetUpdateAnimationDuration(), ref dataChanging, axis.inverse);
float pX = coordinateX + i * scaleWid;
float dataHig = (axis.runtimeMaxValue - axis.runtimeMinValue) == 0 ? 0 :
(value - axis.runtimeMinValue) / (axis.runtimeMaxValue - axis.runtimeMinValue) * hig;
@@ -1783,11 +1786,11 @@ namespace XCharts
}
protected void CheckClipAndDrawSymbol(VertexHelper vh, SerieSymbolType type, float symbolSize,
float tickness, Vector3 pos, Color color, Color toColor, float gap, bool clip,float[] cornerRadius)
float tickness, Vector3 pos, Color color, Color toColor, float gap, bool clip, float[] cornerRadius)
{
if (!IsInChart(pos)) return;
if (!clip || (clip && (IsInCooridate(pos))))
DrawSymbol(vh, type, symbolSize, tickness, pos, color, toColor, gap,cornerRadius);
DrawSymbol(vh, type, symbolSize, tickness, pos, color, toColor, gap, cornerRadius);
}
protected void CheckClipAndDrawZebraLine(VertexHelper vh, Vector3 p1, Vector3 p2, float size,

View File

@@ -67,7 +67,7 @@ namespace XCharts
var itemStyle = SerieHelper.GetItemStyle(serie, serieData, highlight);
serieData.canShowLabel = true;
float value = showData[i].GetCurrData(1, dataChangeDuration);
float value = showData[i].GetCurrData(1, dataChangeDuration, xAxis.inverse);
float borderWidth = value == 0 ? 0 : itemStyle.runtimeBorderWidth;
if (showData[i].IsDataChanged()) dataChanging = true;
float pX = seriesHig[i] + coordinateX + xAxis.runtimeZeroXOffset + yAxis.axisLine.width;
@@ -193,7 +193,7 @@ namespace XCharts
|| serie.data[i].highlighted
|| serie.highlighted;
var itemStyle = SerieHelper.GetItemStyle(serie, serieData, highlight);
float value = serieData.GetCurrData(1, dataChangeDuration);
float value = serieData.GetCurrData(1, dataChangeDuration, yAxis.inverse);
float borderWidth = value == 0 ? 0 : itemStyle.runtimeBorderWidth;
if (serieData.IsDataChanged()) dataChanging = true;
float pX = coordinateX + i * categoryWidth;
@@ -354,25 +354,53 @@ namespace XCharts
if (isYAxis)
{
var diff = Vector3.right * radius;
var pcl = (plt + plb) / 2 + diff;
var pcr = (prt + prb) / 2 - diff;
if (pcr.x > pcl.x)
if (plt.x < prt.x)
{
CheckClipAndDrawPolygon(vh, plb + diff, plt + diff, prt - diff, prb - diff, areaColor, areaToColor, serie.clip);
ChartDrawer.DrawSector(vh, pcl, radius, areaColor, 180, 360);
ChartDrawer.DrawSector(vh, pcr, radius, areaToColor, 0, 180);
var pcl = (plt + plb) / 2 + diff;
var pcr = (prt + prb) / 2 - diff;
if (pcr.x > pcl.x)
{
CheckClipAndDrawPolygon(vh, plb + diff, plt + diff, prt - diff, prb - diff, areaColor, areaToColor, serie.clip);
ChartDrawer.DrawSector(vh, pcl, radius, areaColor, 180, 360);
ChartDrawer.DrawSector(vh, pcr, radius, areaToColor, 0, 180);
}
}
else if (plt.x > prt.x)
{
var pcl = (plt + plb) / 2 - diff;
var pcr = (prt + prb) / 2 + diff;
if (pcr.x < pcl.x)
{
CheckClipAndDrawPolygon(vh, plb - diff, plt - diff, prt + diff, prb + diff, areaColor, areaToColor, serie.clip);
ChartDrawer.DrawSector(vh, pcl, radius, areaColor, 0, 180);
ChartDrawer.DrawSector(vh, pcr, radius, areaToColor, 180, 360);
}
}
}
else
{
var diff = Vector3.up * radius;
var pct = (plt + prt) / 2 - diff;
var pcb = (plb + prb) / 2 + diff;
if (pct.y > pcb.y)
if (plt.y > plb.y)
{
CheckClipAndDrawPolygon(vh, prb + diff, plb + diff, plt - diff, prt - diff, areaColor, areaToColor, serie.clip);
ChartDrawer.DrawSector(vh, pct, radius, areaToColor, 270, 450);
ChartDrawer.DrawSector(vh, pcb, radius, areaColor, 90, 270);
var pct = (plt + prt) / 2 - diff;
var pcb = (plb + prb) / 2 + diff;
if (pct.y > pcb.y)
{
CheckClipAndDrawPolygon(vh, prb + diff, plb + diff, plt - diff, prt - diff, areaColor, areaToColor, serie.clip);
ChartDrawer.DrawSector(vh, pct, radius, areaToColor, 270, 450);
ChartDrawer.DrawSector(vh, pcb, radius, areaColor, 90, 270);
}
}
else if (plt.y < plb.y)
{
var pct = (plt + prt) / 2 + diff;
var pcb = (plb + prb) / 2 - diff;
if (pct.y < pcb.y)
{
CheckClipAndDrawPolygon(vh, prb - diff, plb - diff, plt + diff, prt + diff, areaColor, areaToColor, serie.clip);
ChartDrawer.DrawSector(vh, pct, radius, areaToColor, 90, 270);
ChartDrawer.DrawSector(vh, pcb, radius, areaColor, 270, 450);
}
}
}
}

View File

@@ -152,7 +152,7 @@ namespace XCharts
serie.dataPoints.Add(Vector3.zero);
continue;
}
var value = serieData.GetCurrData(dimension, dataChangeDuration);
var value = serieData.GetCurrData(dimension, dataChangeDuration, yAxis.inverse);
if (serieData.IsDataChanged()) dataChanging = true;
var pos = new Vector3(zeroX + (i + 0.5f) * xWidth, zeroY + (j + 0.5f) * yWidth);
serie.dataPoints.Add(pos);

View File

@@ -135,7 +135,7 @@ namespace XCharts
else
{
float yValue = SampleValue(ref showData, serie.sampleType, rate, serie.minShow, maxCount, totalAverage,
i, dataChangeDuration, ref dataChanging);
i, dataChangeDuration, ref dataChanging,yAxis.inverse);
seriesHig[i] += GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, seriesHig[i], ref np,
dataChangeDuration);
serie.dataPoints.Add(np);
@@ -155,7 +155,7 @@ namespace XCharts
}
else
{
float yValue = showData[i].GetCurrData(1, dataChangeDuration);
float yValue = showData[i].GetCurrData(1, dataChangeDuration,yAxis.inverse);
seriesHig[i] += GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, seriesHig[i], ref np,
dataChangeDuration);
serie.dataPoints.Add(np);
@@ -187,7 +187,7 @@ namespace XCharts
}
else
{
float yValue = showData[i].GetCurrData(1, dataChangeDuration);
float yValue = showData[i].GetCurrData(1, dataChangeDuration,yAxis.inverse);
GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, 0, ref firstLastPos, dataChangeDuration);
}
}
@@ -204,7 +204,7 @@ namespace XCharts
}
else
{
float yValue = showData[i].GetCurrData(1, dataChangeDuration);
float yValue = showData[i].GetCurrData(1, dataChangeDuration,yAxis.inverse);
GetDataPoint(xAxis, yAxis, showData, yValue, startX, i, scaleWid, 0, ref lastNextPos, dataChangeDuration);
}
}
@@ -350,12 +350,13 @@ namespace XCharts
}
private float SampleValue(ref List<SerieData> showData, SampleType sampleType, int rate,
int minCount, int maxCount, float totalAverage, int index, float dataChangeDuration, ref bool dataChanging)
int minCount, int maxCount, float totalAverage, int index, float dataChangeDuration,
ref bool dataChanging,bool inverse)
{
if (rate <= 1 || index == minCount)
{
if (showData[index].IsDataChanged()) dataChanging = true;
return showData[index].GetCurrData(1, dataChangeDuration);
return showData[index].GetCurrData(1, dataChangeDuration,inverse);
}
switch (sampleType)
{
@@ -364,7 +365,7 @@ namespace XCharts
float total = 0;
for (int i = index; i > index - rate; i--)
{
total += showData[i].GetCurrData(1, dataChangeDuration);
total += showData[i].GetCurrData(1, dataChangeDuration,inverse);
if (showData[i].IsDataChanged()) dataChanging = true;
}
if (sampleType == SampleType.Average) return total / rate;
@@ -373,7 +374,7 @@ namespace XCharts
float max = float.MinValue;
for (int i = index; i > index - rate; i--)
{
var value = showData[i].GetCurrData(1, dataChangeDuration);
var value = showData[i].GetCurrData(1, dataChangeDuration,inverse);
if (value > max) max = value;
if (showData[i].IsDataChanged()) dataChanging = true;
}
@@ -382,7 +383,7 @@ namespace XCharts
float min = float.MaxValue;
for (int i = index; i > index - rate; i--)
{
var value = showData[i].GetCurrData(1, dataChangeDuration);
var value = showData[i].GetCurrData(1, dataChangeDuration,inverse);
if (value < min) min = value;
if (showData[i].IsDataChanged()) dataChanging = true;
}
@@ -393,7 +394,7 @@ namespace XCharts
total = 0;
for (int i = index; i > index - rate; i--)
{
var value = showData[i].GetCurrData(1, dataChangeDuration);
var value = showData[i].GetCurrData(1, dataChangeDuration,inverse);
total += value;
if (value < min) min = value;
if (value > max) max = value;
@@ -404,7 +405,7 @@ namespace XCharts
else return min;
}
if (showData[index].IsDataChanged()) dataChanging = true;
return showData[index].GetCurrData(1, dataChangeDuration);
return showData[index].GetCurrData(1, dataChangeDuration,inverse);
}
private float GetDataPoint(Axis xAxis, Axis yAxis, List<SerieData> showData, float yValue, float startX, int i,
@@ -422,7 +423,7 @@ namespace XCharts
float yMaxValue = yAxis.GetCurrMaxValue(duration);
if (xAxis.IsValue() || xAxis.IsLog())
{
float xValue = i > showData.Count - 1 ? 0 : showData[i].data[0];
float xValue = i > showData.Count - 1 ? 0 : showData[i].GetData(0,xAxis.inverse);
float pX = coordinateX + xAxis.axisLine.width;
float pY = serieHig + coordinateY + xAxis.axisLine.width;
if (xAxis.IsLog())
@@ -516,7 +517,7 @@ namespace XCharts
{
for (int j = 0; j < rate; j++) seriesHig.Add(0);
}
float value = showData[i].GetCurrData(1, dataChangeDuration);
float value = showData[i].GetCurrData(1, dataChangeDuration,xAxis.inverse);
float pY = startY + i * scaleWid;
float pX = seriesHig[i] + coordinateX + yAxis.axisLine.width;
float dataHig = 0;
@@ -543,7 +544,7 @@ namespace XCharts
{
i = maxCount - 1;
seriesHig.Add(0);
float value = showData[i].GetCurrData(1, dataChangeDuration);
float value = showData[i].GetCurrData(1, dataChangeDuration,xAxis.inverse);
float pY = startY + i * scaleWid;
float pX = seriesHig[i] + coordinateX + yAxis.axisLine.width;
float dataHig = 0;

View File

@@ -32,8 +32,8 @@ namespace XCharts
var toColor = SerieHelper.GetItemToColor(serie, serieData, m_ThemeInfo, colorIndex, highlight);
var symbolBorder = SerieHelper.GetSymbolBorder(serie, serieData, highlight);
var cornerRadius = SerieHelper.GetSymbolCornerRadius(serie, serieData, highlight);
float xValue = serieData.GetCurrData(0, dataChangeDuration);
float yValue = serieData.GetCurrData(1, dataChangeDuration);
float xValue = serieData.GetCurrData(0, dataChangeDuration, xAxis.inverse);
float yValue = serieData.GetCurrData(1, dataChangeDuration, yAxis.inverse);
if (serieData.IsDataChanged()) dataChanging = true;
float pX = coordinateX + xAxis.axisLine.width;
float pY = coordinateY + yAxis.axisLine.width;