2017-04-09 48 views
1

我正在繪製一個包含2000多個點的圖形,以pdf文件形式顯示。 PDF的分辨率是612 x 792.由於寬度是612,因此我只能繪製612點到pdf。我將1點映射到1個像素。我怎樣才能將所有2000多個樣本繪製成PDF格式。我正在使用這個lib http://www.vulcanware.com/cpp_pdf/index.html顯示更多分數然後分辨率

+0

可能重複的[Pdf分辨率縮放繪圖](http://stackoverflow.com/questions/43301673/pdf-resolution-scaling-for-plotting) – chtz

回答

1

選項1:使用x = (x * 612)/2000來縮放分數。這意味着如果2點彼此接近(包括「相似的y」),它們將相互覆蓋。

選項2:將每個點視爲正方形;並計算已經縮放的「左邊緣x」和「右邊緣x」的浮點值(left_x = ((x-width/2.0) * 612.0)/2000.0; right_x = ((x+width/2.0) * 612.0)/2000.0;),並且通過針對每個目的地計算「正方形重疊的目的像素的面積」來使用抗鋸齒繪製正方形與正方形重疊的像素。在這種情況下,您需要執行「dest_pixel = max(dest_pixel + area,1);」在正方形重疊時鉗位像素值。選項3:將整個東西旋轉90度,使「x軸」沿頁面垂直向下(如果需要,可以分成多個頁面);如果這對y造成問題,那麼使用上面的y選項之一。

請注意,「選項2」可同時在兩個(垂直和水平)方向上完成。

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; 

然後有一個「對於被影響的每一行」循環計算每行有多少影響,如:

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; 
要做到這一點,通過確定廣場的邊緣,就像啓動

然後有一個類似的「爲每一列被實現」循環,如:

 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; 

然後計算面積對於像素,設置像素,並完成循環:

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

注意:以上所有代碼均未經過測試和簡化。將環路分解爲「第一行/列;僅用於中間區域的循環;然後是最後一行/列」可以更快地移除大部分fmin/fmax

如果你只需要做到這一點的一個方向,刪除的方向,你不需要和使用1.0爲相應row_weightcolumn_weight部分。

+0

@布倫丹 - 我試過第一個選項,它能夠繪製所有的點,但它扭曲了那個情節。情節並不平坦。我不知道如何實現選項2. – amanda45

+0

@ amanda45:我添加了一些可能有用的東西.. :-) – Brendan