隨機線條效果實現 dom
class TCbwAnimationEffect_RandomLine : public TCbwAnimationEffect { // 隨機線ui
virtual bool __fastcall BuildMaskMat(cv::Mat& destMat, cv::Mat& srcMat,spa
TRect displayRect);it
BYTE * FOccurredLines;io
public:ast
__fastcall TCbwAnimationEffect_RandomLine();class
};im
__fastcall TCbwAnimationEffect_RandomLine::TCbwAnimationEffect_RandomLine()call
: TCbwAnimationEffect() {top
EffectType = cetRandomLine;
FOccurredLines = NULL;
}
bool __fastcall TCbwAnimationEffect_RandomLine::BuildMaskMat(cv::Mat& destMat,
cv::Mat& srcMat, TRect displayRect) {
bool horzFlag = (MyOptionType.Items[1].CurrentValue == 0); // 方向
TRect wholeRect(0, 0, displayRect.right - displayRect.left,
displayRect.bottom - displayRect.top);
int totalLineNumber = (horzFlag ? wholeRect.bottom : wholeRect.right);
int number = double(FCurrentIndex + 1) / FTotalFramesInOnePeriod * totalLineNumber;
if (!FOccurredLines) {
FOccurredLines = new BYTE[totalLineNumber];
ZeroMemory(FOccurredLines, totalLineNumber);
}
int destNumber =
number -int(double(FCurrentIndex) / FTotalFramesInOnePeriod * totalLineNumber);
BYTE * pDst = destMat.data;
vector<int>totalLines;
for (int i = 0; i < totalLineNumber; ++i)
totalLines.push_back(i);
while (destNumber-- > 0 && totalLines.size()) {
int n = random(totalLines.size());
while (FOccurredLines[totalLines[n]]) {
totalLines.erase(totalLines.begin() + n);
n = random(totalLines.size());
}
FOccurredLines[totalLines[n]] = 1;
totalLines.erase(totalLines.begin() + n);
}
for (int row = 0; row < destMat.rows; ++row)
for (int col = 0; col < destMat.cols; ++col) {
bool inFlag = (horzFlag ? FOccurredLines[row] :
FOccurredLines[col]);
*pDst++ = inFlag ? 255 : 0;
}
if (FCurrentIndex == FTotalFramesInOnePeriod - 1) {
delete FOccurredLines;
FOccurredLines = NULL;
}
return true;
}
演示效果