2010-12-06 33 views
0

液在BOTTOM這個問題在網格佈局繪製一條線,然後在加入veritcal軸

我有這樣的代碼:

public void lineImproved(int x0, int y0, int x1, int y1, Color color) 
{ 
    int pix = color.getRGB(); 
    int dx = x1 - x0; 
    int dy = y1 - y0; 

    raster.setPixel(pix, x0, y0); 
    if (Math.abs(dx) > Math.abs(dy)) {   // slope < 1 
     float m = (float) dy/(float) dx;  // compute slope 
     float b = y0 - m*x0; 
     dx = (dx < 0) ? -1 : 1; 
     while (x0 != x1) { 
      x0 += dx; 
      raster.setPixel(pix, x0, Math.round(m*x0 + b)); 
     } 
    } else 
    if (dy != 0) {        // slope >= 1 
     float m = (float) dx/(float) dy;  // compute slope 
     float b = x0 - m*y0; 
     dy = (dy < 0) ? -1 : 1; 
     while (y0 != y1) { 
      y0 += dy; 
      raster.setPixel(pix, Math.round(m*y0 + b), y0); 
     } 
    } 
} 

目前,它繪製一條線,在特定的像素填充構成指定的兩個點之間的線(即[x0,y0]和[x1,y1])。我需要它包含h0和h1以獲得2分的高度。通過這樣做,我希望能夠通過每個raster.setPixel函數獲得垂直軸上的高度值。

UPDATE 我現在的代碼應該如何執行此任務,但仍然只能在2D中執行。我需要實現的建議解決方案下面的代碼進行驗證:

internal static int DrawLine(Player theplayer, Byte drawBlock, int x0, int y0, int z0, int x1, int y1, int z1) 
    { 
     int blocks = 0; 
     bool cannotUndo = false; 

     int dx = x1 - x0; 
     int dy = y1 - y0; 
     int dz = z1 - z0; 

     DrawOneBlock (theplayer, drawBlock, x0, y0, z0, ref blocks, ref cannotUndo); 
     if (Math.Abs(dx) > Math.Abs(dy)) 
     {   // slope < 1 
      float m = (float)dy/(float)dx;  // compute slope 
      float b = y0 - m * x0; 
      dx = (dx < 0) ? -1 : 1; 
      while (x0 != x1) 
      { 
       x0 += dx; 
       DrawOneBlock(theplayer, drawBlock, x0, Convert.ToInt32(Math.Round(m * x0 + b)), z0, ref blocks, ref cannotUndo); 
      } 
     } 
     else 
     { 

      if (dy != 0) 
      {        // slope >= 1 
       float m = (float)dx/(float)dy;  // compute slope 
       float b = x0 - m * y0; 
       dy = (dy < 0) ? -1 : 1; 
       while (y0 != y1) 
       { 
        y0 += dy; 
        DrawOneBlock(theplayer, drawBlock, Convert.ToInt32(Math.Round(m * y0 + b)), y0, z0, ref blocks, ref cannotUndo); 
       } 
      } 
     } 
     return blocks; 
    } 

SOLUTION:

internal static int DrawLine(Player theplayer, Byte drawBlock, int x0, int y0, int z0, int x1, int y1, int z1) 
    { 
     int blocks = 0; 
     bool cannotUndo = false; 
     bool detected = false; 

     int dx = x1 - x0; 
     int dy = y1 - y0; 
     int dz = z1 - z0; 

     DrawOneBlock (theplayer, drawBlock, x0, y0, z0, ref blocks, ref cannotUndo); 

    //a>x,b>y,c>z 
    if (Math.Abs(dx) > Math.Abs(dy) && Math.Abs(dx) > Math.Abs(dz) && detected == false) 
     { // x distance is largest 
      detected = true; 
      float my = (float)dy/(float)dx;  // compute y slope 
      float mz = (float)dz/(float)dx;  // compute z slope 
      float by = y0 - my * x0; 
      float bz = z0 - mz * x0; 
      dx = (dx < 0) ? -1 : 1; 
      while (x0 != x1) 
      { 
       x0 += dx; 
       DrawOneBlock(theplayer, drawBlock, Convert.ToInt32(x0), Convert.ToInt32(Math.Round(my * x0 + by)), Convert.ToInt32(Math.Round(mz * x0 + bz)), ref blocks, ref cannotUndo); 
      } 
     } 

    //a>y,b>z,c>x 
    if (Math.Abs(dy) > Math.Abs(dz) && Math.Abs(dy) > Math.Abs(dx) && detected == false && detected == false) 
     { // y distance is largest 
      detected = true; 
      float mz = (float)dz/(float)dy;  // compute z slope 
      float mx = (float)dx/(float)dy;  // compute x slope 
      float bz = z0 - mz * y0; 
      float bx = x0 - mx * y0; 
      dy = (dy < 0) ? -1 : 1; 
      while (y0 != y1) 
      { 
       y0 += dy; 
       DrawOneBlock(theplayer, drawBlock, Convert.ToInt32(Math.Round(mx * y0 + bx)), Convert.ToInt32(y0) , Convert.ToInt32(Math.Round(mz * y0 + bz)), ref blocks, ref cannotUndo); 
      } 
     } 

    //a>z,b>x,c>y 
    if (Math.Abs(dz) > Math.Abs(dx) && Math.Abs(dz) > Math.Abs(dy) && detected == false && detected == false) 
     { // z distance is largest 
      detected = true; 
      float mx = (float)dx/(float)dz;  // compute x slope 
      float my = (float)dy/(float)dz;  // compute y slope 
      float bx = x0 - mx * z0; 
      float by = y0 - my * z0; 
      dz = (dz < 0) ? -1 : 1; 
      while (z0 != z1) 
      { 
       z0 += dz; 
       DrawOneBlock(theplayer, drawBlock, Convert.ToInt32(Math.Round(mx * z0 + bx)), Convert.ToInt32(Math.Round(my * z0 + by)), Convert.ToInt32(z0), ref blocks, ref cannotUndo); 
      } 
     } 
+0

您的意思是添加z尺寸以便填充3D柵格(體素字段)嗎?否則,高度在你的情況下意味着什麼不是y0和y1的高度? – Hannesh 2010-12-06 17:20:04

+0

我沒有正確解釋。我現在可以在x0,y0到x1,y1的平面上繪製一條線,並且正確填充中間的像素以完成該線。 – SystemX17 2010-12-06 17:22:43

回答

1

您將需要比較abs(dx)abs(dy)abs(dz)和揀最大的一個。在每種情況下,使用類似於您擁有的代碼,類似地計算其他座標:

if (Math.abs(dx) > Math.abs(dy) && Math.abs(dx) > Math.abs(dz)) { // x distance is largest 
    float my = (float) dy/(float) dx;  // compute y slope 
    float mz = (float) dz/(float) dx;  // compute z slope 
    float by = y0 - my*x0; 
    float bz = z0 - mz*x0; 
    dx = (dx < 0) ? -1 : 1; 
    while (x0 != x1) { 
     x0 += dx; 
     raster.setPixel(pix, x0, Math.round(my*x0 + by), Math.round(mz*x0 + bz)); 
    }