#include "stdafx.h" #include "GreyPeak.h" namespace OTSIMGPROC { BOOL MyGreyPeak::MergeGreyPeaks(MyGreyPeak* firstRng ,MyGreyPeak*& resultFirstRng) { auto curRange = firstRng; while (curRange != NULL) { GrayPeakType pt = curRange->GetPeakType(); if (pt == GrayPeakType::normalPeak)//normal peak { if (curRange->nextRng == NULL) { break; } curRange = curRange->nextRng; continue; } auto preRng = curRange->preRng; auto nextRng = curRange->nextRng; if (pt == GrayPeakType::leftBias)//left bias { if (preRng != NULL) { int curPeak = curRange->peakValue; int prePeak = preRng->peakValue; if (prePeak > curPeak) { preRng->MergePeak(curRange); curRange = preRng; //firstRng = preRng; continue; } } } else if (pt == GrayPeakType::rightBias)//right bias { if (nextRng != NULL) { int curPeak = curRange->peakValue; int nextPeak = nextRng->peakValue; if (nextPeak > curPeak) { if (curRange->preRng == NULL) { firstRng = nextRng; } nextRng->MergePeak(curRange); curRange = nextRng; //firstRng = nextRng; continue; } } } else if (pt == GrayPeakType::smallPeak) { if (preRng != NULL && nextRng != NULL) { int curPeak = curRange->peakValue; int prePeak = preRng->peakValue; int nextPeak = nextRng->peakValue; if (prePeak > curPeak && nextPeak > curPeak) { if (preRng->peakValue >= nextRng->peakValue) { preRng->MergePeak(curRange); curRange = preRng; //firstRng = preRng; continue; } else { nextRng->MergePeak(curRange); curRange = nextRng; //firstRng = nextRng; continue; } } else if (prePeak > curPeak && nextPeak < curPeak) { preRng->MergePeak(curRange); curRange = preRng; //firstRng = preRng; continue; } else if (nextPeak > curPeak && prePeak < curPeak) { nextRng->MergePeak(curRange); curRange = nextRng; //firstRng = nextRng; continue; } } else if (preRng != NULL && nextRng == NULL) { preRng->MergePeak(curRange); curRange = preRng; //firstRng = preRng; continue; } else if (preRng == NULL && nextRng != NULL) { nextRng->MergePeak(curRange); //firstRng = nextRng; curRange = nextRng; continue; } } if (curRange->nextRng == NULL) { break; } curRange = curRange->nextRng; } while (curRange != NULL && curRange->preRng != NULL) { resultFirstRng = curRange->preRng; curRange = curRange->preRng; } return true; } }