Brauche Hilfe

Verschiedenes zu Qt
Antworten
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Brauche Hilfe

Beitrag von Qt-nator »

Hi,

ich hab da ein Problem aber erstmal Code das veranschaulicht das vieleicht am anfang besser:

Code: Alles auswählen


int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);

  int nWidth;

  int nHeight;

  int nXAnzahl;

  int nYAnzahl;

  QVector<double> vecPoints;

  qDebug() << "Anzahl der X Punkte?\n";

  cin >> nXAnzahl;

  qDebug() << "Anzahl der Y Punkte?\n";

  cin >> nYAnzahl;

  qDebug() << "Breite eigeben!\n";

  cin >> nWidth;

  qDebug() << "Höhe eingeben!\n";

  cin >> nHeight;

  QImage Image(nWidth,nHeight, QImage::Format_Indexed8);

  QVector<QRgb> colorTable(255);

  QRgb *data = colorTable.data();

  for ( int i=0; i < 255; i++ )
  {
    data[i] = qRgb(i, i, i);
  }

  Image.setColorTable(colorTable);

  Image.fill(254);

  int nXStep = nWidth / nXAnzahl;

  qDebug() << "Werte eingeben!";

  for(int i = 0; i < nXAnzahl; i++)
  {
    Spline spl1(false,.5);

    for(int j = 0; j < nYAnzahl; j++)
    {
      qDebug() << "Wert für" << j << "ten" << i << "Wert eingeben";

      int nWert;

      cin >> nWert;

      spl1.addUserPoint(nWert);
    }

    for(int y = 0; y < nHeight; y++)
    {
      double dDiv = nHeight / nYAnzahl;

      double dSegmentNumberAndK = y / dDiv;

      int nSegment = dSegmentNumberAndK;

      double dK = dSegmentNumberAndK - nSegment;

      double dValue;

      spl1.evaluate(dValue,nSegment,dK);

      Image.setPixel(i * nXStep, y, dValue + .5); 
    }

    spl1.clearUserPoints();
  }

  Image.save("../);

  a.exit(0);
}

So also damit kann ich jetzt ein Bild erstellen Werte übergeben und daraus werden dann auf dem Bild vertikale Striche. Wobei die ersten Punkte den übergebenen Werten entsprechen und der Rest dazwischen wird interpolier. Das klappt soweit ganz gut.

1tes Problem: Wie krieg ich die "interpolierten" Werte in ein Array, Vector ist einfach aber ich brauch halt ein Array.

2tes Problem: Das ganze möchte ich jetzt auch noch Horizontal machen ich weis nur nicht wie ich die "interpolierten" Werte richtig übergeben kann damit das läuft...

Im Prinzip

Code: Alles auswählen


    for(int x = 0; x < nWidth - 1; x++)
    {
      double dDiv = nWidth / nXDirection;

      double dSegmentNumberAndK = x / dDiv;

      int nSegment = dSegmentNumberAndK;

      double dK = dSegmentNumberAndK - nSegment;

      double dValue;

      spl2.evaluate(dValue,nSegment,dK);

      vecPoints.push_back(dValue);

      imgImage.setPixel(x, y, dValue + .5); 
    }
Wäre es ja das. Nur weis ich jetzt nicht wie ich das oben einbaun kann damit die "interpolierten" Werte übergeben werden.

Ich hoffe das ist erstmal verständlich und würde mich sehr über Hilfe freun.

Gruß

Qt-Nator
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag von Qt-nator »

Hab da jetzt mal was versucht und das sieht jetzt nicht schlecht aus sag ich mal. Aber macht es auch Sinn? Wäre sehr verbunden wenn mal jemand drüberschaun könnte

Code: Alles auswählen


 int Test = vecPoints.size();

  int nReihe = Test / nXAnzahl;
  

  for(int y = 0; y < nHeight; y++)
  {
    Spline1d spl2(true,.5);

    spl2.clearUserPoints();

    for(int nYStep = 0; nYStep < nYAnzahl; nYStep++)
    {
      spl2.addUserPoint(vecPoints.value(nYStep * nReihe));       
    }

    for(int x = 0; x < nWidth; x++)
    {
      double dDiv = nWidth / nXAnzahl;

      double dSegmentNumberAndK = x / dDiv;

      int nSegment = dSegmentNumberAndK;

      double dK = dSegmentNumberAndK - nSegment;

      double dValue;

      spl2.evaluate(dValue,nSegment,dK);

      vecPoints.push_back(dValue);

      imgImage.setPixel(x, y, dValue + .5); 
    }
  }

gentlesea
Beiträge: 27
Registriert: 27. März 2008 10:30

Analyse

Beitrag von gentlesea »

Es wird bei Deinem Algorithmus über die Breite, dann über die Höhe iteriert. Dabei werden jeweils Werte eingelesen, die für jedes Paar (x, y) unterschiedlich sein können.
Das schreit nach der Verwendung einer Matrix zum Speichern der Werte. Dann kannst Du Dir auch das Array sparen.
Die Zeile

Code: Alles auswählen

double dSegmentNumberAndK = y / dDiv;
verstehe ich nicht ganz. Die Werte werden doch recht klein. Willst Du an dieser Stelle den Anfang aktuellen x bzw. y-Achsenabschnitts berechnen? Dann müßte das doch eher
double dSegmentNumberAndK = y * dDiv;
heissen.
Die Spline-Klasse wäre jetzt noch interessant.
Antworten