TrueChart for WinForms (C1Chart2D)
カスタム近似曲線
ChartData オブジェクトの概要 > 近似曲線を使用する > カスタム近似曲線

カスタム近似曲線を実装するには、ICustomTrendLine インタフェースを実装しているクラスを作成する必要があります。このクラスのインスタンスを TrendLine オブジェクトの CustomTrendLine プロパティに割り当てます。この場合、近似曲線のすべてのデータ点をこのクラスによって完全に定義する必要があり、TrendLineType プロパティの設定は機能しません。以下のサンプルコードは、データの制限値に対応するカスタム近似曲線を実装します。

Visual Basic コードの書き方

Visual Basic
コードのコピー
        
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _   Handles Button1.Click       
        ' 近似曲線を作成します。     
        Dim tl As C1.Win.C1Chart.TrendLine = _     
           c1Chart1.ChartGroups(0).ChartData.TrendsList.AddNewTrendLine()      
        ' 線のプロパティを設定します。       
        tl.LineStyle.Thickness = 3      
        tl.LineStyle.Pattern = C1.Win.C1Chart.LinePatternEnum.Dash      
        ' カスタム近似曲線を設定します。      
        tl.CustomTrendLine = New CustomTrendLine()       
End Sub
       
Public Class CustomTrendLine_  Implements C1.Win.C1Chart.ICustomTrendLine       
  Private _x() As Double     
  Private _y() As Double     
  
        Public Sub Calculate(ByVal tl As C1.Win.C1Chart.TrendLine, ByVal x() As Double, _ ByVal y() As Double)Implements C1.Win.C1Chart.ICustomTrendLine.Calculate   
            If x Is Nothing Or x.Length = 0 Or y Is Nothing Or y.Length = 0 Then 
              _x = Nothing   
              _y = Nothing  
              Return    
            End If 
   
            ' 最小値と最大値を探します。    
            Dim xmin As Double = x(0), xmax = x(0)     
            Dim ymin As Double = y(0), ymax = y(0)   
            Dim i As Integer    
            For i = 1 To x.Length - 1   
              If x(i) < xmin Then 
                xmin = x(i)  
              ElseIf x(i) > xmax Then
                xmax = x(i)  
              End If  
              If y(i) < ymin Then
                ymin = y(i)  
              ElseIf y(i) > ymax Then
                ymax = y(i)  
              End If   
            Next
     
            ' データ点を囲む矩形     
            _x = New Double(4) {}    
            _y = New Double(4) {}    
            _x(0) = xmin    
            _y(0) = ymin    
            _x(4) = _x(0)   
            _y(4) = _y(0)   
            _x(2) = xmax   
            _y(2) = ymax   
            _x(1) = _x(0)   
            _y(1) = _y(2)  
            _x(3) = _x(2)   
            _y(3) = _y(0)  
    End Sub

      
  Public Function GetXValues() As Double() _    Implements C1.Win.C1Chart.ICustomTrendLine.GetXValues      
    Return _x    
  End Function
      
  Public Function GetYValues() As Double() _    Implements C1.Win.C1Chart.ICustomTrendLine.GetYValues     
    Return _y   
  End Function
        
  ' それを使用しないで、ただ、何かを返します。     
  Public Function GetY(ByVal x As Double) As Double _   Implements C1.Win.C1Chart.ICustomTrendLine.GetY    
    Return 0      
  End Function
      
  Public ReadOnly Property Text() As String _    Implements C1.Win.C1Chart.ICustomTrendLine.Text      
    Get     
      Return "Custom trend"     
    End Get      
  
End Property       
End Class

C# コードの書き方

C#
コードのコピー
 
private void button1_Click(object sender, System.EventArgs e)     
{    
   // 近似曲線を作成します。      
  C1.Win.C1Chart.TrendLine tl = c1Chart1.ChartGroups[0].ChartData.TrendsList.AddNewTrendLine();     
   // 線のプロパティを設定します。      
  tl.LineStyle.Color = Color.DarkRed;    
  tl.LineStyle.Thickness = 3;   
  tl.LineStyle.Pattern = C1.Win.C1Chart.LinePatternEnum.Dash;    
   // カスタム近似曲線を設定します。     
  tl.CustomTrendLine = new CustomTrendLine();      
}
        
public class CustomTrendLine : C1.Win.C1Chart.ICustomTrendLine      
{    
  private double[] _x;   
  private double[] _y;     
  public void Calculate( C1.Win.C1Chart.TrendLine tl, double[] x, double [] y)
     
  {  
    if( x==null || x.Length==0 || y==null || y.Length==0)    
    {  
      _x = null; _y = null;  
      return; 
    }   
     // 最小値と最大値を探します。    
    double xmin = x[0], xmax = x[0];
    double ymin = y[0], ymax = y[0];   
    for( int i=1; i<x.Length; i++)   
    {
      if( x[i] < xmin) 
        xmin = x[i];
      else if( x[i] > xmax)
        xmax = x[i]; 
      if( y[i] < ymin)
        ymin = y[i];
      else if( y[i] > ymax)
        ymax = y[i];   
    }
 
     // データ点を囲む矩形  
    _x = new double[5];
    _y = new double[5]; 
    _x[0] = xmin;  _y[0] = ymin; 
    _x[4] = _x[0]; _y[4] = _y[0];
    _x[2] = xmax;  _y[2] = ymax;  
    _x[1] = _x[0]; _y[1] = _y[2];   
    _x[3] = _x[2]; _y[3] = _y[0];    
  }
      
  public double[] GetXValues() { return _x;}  
  public double[] GetYValues() { return _y;}    
   // それを使用しないで、ただ、何かを返します。   
  public double GetY( double x) { return 0;}    
  public string Text { get{ return "Custom trend";}}    
}

関連トピック