2017-04-09 3 views
1

Je dessine un graphique avec plus de 2000 points dans un fichier pdf. La résolution du pdf est 612 x 792. Je peux seulement dessiner 612 points au pdf parce que la largeur est 612. Je suis la cartographie 1 point à 1 pixel. Comment puis-je tracer tous les 2000+ échantillons au pdf. J'utilise cette lib http://www.vulcanware.com/cpp_pdf/index.html.Afficher plus de points puis résolution

+0

Copie possible de [Mise à l'échelle de la résolution Pdf pour le traçage] (http://stackoverflow.com/questions/43301673/pdf-resolution-scaling-for-plotting) – chtz

Répondre

1

Option 1: Mettre à l'échelle les points en utilisant x = (x * 612)/2000. Cela signifie que si 2 points sont proches l'un de l'autre (y compris "y similaire"), ils se remplaceront mutuellement.

Option 2: Traiter chaque point comme un carré; et calculer des valeurs à virgule flottante pour le "bord gauche x" et "le bord droit x" qui ont été mis à l'échelle (left_x = ((x-width/2.0) * 612.0)/2000.0; right_x = ((x+width/2.0) * 612.0)/2000.0;), et dessiner le carré en utilisant l'anticrénelage, en calculant "zone de pixel de destination que le carré chevauche" pour chaque destination pixel qui chevauche le carré. Dans ce cas, vous devrez faire "dest_pixel = max (dest_pixel + area, 1);" pour bloquer les valeurs de pixels lorsque les carrés se chevauchent.

Option 3: Faites pivoter l'ensemble de 90 degrés de sorte que «axe x» descende verticalement sur la page (et puisse être divisé sur plusieurs pages si nécessaire); et si cela pose un problème pour y, utilisez l'une des options ci-dessus pour y. Notez que «l'option 2» peut être effectuée dans les deux sens (vertical et horizontal) en même temps. Pour ce faire, commencez par déterminer les bords de la place, comme:

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; 

Testez ensuite « pour chaque ligne est effectuée » boucle qui calcule la quantité de chaque ligne est effectué, comme:

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; 

Ensuite, ont un même « pour chaque colonne qui est effectuée » en boucle, comme:

 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; 

calculent ensuite la zone du pixel, régler le pixel, et compléter les boucles:

  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); 
     } 
    } 

Remarque: Tout le code ci-dessus n'a pas été testé et simplifié. Il peut être plus rapide de casser les boucles en "première ligne/colonne, boucle pour la zone du milieu seulement, puis dernière ligne/colonne" pour enlever la plupart des fmin/fmax.

Si vous avez seulement besoin de le faire dans un sens, supprimer les parties pour la direction que vous n'avez pas besoin et utilisez 1.0 pour le row_weight ou column_weight correspondant.

+0

@ Brendan- J'ai essayé la première option, c'est capable de dessiner tous les points, mais il déforme cette intrigue. L'intrigue n'est pas lisse. Je ne suis pas sûr de savoir comment implémenter l'option 2. – amanda45

+0

@ amanda45: J'ai ajouté quelques trucs qui pourraient aider .. :-) – Brendan