procedure TForm1.ChaikinProc( var pNewX, pNewY : TVariable ); var iIndex : integer; iQx, iQy, iRx, iRy : double; iValue1, iValue2 : double; pNewListX, pNewListY : TVariable; begin try pNewListX := TVariable.Create; pNewListY := TVariable.Create; { first } pNewListX.AddValue( pNewX.GetValue( 0 ) ); pNewListY.AddValue( pNewY.GetValue( 0 ) ); for iIndex := 0 to pNewX.Count - 2 do begin { - calc new Q coord } iQx := ( 0.75 * pNewX.GetValue( iIndex ) ) + ( 0.25 * pNewX.GetValue( iIndex + 1 ) ); iQy := ( 0.75 * pNewY.GetValue( iIndex ) ) + ( 0.25 * pNewY.GetValue( iIndex + 1 ) ); { - calc new R coord } iRx := ( 0.25 * pNewX.GetValue( iIndex ) ) + ( 0.75 * pNewX.GetValue( iIndex + 1 ) ); iRy := ( 0.25 * pNewY.GetValue( iIndex ) ) + ( 0.75 * pNewY.GetValue( iIndex + 1 ) ); { - add it to values list } pNewListX.AddValue( iQx ); pNewListY.AddValue( iQy ); pNewListX.AddValue( iRx ); pNewListY.AddValue( iRy ); end; { last } pNewListX.AddValue( pNewX.GetValue( pNewX.Count - 1 ) ); pNewListY.AddValue( pNewY.GetValue( pNewY.Count - 1 ) ); { copy } pNewListX.CopyTo( pNewX, true ); pNewListY.CopyTo( pNewY, true ); finally pNewListX.Free; pNewListY.Free; end; end; { --------------------------------------------------------------------------- Chalkin`s curve. -------------------------------------------------------------------------- } procedure TForm1.Chaikin; var i, N : integer; pNewX, pNewY : TVariable; pSerieLine : TLineSeries; begin pNewX := TVariable.Create; pNewY := TVariable.Create; for i := 0 to pX.Count - 1 do begin pX.CopyTo( pNewX ); pY.CopyTo( pNewY ); end; { get value from scrollbar } N := SChalkinFactor.Position; { count of smoothing } for i := 1 to N do ChaikinProc( pNewX, pNewY ); pSerieLine := TLineSeries( Chart1.Series[1] ); pSerieLine.Clear; for i := 0 to pNewX.Count - 1 do begin pSerieLine.AddXY( pNewX.GetValue( i ), pNewY.GetValue( i ) ); end; pNewX.Free; pNewY.Free; end;
Smoothing factor = 1 |
Smoothing factor = 10 |
No comments:
Post a Comment