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 |





