| 2.1.23.2.8 ocmath_find_peaks_1st_derivative
 DescriptionFind curve's peaks by 1st derivative.
 Syntaxint ocmath_find_peaks_1st_derivative( UINT * lSize, const double * pX, const double * pY, double * pXPeaks, double * pYPeaks, int * pnIndices, DWORD dwCtrl = POSITIVE_DIRECTION, bool bUseSGderivativeForFindPeak = false, int nPtsSmooth=11, int nPolyOrder=2) Parameters lSize[modify] on input, size of pX, pY, pXPeaks, pYPeaks, pnIndices; on output, return number of peaks pX[input] it contains curve's X coordinate's datas pY[input] it contains curve's Y coordinate's datas pXPeaks[output] Its size is equal to the size of px. it contains peaks' X coordinate's datas,if the number of peaks is less than its size, the excrescent elements of it are filledwith 0. pYPeaks[output] Its size is equal to the size of py. it contains peaks' Y coordinate's datas,if the number of peaks is less than its size, the excrescent elements of it are filledwith 0. pnIndices[output] Its size is equal to the size of px. it contains peaks' indices, if peaks's number isless than its size, the excrescent elements of it are filled with 0. dwCtrl[input]  combine of POSITIVE_DIRECTION, NEGATIVE_DIRECTION,  KEEP_OPPOSITE_SIDE nPtsSmooth[input] smooth points number, if equal to 0, then omit smooth
 ReturnReturn OE_NOERROR if succeed, otherwise, non-zero error code is returned.
 ExamplesEX1
 //Assume in the current graph, curve's XY data is in the first data plot. This piece
//of code get the XY data of the curve from the first data plot and find the feets of
//the peaks. The result is output in a new worksheet and the feets will plot in the 
//original data plot.
void ocmath_find_peaks_1st_derivative_ex1( )
{
    GraphLayer gl = Project.ActiveLayer();
    if (!gl)
    {
        return;
    }
    //get data from the first data plot
    DataPlot dp = gl.DataPlots(0);        
    DataRange dr;
    vector vxData, vyData;
    if(dp.GetDataRange(dr))
    {
        DWORD dwPlotID;
        if(dr.GetData(DRR_GET_DEPENDENT | DRR_NO_FACTORS, 0, &dwPlotID, NULL, &vyData, &vxData) < 0)
        {
            printf("get_plot_data failed GetData");
            return;
        }
    }
 
    uint nDataSize = vxData.GetSize();
    int iSize = vxData.GetSize();
 
    vector vxPeaks, vyPeaks;
    vector<int> vnIndices;
 
    vxPeaks.SetSize(nDataSize);
    vyPeaks.SetSize(nDataSize);
    vnIndices.SetSize(nDataSize);
 
    int nRet = ocmath_find_peaks_1st_derivative( &nDataSize, vxData, vyData, vxPeaks, vyPeaks, vnIndices, POSITIVE_DIRECTION | NEGATIVE_DIRECTION,false);
    if( nRet < OE_NOERROR )
    {
        printf("error code: %d\n", nRet);
        return;
    }
    vxPeaks.SetSize(nDataSize);
    vyPeaks.SetSize(nDataSize);
    vnIndices.SetSize(nDataSize);
    
    //new a worksheet to output the result
    WorksheetPage wksPage;
    wksPage.Create();
    Worksheet wksResult = wksPage.Layers(0);
    int nIndCol, nXCol, nYCol;
    nIndCol = wksResult.AddCol("Indices");
    nXCol = wksResult.AddCol("X Coordinate");
    nYCol = wksResult.AddCol("Y Coordinate");
    wksResult.Columns(nIndCol).SetType(OKDATAOBJ_DESIGNATION_X);
    wksResult.Columns(nXCol).SetType(OKDATAOBJ_DESIGNATION_X);
    wksResult.Columns(nYCol).SetType(OKDATAOBJ_DESIGNATION_Y);
    
    DataRange drOut;
    drOut.Add("X", wksResult, 0, nIndCol, -1, nIndCol);
    drOut.Add("Y", wksResult, 0, nXCol, -1, nXCol);
    drOut.Add("Z", wksResult, 0, nYCol, -1, nYCol);
    drOut.SetData(&vyPeaks, &vxPeaks, &vnIndices);
    
    //show the feets in the data plot
    XYRange plotRange;
    plotRange.Add("X", wksResult, 0, nXCol, -1, nXCol);
    plotRange.Add("Y", wksResult, 0, nYCol, -1, nYCol);
    gl.AddPlot(plotRange, IDM_PLOT_SCATTER);
}RemarkFind curve's peaks by 1st derivative. Calculate curve's smoothed 1st derivative on every point in px, py.
 Then the point is a peak, if the signs of smoothed 1st derivatives are different on its left point and right point.
 POSITIVE_DIRECTION peak, if the smoothed 1st derivative is greater than zero on its left point, and less than zero on its right point.
 NEGATIVE_DIRECTION peak, if the smoothed 1st derivative is less than zero on its left point, and greater than zero on its right point.
 lsize returns the number of peaks, pXPeaks and pYPeaks contain X and Y coordinate's datas of peaks,and pnIndices contains the indices of peaks.
 See Alsoocmath_find_peaks_2nd_derivative
 Header to Includeorigin.h
 Reference |