單色屏幕上畫水平線

/**java

 * 功能:有個單色屏幕存儲在一個一維字節數組中,使得8個連續像素能夠存放在一個字節裏。屏幕寬度位w,數組

 * 且w能夠被8整除(即一個字節不會分佈在兩行上),屏幕高度可由數組長度和屏幕寬度推算得出。app

 * 實現方法drawHorizontalLine(byte[] screen,int width,intx1,intx2,inty),繪製從點(x1,y)函數

 * 到點(x2,y)的水平線。測試

 */[java] view plain copyspa

 

  1. <pre name="code" class="java">    /** 
  2.  * 思路:使用screen[byte_pos]=0xff,一次設定一整個字節。起點和終點剩餘部分的位,使用掩碼設定。 
  3.  * @param screen 
  4.  * @param width 
  5.  * @param x1 
  6.  * @param x2 
  7.  * @param y 
  8.  */  
  9. public static void drawHorizontalLine(byte[] screen,int width,int x1,int x2,int y){  
  10.     int startOffset=x1%8;  
  11.     int firstFullByte=x1/8;  
  12.     if(startOffset!=0)  
  13.         firstFullByte++;  
  14.       
  15.     int endOffset=x2%8;  
  16.     int lastFullByte=x2/8;  
  17.     if(endOffset!=7)  
  18.         lastFullByte--;  
  19.       
  20.     //設定完整的字節  
  21.     for(int i=firstFullByte;i<=lastFullByte;i++){  
  22.         screen[(width/8)*y+i]=(byte)0xFF;  
  23.     }  
  24.       
  25.     //建立用於線條起點和終點的掩碼  
  26.     byte startMask=(byte) (1>>startOffset);  
  27.     byte endMask=(byte) ~(1>>(endOffset+1));  
  28.       
  29.     //設定線條的起點和終點  
  30.     if((x1/8)==(x2/8)){  
  31.         byte mask=(byte) (startMask&endMask);  
  32.         screen[(width/8)*y+(x1/8)]|=mask;  
  33.     }else{  
  34.         if(startOffset!=0){  
  35.             int byteNumber=(width/8)*y+firstFullByte-1;  
  36.             screen[byteNumber]|=startMask;  
  37.         }  
  38.         if(endOffset!=0){  
  39.             int byteNumber=(width/8)*y+lastFullByte+1;  
  40.             screen[byteNumber]|=endMask;  
  41.         }  
  42.     }  

 

擴展:.net


有一個單色屏幕儲存在一維數組中,其中數組的每一個元素表明連續的8位的像素的值,請實現一個函數,將第x到第y個像素塗上顏色(像素標號從零開始),並嘗試儘可能使用最快的辦法。
給定表示屏幕的數組screen(數組中的每一個元素表明連續的8個像素,且從左至右的像素分別對應元素的二進制的從低到高位),以及int x,int y,意義如題意所述,保證輸入數據合法。請返回塗色後的新的屏幕數組。
測試樣例:
[0,0,0,0,0,0],0,47
返回:[255,255,255,255,255,255]

* \問題分析:
基本上大意就是從第x 到第y位 ,其中的像素所有變爲0,如此兩種狀況 :0-->1, 1-->1 ,因此這時候就很清楚的用 位操做中的 ' | '

 

 

for (int i = x; i <= y;i++)
        {
            int k = i % 8;
            int t = i / 8;
            screen[t] = screen[t] | (1<<k);
        }
相關文章
相關標籤/搜索