Frage zu Rundungsfehler [gelöst]
-
Jetzt noch ein bischen mehr Code zeigen!
Vermutlich steht der oben gezeigte Code innerhalb einer Schleife. Wie ist das Abbruchskriterium? Wie berechnet sich "dPhi" ?
Muss man dir alles aus der Nase ziehen?
-
Hättest ja sagen können das du mehr code sehen willst...
for (int y = 0; y < nHeightDst; y++) { for (int x = 0; x < nWidthDst; x++) { double dSx = x - dCenterX; double dSy = dCenterY - y; double dRadius = sqrt(double(dSx*dSx + dSy*dSy)); double dPhi = atan2(dSy, dSx); if (dPhi<0) { dPhi+= 2.*M_PI; } if (dPhi>2.*M_PI) { dPhi-= 2.*M_PI; } double dU = dPhi / (2.*3.2); double dV = dRadius / maxR; int i = y*nWidthDst + x; if(dRadius > maxR) { pxMap[i] = -1; pyMap[i] = -1; } pxMap[i] = dU * srcSize.width; pyMap[i] = dV * srcSize.height; } }Bitteschön
-
Gugi schrieb:
mh, versuch mal das 2. duch 2.00000000 oder so zu ersetzten oder durch static_cast<double>(2.0).
Aber nur bei Vollmond!
-
GT schrieb:
Das bringt leider nix.
Danke für die mühe.
Hast Du mal etwas mehr Code? Mit Der Schleife, die zur Generierung durchlaufen wird z.B.?
Wie ist M_PI genau definiert?
-
Ich hab die math.h includet wo M_PI ja drin ist.
-
GT schrieb:
Ich hab die math.h includet wo M_PI ja drin ist.
Hmm, Standard ist das aber nicht.
ich definiere Pi immer so:
const double PI = acos(-1.0);
-
Das ja auch nicht der ganze Code... wäre bisschen viel.
das kann ich ja mal Probieren.
Danke
Edit:
Ohne Veränderung.
-
Dein Problem liegt vermutlich woanders - das untere Bild sieht für mich auf jeden fall (bis auf den "Spalt") "richtiger" aus als das obere. Die Winkel passen nämlich dort alle schön, was man vom oberen Bild nicht sagen kann.
-
Dein Code
if(dRadius > maxR) { pxMap[i] = -1; pyMap[i] = -1; } pxMap[i] = dU * srcSize.width; pyMap[i] = dV * srcSize.height;ist wohl so schon mal richtiger:
if(dRadius > maxR) { pxMap[i] = -1; pyMap[i] = -1; } else{ pxMap[i] = dU * srcSize.width; pyMap[i] = dV * srcSize.height; }Sollte aber dein Problem nicht lösen.
Ansonsten merk dir doch mal eine fehlerhafte Pixelposition im Bild. Deine Schleifen iterieren ja durch dein Zielbild, kannst also beim entsprechenden x,y mit dem Debuger nachschauen, was an der Stelle passiert.
Aber eigentlich bin ich auch der Meinung, dass das Problem nicht in dem Codeteil steckt, den wir hier von dir zu sehen bekommen.
-
p.S.: mit "woanders" meine ich nicht "in einem Codeteil den wir hier nicht sehen", sondern "nicht bei der Winkelberechnung".
Sieht eher so aus als ob wo eine "liegt der Punkt noch im Source-Bild" Abfrage drinnen wäre die mit einem Falschen Limit (Schwellenwert) arbeitet, oder wo man ggf. die Koordinaten clampen müsste.
-
Also bei mir schliesst sich der Kreis!
Habe an den eigentlichen Berechnungen nichts geändert -> Dein Code ist richtig, zumindest der Teil, den wir sehen.double M_PI = acos(-1); MFFTiff source("bild2.tif"); unsigned char *ucS = source.read(); int nHeightDst = 600; int nWidthDst = 600; int dCenterX = nWidthDst/2; int dCenterY = nHeightDst/2; int maxR = 300; unsigned char *ucT = new unsigned char[nWidthDst*nHeightDst*3]; for (int y = 0; y < nHeightDst; y++){ for (int x = 0; x < nWidthDst; x++){ double dSx = x - dCenterX; double dSy = dCenterY - y; double dRadius = sqrt(double(dSx*dSx + dSy*dSy)); double dPhi = atan2(dSy, dSx); if (dPhi<0){ dPhi+= 2.*M_PI; } if (dPhi>2.*M_PI){ dPhi-= 2.*M_PI; } //double dU = dPhi / (2.*3.2);// Edit double dU = dPhi / (2.*M_PI);// Edit double dV = dRadius / maxR; int i = (y*nWidthDst + x)*3; if(dRadius > maxR){ } else{ //int ix = dU * (source.width()-1);// Edit //int iy = dV * (source.height()-1);// Edit int ix = dU * source.width();// Edit int iy = dV * source.height();// Edit ucT[i] = ucS[(ix+iy*source.width())*3]; ucT[i+1] = ucS[(ix+iy*source.width())*3+1]; ucT[i+2] = ucS[(ix+iy*source.width())*3+2]; } } } MFFTiff target("result.tif",nWidthDst,nHeightDst,MRGB); target.write(ucT,nWidthDst*nHeightDst*3);Edit: Hab ein paar Fehler mit übernommen. Aber auch nach Korrektur schliesst sich der Kreis.
-
Nett von dir das du es nochmal ausgetestet hast.
Den Fehler hab ich jetzt gefunden:
Ist 100%tig ein Rundungsfehler der dadurch koriegiert werden kann.
else { pxMap[i] = dU * srcSize.width - 1; if(pxMap[i] < 0) { pxMap[i] = 0; } pyMap[i] = dV * srcSize.height; }Aber damit du auch mal den Rest vom Code siehst... ist nur ein File Dialog.. und Definition für einige Variablen die ich dann für eine Funktion brauche. poste ich dir mal die Funktion.
ippiRemap_8u_C4R(pSrc, srcSize, srcStep, srcRoi, pxMap, xMapStride, pyMap, yMapStride, pDst, dstStep, dstRoiSize, nInterpolation);Weis nicht obs dir was bringt aber Was am Code jetzt noch fehlen Würde wäre die Definition der Variablen für dieses Funktion und der FileDialog.
Also vielen Dank an alle und dir MiP ein extra dank dafür das du dich so reihngehängt hast.
Mit was erstellst du eigentlich den Kreis??
Also ich ja mit der ippiRemap weil dein MFFTiff sagt mir reihn garnichts.
-
MFFTiff ist eine eigene Klasse zum Tiff lesen/schreiben.
Aber den Rundungsfehler sehe ich immer noch nicht.
Aber egal, schliesslich hast du ja die Frage gestellt und nicht ich.
Gruss,
MiP