2017-04-09 4 views
1

Ich zeichne ein Diagramm mit 2000+ Punkten zu einer PDF-Datei. Die Auflösung der pdf ist 612 x 792. Ich kann nur 612 Punkte zum pdf zeichnen, weil die Breite 612 ist. Ich mappe 1 Punkt auf 1 Pixel. Wie kann ich alle 2000 + Samples auf das PDF plotten? Ich benutze diese Lib http://www.vulcanware.com/cpp_pdf/index.html.Zeige mehr Punkte als Auflösung

+0

Mögliche Duplikate von [Pdf Auflösung Skalierung für das Plotten] (http://stackoverflow.com/questions/43301673/pdf-resolution-scaling-for-plotting) – chtz

Antwort

1

Option 1: Skalieren Sie die Punkte mit x = (x * 612)/2000. Dies bedeutet, dass wenn zwei Punkte nahe beieinander liegen (einschließlich "ähnlichem y"), sie sich gegenseitig überschreiben.

Option 2: Behandeln Sie jeden Punkt als ein Quadrat; und Berechnen von Gleitkommawerten für die "linke Kante x" und "rechte Kante x", die skaliert wurden (left_x = ((x-width/2.0) * 612.0)/2000.0; right_x = ((x+width/2.0) * 612.0)/2000.0;), und Zeichnen des Quadrates unter Verwendung von Anti-Aliasing durch Berechnen der "Fläche des Zielpixels, dass das Quadrat überlappt" für jedes Ziel Pixel, das mit dem Quadrat überlappt. In diesem Fall müssen Sie "dest_pixel = max (dest_pixel + area, 1);" um Pixelwerte zu klemmen, wenn sich Quadrate überlappen.

Option 3: Drehen Sie das Ganze um 90 Grad, so dass "x-Achse" vertikal auf der Seite nach unten geht (und ggf. über mehrere Seiten verteilt werden kann); und wenn dies ein Problem für y verursacht, dann benutze eine der obigen Optionen für y.

Beachten Sie, dass "Option 2" sowohl in vertikaler als auch in horizontaler Richtung gleichzeitig ausgeführt werden kann. Dazu starten, indem die Kanten des Quadrates Bestimmung wie:

left_x = point_x/MAX_SRC_X * MAX_DEST_X; 
    right_x = (point_x + 1)/MAX_SRC_X * MAX_DEST_X; 
    top_y = point_y/MAX_SRC_Y * MAX_DEST_Y; 
    bottom_y = (point_y + 1)/MAX_SRC_Y * MAX_DEST_Y; 

Dann haben eine „für jede Zeile, die bewirkt wird,“ Schleife, die berechnet, wie viel jede Zeile durchgeführt wird, wie:

for(int y = top_y; y < bottom_y; y++) { 
     row_top = fmax(y, top_y); 
     row_bottom = fmin(y+1, bottom_y); 
     row_weight = row_bottom - row_top; 

haben dann eine ähnliche „für jede Spalte, die bewirkt wird,“ Schleife, wie:

 for(int x = left_x; x < right_x; x++) { 
      column_left = fmax(x, left_x); 
      column_right = fmin(x+1, right_x); 
      column_weight = column_right - column_left; 

dann ist die Fläche für das pixel berechnen, um das pixel gesetzt, und füllen die Schleifen:

  dest_pixel_area = row_weight * column_weight; 
      pixel[y][x].red = min(pixel[y][x].red + dest_pixel_area * red, MAX_RED); 
      pixel[y][x].green = min(pixel[y][x].green + dest_pixel_area * green, MAX_GREEN); 
      pixel[y][x].blue = min(pixel[y][x].blue + dest_pixel_area * blue, MAX_BLUE); 
     } 
    } 

Hinweis: Der obige Code ist nicht getestet und vereinfacht. Es kann schneller sein, die Schleifen in "erste Zeile/Spalte; Schleife nur für mittleren Bereich; dann letzte Zeile/Spalte" zu zerlegen, um die meisten der fmin/ zu entfernen.

Wenn Sie nur diese Richtung in einem tun, löschen Sie die Teile für die Richtung, die Sie brauchen, und verwenden Sie keine 1.0 für die entsprechende row_weight oder column_weight.

+0

@ Brendan- Ich versuchte die erste Option, es ist in der Lage zu zeichnen alle Punkte, aber es verzerrt diese Handlung. Die Handlung ist nicht glatt. Ich bin nicht sicher, wie man Option 2 implementiert. – amanda45

+0

@ amanda45: Ich habe ein paar Sachen hinzugefügt, die helfen könnten .. :-) – Brendan

Verwandte Themen