Skip to content
This repository was archived by the owner on Nov 28, 2024. It is now read-only.

Commit fd9bfde

Browse files
committed
Expose SplineTension property for spline series.
1 parent a8683b7 commit fd9bfde

File tree

13 files changed

+262
-27
lines changed

13 files changed

+262
-27
lines changed

Controls/Chart/Chart.UWP/Visualization/CartesianChart/Series/Categorical/SplineAreaSeries.cs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using Telerik.UI.Automation.Peers;
33
using Windows.UI.Xaml.Automation.Peers;
4+
using Windows.UI.Xaml;
45

56
namespace Telerik.UI.Xaml.Controls.Chart
67
{
@@ -9,6 +10,12 @@ namespace Telerik.UI.Xaml.Controls.Chart
910
/// </summary>
1011
public class SplineAreaSeries : AreaSeries
1112
{
13+
/// <summary>
14+
/// Identifies the <see cref="SplineTension"/> property.
15+
/// </summary>
16+
public static readonly DependencyProperty SplineTensionProperty =
17+
DependencyProperty.Register("SplineTension", typeof(double), typeof(SplineAreaSeries), new PropertyMetadata(SplineHelper.DefaultTension, OnSplineTensionChanged));
18+
1219
/// <summary>
1320
/// Initializes a new instance of the <see cref="SplineAreaSeries"/> class.
1421
/// </summary>
@@ -17,9 +24,30 @@ public SplineAreaSeries()
1724
this.DefaultStyleKey = typeof(SplineAreaSeries);
1825
}
1926

27+
/// <summary>
28+
/// Gets or sets the <see cref="SplineTension"/> that is used to determine the tension of the additional spline points.
29+
/// The default value is 0.5d.
30+
/// </summary>
31+
public double SplineTension
32+
{
33+
get { return (double)GetValue(SplineTensionProperty); }
34+
set { SetValue(SplineTensionProperty, value); }
35+
}
36+
37+
private static void OnSplineTensionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
38+
{
39+
SplineAreaSeries series = (SplineAreaSeries)d;
40+
SplineAreaRenderer renderer = (SplineAreaRenderer)series.renderer;
41+
renderer.splineTension = (double)e.NewValue;
42+
series.InvalidateCore();
43+
}
44+
2045
internal override LineRenderer CreateRenderer()
2146
{
22-
return new SplineAreaRenderer();
47+
return new SplineAreaRenderer()
48+
{
49+
splineTension = this.SplineTension
50+
};
2351
}
2452

2553
/// <inheritdoc/>

Controls/Chart/Chart.UWP/Visualization/CartesianChart/Series/Categorical/SplineSeries.cs

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
using System;
22
using Telerik.UI.Automation.Peers;
33
using Windows.UI.Xaml.Automation.Peers;
4+
using Windows.UI.Xaml;
45

56
namespace Telerik.UI.Xaml.Controls.Chart
67
{
78
/// <summary>
8-
/// Visualizes a collection of data points using a smooth <see cref="Windows.UI.Xaml.Shapes.Line"/> shape.
9+
/// Visualizes a collection of data points using a smooth <see cref="Microsoft.UI.Xaml.Shapes.Line"/> shape.
910
/// </summary>
1011
public class SplineSeries : LineSeries
1112
{
13+
/// <summary>
14+
/// Identifies the <see cref="SplineTension"/> property.
15+
/// </summary>
16+
public static readonly DependencyProperty SplineTensionProperty =
17+
DependencyProperty.Register("SplineTension", typeof(double), typeof(SplineSeries), new PropertyMetadata(SplineHelper.DefaultTension, OnSplineTensionChanged));
18+
1219
/// <summary>
1320
/// Initializes a new instance of the <see cref="SplineSeries"/> class.
1421
/// </summary>
@@ -17,9 +24,30 @@ public SplineSeries()
1724
this.DefaultStyleKey = typeof(SplineSeries);
1825
}
1926

27+
/// <summary>
28+
/// Gets or sets the <see cref="SplineTension"/> that is used to determine the tension of the additional spline points.
29+
/// The default value is 0.5d.
30+
/// </summary>
31+
public double SplineTension
32+
{
33+
get { return (double)GetValue(SplineTensionProperty); }
34+
set { SetValue(SplineTensionProperty, value); }
35+
}
36+
37+
private static void OnSplineTensionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
38+
{
39+
SplineSeries series = (SplineSeries)d;
40+
SplineRenderer renderer = (SplineRenderer)series.renderer;
41+
renderer.splineTension = (double)e.NewValue;
42+
series.InvalidateCore();
43+
}
44+
2045
internal override LineRenderer CreateRenderer()
2146
{
22-
return new SplineRenderer();
47+
return new SplineRenderer()
48+
{
49+
splineTension = this.SplineTension
50+
};
2351
}
2452

2553
/// <inheritdoc/>

Controls/Chart/Chart.UWP/Visualization/CartesianChart/Series/Scatter/ScatterSplineAreaSeries.cs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Telerik.Charting;
33
using Telerik.UI.Automation.Peers;
44
using Windows.UI.Xaml.Automation.Peers;
5+
using Windows.UI.Xaml;
56

67
namespace Telerik.UI.Xaml.Controls.Chart
78
{
@@ -10,6 +11,12 @@ namespace Telerik.UI.Xaml.Controls.Chart
1011
/// </summary>
1112
public class ScatterSplineAreaSeries : ScatterAreaSeries
1213
{
14+
/// <summary>
15+
/// Identifies the <see cref="SplineTension"/> property.
16+
/// </summary>
17+
public static readonly DependencyProperty SplineTensionProperty =
18+
DependencyProperty.Register("SplineTension", typeof(double), typeof(ScatterSplineAreaSeries), new PropertyMetadata(SplineHelper.DefaultTension, OnSplineTensionChanged));
19+
1320
/// <summary>
1421
/// Initializes a new instance of the <see cref="ScatterSplineAreaSeries"/> class.
1522
/// </summary>
@@ -18,9 +25,30 @@ public ScatterSplineAreaSeries()
1825
this.DefaultStyleKey = typeof(ScatterSplineAreaSeries);
1926
}
2027

28+
/// <summary>
29+
/// Gets or sets the <see cref="SplineTension"/> that is used to determine the tension of the additional spline points.
30+
/// The default value is 0.5d.
31+
/// </summary>
32+
public double SplineTension
33+
{
34+
get { return (double)GetValue(SplineTensionProperty); }
35+
set { SetValue(SplineTensionProperty, value); }
36+
}
37+
38+
private static void OnSplineTensionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
39+
{
40+
ScatterSplineAreaSeries series = (ScatterSplineAreaSeries)d;
41+
SplineAreaRenderer renderer = (SplineAreaRenderer)series.renderer;
42+
renderer.splineTension = (double)e.NewValue;
43+
series.InvalidateCore();
44+
}
45+
2146
internal override LineRenderer CreateRenderer()
2247
{
23-
return new SplineAreaRenderer();
48+
return new SplineAreaRenderer()
49+
{
50+
splineTension = this.SplineTension
51+
};
2452
}
2553

2654
/// <inheritdoc/>

Controls/Chart/Chart.UWP/Visualization/CartesianChart/Series/Scatter/ScatterSplineSeries.cs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Telerik.Charting;
33
using Telerik.UI.Automation.Peers;
44
using Windows.UI.Xaml.Automation.Peers;
5+
using Windows.UI.Xaml;
56

67
namespace Telerik.UI.Xaml.Controls.Chart
78
{
@@ -10,6 +11,12 @@ namespace Telerik.UI.Xaml.Controls.Chart
1011
/// </summary>
1112
public class ScatterSplineSeries : ScatterLineSeries
1213
{
14+
/// <summary>
15+
/// Identifies the <see cref="SplineTension"/> property.
16+
/// </summary>
17+
public static readonly DependencyProperty SplineTensionProperty =
18+
DependencyProperty.Register("SplineTension", typeof(double), typeof(ScatterSplineSeries), new PropertyMetadata(SplineHelper.DefaultTension, OnSplineTensionChanged));
19+
1320
/// <summary>
1421
/// Initializes a new instance of the <see cref="ScatterSplineSeries"/> class.
1522
/// </summary>
@@ -18,9 +25,30 @@ public ScatterSplineSeries()
1825
this.DefaultStyleKey = typeof(ScatterSplineSeries);
1926
}
2027

28+
/// <summary>
29+
/// Gets or sets the <see cref="SplineTension"/> that is used to determine the tension of the additional spline points.
30+
/// The default value is 0.5d.
31+
/// </summary>
32+
public double SplineTension
33+
{
34+
get { return (double)GetValue(SplineTensionProperty); }
35+
set { SetValue(SplineTensionProperty, value); }
36+
}
37+
38+
private static void OnSplineTensionChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
39+
{
40+
ScatterSplineSeries series = (ScatterSplineSeries)d;
41+
SplineRenderer renderer = (SplineRenderer)series.renderer;
42+
renderer.splineTension = (double)e.NewValue;
43+
series.InvalidateCore();
44+
}
45+
2146
internal override LineRenderer CreateRenderer()
2247
{
23-
return new SplineRenderer();
48+
return new SplineRenderer()
49+
{
50+
splineTension = this.SplineTension
51+
};
2452
}
2553

2654
/// <inheritdoc/>

Controls/Chart/Chart.UWP/Visualization/Common/Renderers/Cartesian/Spline/SplineAreaRenderer.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ namespace Telerik.UI.Xaml.Controls.Chart
77
{
88
internal class SplineAreaRenderer : AreaRenderer
99
{
10+
internal double splineTension;
11+
1012
protected override IEnumerable<Point> GetTopPoints(DataPointSegment segment)
1113
{
1214
// return the first point since spline segmentation skips it
@@ -15,7 +17,7 @@ protected override IEnumerable<Point> GetTopPoints(DataPointSegment segment)
1517
IChartView view = this.model.GetChartArea().view;
1618
double scaleFactor = Math.Abs(view.ZoomWidth - view.ZoomHeight) / 2;
1719

18-
foreach (Point point in SplineHelper.GetSplinePoints(this.renderPoints, segment, scaleFactor))
20+
foreach (Point point in SplineHelper.GetSplinePoints(this.renderPoints, segment, scaleFactor, this.splineTension))
1921
{
2022
yield return point;
2123
}

Controls/Chart/Chart.UWP/Visualization/Common/Renderers/Cartesian/Spline/SplineRenderer.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ namespace Telerik.UI.Xaml.Controls.Chart
77
{
88
internal class SplineRenderer : LineRenderer
99
{
10+
internal double splineTension;
11+
1012
protected internal override IEnumerable<Point> GetPoints(DataPointSegment segment)
1113
{
1214
// return the first point since spline segmentation skips it
@@ -15,7 +17,7 @@ protected internal override IEnumerable<Point> GetPoints(DataPointSegment segmen
1517
IChartView view = this.model.GetChartArea().view;
1618
double scaleFactor = Math.Abs(view.ZoomWidth - view.ZoomHeight) / 2;
1719

18-
foreach (Point point in SplineHelper.GetSplinePoints(this.renderPoints, segment, scaleFactor))
20+
foreach (Point point in SplineHelper.GetSplinePoints(this.renderPoints, segment, scaleFactor, this.splineTension))
1921
{
2022
yield return point;
2123
}

Controls/Chart/Chart.UWP/Visualization/Common/Renderers/Polar/Polar/PolarSplineRenderer.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ namespace Telerik.UI.Xaml.Controls.Chart
88
{
99
internal class PolarSplineRenderer : PolarLineRenderer
1010
{
11+
internal double splineTension;
12+
1113
protected internal override IEnumerable<Point> GetPoints(DataPointSegment segment)
1214
{
1315
// return the first point since spline segmentation skips it
@@ -16,7 +18,7 @@ protected internal override IEnumerable<Point> GetPoints(DataPointSegment segmen
1618
IChartView view = this.model.GetChartArea().view;
1719
double scaleFactor = Math.Abs(view.ZoomWidth - view.ZoomHeight) / 2;
1820

19-
foreach (Point point in SplineHelper.GetSplinePoints(this.renderPoints, segment, scaleFactor, this.isClosed))
21+
foreach (Point point in SplineHelper.GetSplinePoints(this.renderPoints, segment, scaleFactor, this.splineTension, this.isClosed))
2022
{
2123
yield return point;
2224
}

Controls/Chart/Chart.UWP/Visualization/Common/Renderers/Polar/Radar/RadarSplineRenderer.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ namespace Telerik.UI.Xaml.Controls.Chart
88
{
99
internal class RadarSplineRenderer : RadarLineRenderer
1010
{
11+
internal double splineTension;
12+
1113
protected internal override IEnumerable<Point> GetPoints(DataPointSegment segment)
1214
{
1315
// return the first point since spline segmentation skips it
@@ -16,7 +18,7 @@ protected internal override IEnumerable<Point> GetPoints(DataPointSegment segmen
1618
IChartView view = this.model.GetChartArea().view;
1719
double scaleFactor = Math.Abs(view.ZoomWidth - view.ZoomHeight) / 2;
1820

19-
foreach (Point point in SplineHelper.GetSplinePoints(this.renderPoints, segment, scaleFactor, this.isClosed))
21+
foreach (Point point in SplineHelper.GetSplinePoints(this.renderPoints, segment, scaleFactor, this.splineTension, this.isClosed))
2022
{
2123
yield return point;
2224
}

Controls/Chart/Chart.UWP/Visualization/Common/SplineHelper.cs

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ namespace Telerik.UI.Xaml.Controls.Chart
88
internal static class SplineHelper
99
{
1010
// TODO: Should we expose these as public properties for Spline and SplineArea series?
11-
private const double DefaultTension = 0.5d;
11+
internal const double DefaultTension = 0.5d;
1212
private const double DefaultTolerance = 5d;
1313

14-
public static IEnumerable<Point> GetSplinePoints(IList<DataPoint> dataPoints, DataPointSegment dataSegment, double scaleFactor, bool isClosedShape = false)
14+
public static IEnumerable<Point> GetSplinePoints(IList<DataPoint> dataPoints, DataPointSegment dataSegment, double scaleFactor, double tension = DefaultTension, bool isClosedShape = false)
1515
{
1616
double tolerance = DefaultTolerance;
1717
if (scaleFactor > 2)
@@ -29,7 +29,7 @@ public static IEnumerable<Point> GetSplinePoints(IList<DataPoint> dataPoints, Da
2929
Point firstPoint = dataPoints[dataSegment.StartIndex].Center();
3030
Point secondPoint = dataPoints[dataSegment.EndIndex].Center();
3131

32-
foreach (Point segmentedPoint in Segment(startPoint, firstPoint, secondPoint, endPoint, tolerance))
32+
foreach (Point segmentedPoint in Segment(startPoint, firstPoint, secondPoint, endPoint, tolerance, tension))
3333
{
3434
yield return segmentedPoint;
3535
}
@@ -48,7 +48,8 @@ public static IEnumerable<Point> GetSplinePoints(IList<DataPoint> dataPoints, Da
4848
dataPoints[i].Center(),
4949
dataPoints[i + 1].Center(),
5050
dataPoints[i + 2].Center(),
51-
tolerance);
51+
tolerance,
52+
tension);
5253
}
5354
else if (i == dataSegment.EndIndex - 1)
5455
{
@@ -57,7 +58,8 @@ public static IEnumerable<Point> GetSplinePoints(IList<DataPoint> dataPoints, Da
5758
dataPoints[i].Center(),
5859
dataPoints[i + 1].Center(),
5960
endPoint,
60-
tolerance);
61+
tolerance,
62+
tension);
6163
}
6264
else
6365
{
@@ -66,7 +68,8 @@ public static IEnumerable<Point> GetSplinePoints(IList<DataPoint> dataPoints, Da
6668
dataPoints[i].Center(),
6769
dataPoints[i + 1].Center(),
6870
dataPoints[i + 2].Center(),
69-
tolerance);
71+
tolerance,
72+
tension);
7073
}
7174

7275
foreach (Point point in segmentedPoints)
@@ -76,7 +79,7 @@ public static IEnumerable<Point> GetSplinePoints(IList<DataPoint> dataPoints, Da
7679
}
7780
}
7881

79-
public static IEnumerable<Point> GetSplinePointsConnectingAbsoluteFirstLastDataPoints(IList<DataPoint> dataPoints, double scaleFactor)
82+
public static IEnumerable<Point> GetSplinePointsConnectingAbsoluteFirstLastDataPoints(IList<DataPoint> dataPoints, double scaleFactor, double tension = DefaultTension)
8083
{
8184
DataPoint firstPoint = dataPoints[0];
8285
DataPoint lastPoint = dataPoints[dataPoints.Count - 1];
@@ -99,18 +102,18 @@ public static IEnumerable<Point> GetSplinePointsConnectingAbsoluteFirstLastDataP
99102
// return the first point since spline segmentation skips it
100103
yield return lastPoint.Center();
101104

102-
foreach (Point point in Segment(previousSignificantPointBeforeAbsoluteLast.Center(), lastPoint.Center(), firstPoint.Center(), nextSignificantPointAfterAbsoluteFirst.Center(), tolerance))
105+
foreach (Point point in Segment(previousSignificantPointBeforeAbsoluteLast.Center(), lastPoint.Center(), firstPoint.Center(), nextSignificantPointAfterAbsoluteFirst.Center(), tolerance, tension))
103106
{
104107
yield return point;
105108
}
106109
}
107110

108-
private static IEnumerable<Point> Segment(Point pt0, Point pt1, Point pt2, Point pt3, double tolerance)
111+
private static IEnumerable<Point> Segment(Point pt0, Point pt1, Point pt2, Point pt3, double tolerance, double tension)
109112
{
110-
double sX1 = DefaultTension * (pt2.X - pt0.X);
111-
double sY1 = DefaultTension * (pt2.Y - pt0.Y);
112-
double sX2 = DefaultTension * (pt3.X - pt1.X);
113-
double sY2 = DefaultTension * (pt3.Y - pt1.Y);
113+
double sX1 = tension * (pt2.X - pt0.X);
114+
double sY1 = tension * (pt2.Y - pt0.Y);
115+
double sX2 = tension * (pt3.X - pt1.X);
116+
double sY2 = tension * (pt3.Y - pt1.Y);
114117

115118
double ax = sX1 + sX2 + (2 * pt1.X) - (2 * pt2.X);
116119
double ay = sY1 + sY2 + (2 * pt1.Y) - (2 * pt2.Y);

0 commit comments

Comments
 (0)