`imageData = new double * [imageHeight];
for(int i = 0; i < imageHeight; i++) {
imageData[i] = new double[imageWidth];
for(int j = 0; j < imageWidth; j++) {
// compute the distance and angle from the swirl center:
double pixelX = (double)i - swirlCenterX;
double pixelY = (double)j - swirlCenterY;
double pixelDistance = pow(pow(pixelX, 2) + pow(pixelY, 2), 0.5);
double pixelAngle = atan2(pixelX, pixelY);
// double swirlAmount = 1.0 - (pixelDistance/swirlRadius);
// if(swirlAmount > 0.0) {
// double twistAngle = swirlTwists * swirlAmount * PI * 2.0;
double twistAngle = swirlTwists * pixelDistance * PI * 2.0;
// adjust the pixel angle and compute the adjusted pixel co-ordinates:
pixelAngle += twistAngle;
pixelX = cos(pixelAngle) * pixelDistance;
pixelY = sin(pixelAngle) * pixelDistance;
// }
(this)->setPixel(i, j, tempMatrix[(int)(swirlCenterX + pixelX)][(int)(swirlCenterY + pixelY)]);
}
}`
Я пытаюсь реализовать функцию c ++ (код выше) на основе следующего псевдокода , который предполагается создать завихрение на изображении, но у меня есть некоторые проблемы с непрерывностью на границах.
Функция, которая у меня есть на данный момент, способна наложить завихрение на диск заданного размера и деформировать его почти так же, как Я желал, но его влияние не уменьшается, когда мы приближаемся к границам. Я пытался умножить угол поворота на коэффициент 1 - (r / R) (с r расстояние между текущим пикселем в функции и центром вихря, а R - радиус вихря), но это не дайте эффект, на который я рассчитывал.
Более того, я заметил, что на некоторых участках границы появляется тонкая белая линия (что означает, что значения пикселей там равны 1), и я могу ' Я не могу точно объяснить, почему.
Возможно, некоторые из моих проблем связаны со стандартной функцией atan2 C ++.