mirror of
https://github.com/XCharts-Team/XCharts.git
synced 2026-05-30 05:08:48 +00:00
[optimize] Pie support startAngle
This commit is contained in:
@@ -11,6 +11,7 @@ namespace XCharts.Editor
|
|||||||
PropertyField("m_Gap");
|
PropertyField("m_Gap");
|
||||||
PropertyTwoFiled("m_Center");
|
PropertyTwoFiled("m_Center");
|
||||||
PropertyTwoFiled("m_Radius");
|
PropertyTwoFiled("m_Radius");
|
||||||
|
//PropertyField("m_StartAngle");
|
||||||
|
|
||||||
PropertyFiledMore(() =>
|
PropertyFiledMore(() =>
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ namespace XCharts.Runtime
|
|||||||
public static void UpdatePieLabelPosition(Serie serie, SerieData serieData)
|
public static void UpdatePieLabelPosition(Serie serie, SerieData serieData)
|
||||||
{
|
{
|
||||||
if (serieData.labelObject == null) return;
|
if (serieData.labelObject == null) return;
|
||||||
|
var startAngle = serie.context.startAngle;
|
||||||
var currAngle = serieData.context.halfAngle;
|
var currAngle = serieData.context.halfAngle;
|
||||||
var currRad = currAngle * Mathf.Deg2Rad;
|
var currRad = currAngle * Mathf.Deg2Rad;
|
||||||
var offsetRadius = serieData.context.offsetRadius;
|
var offsetRadius = serieData.context.offsetRadius;
|
||||||
@@ -105,7 +106,7 @@ namespace XCharts.Runtime
|
|||||||
var currSin = Mathf.Sin(currRad);
|
var currSin = Mathf.Sin(currRad);
|
||||||
var currCos = Mathf.Cos(currRad);
|
var currCos = Mathf.Cos(currRad);
|
||||||
var pos0 = new Vector3(serie.context.center.x + radius3 * currSin, serie.context.center.y + radius3 * currCos);
|
var pos0 = new Vector3(serie.context.center.x + radius3 * currSin, serie.context.center.y + radius3 * currCos);
|
||||||
if (currAngle > 180)
|
if ((currAngle - startAngle) % 360 > 180)
|
||||||
{
|
{
|
||||||
currSin = Mathf.Sin((360 - currAngle) * Mathf.Deg2Rad);
|
currSin = Mathf.Sin((360 - currAngle) * Mathf.Deg2Rad);
|
||||||
currCos = Mathf.Cos((360 - currAngle) * Mathf.Deg2Rad);
|
currCos = Mathf.Cos((360 - currAngle) * Mathf.Deg2Rad);
|
||||||
@@ -113,7 +114,7 @@ namespace XCharts.Runtime
|
|||||||
var r4 = Mathf.Sqrt(radius1 * radius1 - Mathf.Pow(currCos * radius3, 2)) - currSin * radius3;
|
var r4 = Mathf.Sqrt(radius1 * radius1 - Mathf.Pow(currCos * radius3, 2)) - currSin * radius3;
|
||||||
r4 += labelLine.lineLength1 + labelLine.lineWidth * 4;
|
r4 += labelLine.lineLength1 + labelLine.lineWidth * 4;
|
||||||
r4 += serieData.labelObject.label.GetPreferredWidth() / 2;
|
r4 += serieData.labelObject.label.GetPreferredWidth() / 2;
|
||||||
serieData.context.labelPosition = pos0 + (currAngle > 180 ? Vector3.left : Vector3.right) * r4;
|
serieData.context.labelPosition = pos0 + ((currAngle - startAngle) % 360 > 180 ? Vector3.left : Vector3.right) * r4;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -184,11 +185,11 @@ namespace XCharts.Runtime
|
|||||||
serieData.context.labelPosition = new Vector3(x1, y1);
|
serieData.context.labelPosition = new Vector3(x1, y1);
|
||||||
}
|
}
|
||||||
lastCheckPos = serieData.context.labelPosition;
|
lastCheckPos = serieData.context.labelPosition;
|
||||||
serieData.labelObject.SetPosition(SerieLabelHelper.GetRealLabelPosition(serieData, serieLabel, labelLine));
|
serieData.labelObject.SetPosition(SerieLabelHelper.GetRealLabelPosition(serie, serieData, serieLabel, labelLine));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Vector3 GetRealLabelPosition(SerieData serieData, LabelStyle label, LabelLine labelLine)
|
public static Vector3 GetRealLabelPosition(Serie serie, SerieData serieData, LabelStyle label, LabelLine labelLine)
|
||||||
{
|
{
|
||||||
if (label == null || labelLine == null)
|
if (label == null || labelLine == null)
|
||||||
return serieData.context.labelPosition;
|
return serieData.context.labelPosition;
|
||||||
@@ -197,7 +198,7 @@ namespace XCharts.Runtime
|
|||||||
{
|
{
|
||||||
var currAngle = serieData.context.halfAngle;
|
var currAngle = serieData.context.halfAngle;
|
||||||
var offset = labelLine.lineLength2 + serieData.labelObject.GetLabelWidth() / 2;
|
var offset = labelLine.lineLength2 + serieData.labelObject.GetLabelWidth() / 2;
|
||||||
if (currAngle > 180)
|
if ((currAngle - serie.context.startAngle) % 360 > 180)
|
||||||
return serieData.context.labelPosition + new Vector3(-offset, 0, 0);
|
return serieData.context.labelPosition + new Vector3(-offset, 0, 0);
|
||||||
else
|
else
|
||||||
return serieData.context.labelPosition + new Vector3(offset, 0, 0);
|
return serieData.context.labelPosition + new Vector3(offset, 0, 0);
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ namespace XCharts.Runtime
|
|||||||
public override Vector3 GetSerieDataLabelPosition(SerieData serieData, LabelStyle label)
|
public override Vector3 GetSerieDataLabelPosition(SerieData serieData, LabelStyle label)
|
||||||
{
|
{
|
||||||
var labelLine = SerieHelper.GetSerieLabelLine(serie, serieData);
|
var labelLine = SerieHelper.GetSerieLabelLine(serie, serieData);
|
||||||
return SerieLabelHelper.GetRealLabelPosition(serieData, label, labelLine);
|
return SerieLabelHelper.GetRealLabelPosition(serie, serieData, label, labelLine);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnLegendButtonClick(int index, string legendName, bool show)
|
public override void OnLegendButtonClick(int index, string legendName, bool show)
|
||||||
@@ -151,11 +151,12 @@ namespace XCharts.Runtime
|
|||||||
{
|
{
|
||||||
var data = serie.data;
|
var data = serie.data;
|
||||||
serie.context.dataMax = serie.yMax;
|
serie.context.dataMax = serie.yMax;
|
||||||
|
serie.context.startAngle = GetStartAngle(serie);
|
||||||
var runtimePieDataTotal = serie.yTotal;
|
var runtimePieDataTotal = serie.yTotal;
|
||||||
|
|
||||||
SerieHelper.UpdateCenter(serie, chart.chartPosition, chart.chartWidth, chart.chartHeight);
|
SerieHelper.UpdateCenter(serie, chart.chartPosition, chart.chartWidth, chart.chartHeight);
|
||||||
|
float startDegree = serie.context.startAngle;
|
||||||
float totalDegree = 0;
|
float totalDegree = 0;
|
||||||
float startDegree = 0;
|
|
||||||
float zeroReplaceValue = 0;
|
float zeroReplaceValue = 0;
|
||||||
int showdataCount = 0;
|
int showdataCount = 0;
|
||||||
foreach (var sd in serie.data)
|
foreach (var sd in serie.data)
|
||||||
@@ -253,7 +254,7 @@ namespace XCharts.Runtime
|
|||||||
|
|
||||||
private double GetTotalAngle(Serie serie, double dataTotal, ref float totalAngle)
|
private double GetTotalAngle(Serie serie, double dataTotal, ref float totalAngle)
|
||||||
{
|
{
|
||||||
totalAngle = 360f;
|
totalAngle = serie.context.startAngle + 360f;
|
||||||
if (serie.minAngle > 0)
|
if (serie.minAngle > 0)
|
||||||
{
|
{
|
||||||
var rate = serie.minAngle / 360;
|
var rate = serie.minAngle / 360;
|
||||||
@@ -435,6 +436,7 @@ namespace XCharts.Runtime
|
|||||||
Vector3 pos4, pos6;
|
Vector3 pos4, pos6;
|
||||||
var horizontalLineCircleRadius = labelLine.lineWidth * 4f;
|
var horizontalLineCircleRadius = labelLine.lineWidth * 4f;
|
||||||
var lineCircleDiff = horizontalLineCircleRadius - 0.3f;
|
var lineCircleDiff = horizontalLineCircleRadius - 0.3f;
|
||||||
|
var startAngle = serie.context.startAngle;
|
||||||
if (currAngle < 90)
|
if (currAngle < 90)
|
||||||
{
|
{
|
||||||
var r4 = Mathf.Sqrt(radius1 * radius1 - Mathf.Pow(currCos * radius3, 2)) - currSin * radius3;
|
var r4 = Mathf.Sqrt(radius1 * radius1 - Mathf.Pow(currCos * radius3, 2)) - currSin * radius3;
|
||||||
@@ -467,7 +469,8 @@ namespace XCharts.Runtime
|
|||||||
pos6 = pos0 + Vector3.left * lineCircleDiff;
|
pos6 = pos0 + Vector3.left * lineCircleDiff;
|
||||||
pos4 = pos6 + Vector3.left * r4;
|
pos4 = pos6 + Vector3.left * r4;
|
||||||
}
|
}
|
||||||
var pos5X = currAngle > 180 ? pos2.x - labelLine.lineLength2 : pos2.x + labelLine.lineLength2;
|
var pos5X = (currAngle - startAngle) % 360 > 180
|
||||||
|
? pos2.x - labelLine.lineLength2 : pos2.x + labelLine.lineLength2;
|
||||||
var pos5 = new Vector3(pos5X, pos2.y);
|
var pos5 = new Vector3(pos5X, pos2.y);
|
||||||
switch (labelLine.lineType)
|
switch (labelLine.lineType)
|
||||||
{
|
{
|
||||||
@@ -526,5 +529,32 @@ namespace XCharts.Runtime
|
|||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private float GetStartAngle(Serie serie)
|
||||||
|
{
|
||||||
|
return serie.clockwise ? (serie.startAngle + 360) % 360 : 360 - serie.startAngle;
|
||||||
|
}
|
||||||
|
|
||||||
|
private float GetToAngle(Serie serie, float angle)
|
||||||
|
{
|
||||||
|
var toAngle = angle + serie.startAngle;
|
||||||
|
if (!serie.clockwise)
|
||||||
|
{
|
||||||
|
toAngle = 360 - angle - serie.startAngle;
|
||||||
|
}
|
||||||
|
if (!serie.animation.IsFinish())
|
||||||
|
{
|
||||||
|
var currAngle = serie.animation.GetCurrDetail();
|
||||||
|
if (serie.clockwise)
|
||||||
|
{
|
||||||
|
toAngle = toAngle > currAngle ? currAngle : toAngle;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
toAngle = toAngle < 360 - currAngle ? 360 - currAngle : toAngle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return toAngle;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -44,6 +44,7 @@ namespace XCharts.Runtime
|
|||||||
/// 外半径
|
/// 外半径
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public float outsideRadius;
|
public float outsideRadius;
|
||||||
|
public float startAngle;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 最大值
|
/// 最大值
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user