增加Radius、Area两种南丁格尔玫瑰图展示类型

This commit is contained in:
monitor1394
2019-07-29 08:01:39 +08:00
parent 484178bbf9
commit da1ee0f47b
3 changed files with 42 additions and 6 deletions

View File

@@ -16,10 +16,25 @@ namespace XCharts
EffectScatter
}
/// <summary>
/// Whether to show as Nightingale chart, which distinguishs data through radius.
/// 是否展示成南丁格尔图,通过半径区分数据大小。
/// </summary>
public enum RoseType
{
/// <summary>
/// Don't show as Nightingale chart.不展示成南丁格尔玫瑰图
/// </summary>
None,
/// <summary>
/// Use central angle to show the percentage of data, radius to show data size.
/// 扇区圆心角展现数据的百分比,半径展现数据的大小。
/// </summary>
Radius,
/// <summary>
/// All the sectors will share the same central angle, the data size is shown only through radiuses.
/// 所有扇区圆心角相同,仅通过半径展现数据大小。
/// </summary>
Area
}
@@ -55,6 +70,10 @@ namespace XCharts
public int axisIndex { get { return m_AxisIndex; } set { m_AxisIndex = value; } }
public SerieSymbol symbol { get { return m_Symbol; } set { m_Symbol = value; } }
public bool clickOffset { get { return m_ClickOffset; } set { m_ClickOffset = value; } }
/// <summary>
/// Whether to show as Nightingale chart.
/// 是否展示成南丁格尔图,通过半径区分数据大小。
/// </summary>
public RoseType roseType { get { return m_RoseType; } set { m_RoseType = value; } }
public float space { get { return m_Space; } set { m_Space = value; } }
public float[] center { get { return m_Center; } set { m_Center = value; } }

View File

@@ -118,6 +118,14 @@ namespace XCharts
float totalDegree = 360;
float startDegree = 0;
int showdataCount = 0;
if (serie.roseType == RoseType.Area)
{
foreach (var sd in serie.data)
{
if (sd.show) showdataCount++;
}
}
for (int n = 0; n < data.Count; n++)
{
var serieData = data[n];
@@ -144,7 +152,7 @@ namespace XCharts
tempData.angleList.Add(0);
continue;
}
float degree = totalDegree * value / tempData.dataTotal;
float degree = serie.roseType == RoseType.Area ? (totalDegree / showdataCount) : (totalDegree * value / tempData.dataTotal);
float toDegree = startDegree + degree;
float outSideRadius = serie.roseType > 0 ?
@@ -190,7 +198,7 @@ namespace XCharts
ChartHelper.DrawDoughnut(vh, center, tempData.insideRadius, outSideRadius,
startDegree, toDegree, color);
}
DrawLabelLine(vh, serie,tempData, outSideRadius, center, currAngle, color);
DrawLabelLine(vh, serie, tempData, outSideRadius, center, currAngle, color);
isDrawPie = true;
tempData.angleList.Add(toDegree);
startDegree = toDegree;
@@ -199,7 +207,7 @@ namespace XCharts
raycastTarget = isClickOffset && isDataHighlight;
}
private void DrawLabelLine(VertexHelper vh, Serie serie,PieTempData tempData, float outSideRadius, Vector2 center, float currAngle, Color color)
private void DrawLabelLine(VertexHelper vh, Serie serie, PieTempData tempData, float outSideRadius, Vector2 center, float currAngle, Color color)
{
if (serie.label.show
&& serie.label.position == SerieLabel.Position.Outside
@@ -276,6 +284,14 @@ namespace XCharts
float totalDegree = 360;
float startDegree = 0;
int showdataCount = 0;
if (serie.roseType == RoseType.Area)
{
foreach (var sd in serie.data)
{
if (sd.show) showdataCount++;
}
}
for (int n = 0; n < data.Count; n++)
{
var serieData = data[n];
@@ -302,7 +318,7 @@ namespace XCharts
tempData.angleList.Add(0);
continue;
}
float degree = totalDegree * value / tempData.dataTotal;
float degree = serie.roseType == RoseType.Area ? (totalDegree / showdataCount) : (totalDegree * value / tempData.dataTotal);
float toDegree = startDegree + degree;
float outSideRadius = serie.roseType > 0 ?
@@ -310,7 +326,6 @@ namespace XCharts
tempData.outsideRadius;
if (serieData.highlighted)
{
//color *= 1.2f;
outSideRadius += m_Pie.tooltipExtraRadius;
}
var offset = serie.space;