我已經(在幫助下)創建了一個在3D空間內繪製並繪製塊線的函數。通常這是在64x64x64網格立方體中執行的。更正C#中的3D線條繪圖#
這是我的代碼:
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);
if (Math.Abs(dx) > Math.Abs(dy) &&
Math.Abs(dx) > Math.Abs(dz) &&
detected == false)
{
detected = true;
float my = (float)dy/(float)dx;
float mz = (float)dz/(float)dx;
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);
}
}
if (Math.Abs(dy) > Math.Abs(dz) &&
Math.Abs(dy) > Math.Abs(dx) &&
detected == false)
{
detected = true;
float mz = (float)dz/(float)dy;
float mx = (float)dx/(float)dy;
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);
}
}
if (detected == false)
{
detected = true;
float mx = (float)dx/(float)dz;
float my = (float)dy/(float)dz;
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);
}
}
return blocks;
}
應該排隊的框圖和歸還它繪製的塊數。問題在於它沒有畫出一條不折線。在某些情況下,至少所有的塊都應該通過它們的頂點進行連接,這會在塊之間留下間隙。
我努力的代碼的唯一部分是我計算軸的最大差異並創建一個斜率常數。試圖做出完美的對角線時遇到了一個問題。所有值都是相等的,所以我只是默認了z軸 - 這是我相信問題存在的地方。
將在幾個小時內測試此代碼。 – SystemX17 2010-12-14 07:38:29
給出錯誤輸出的x0,y0,z0,x1,y1和z1的值是多少? – 2010-12-14 12:39:04
對不起,請注意我的碼z被列爲高度,所以我只是一個平面的嘗試: X0 = 1個 Y0 = 1 Z0 = 1 X1 = 3 Y1 = 3 Z1 = 1 這未能得出任何結果。 – SystemX17 2010-12-14 13:01:48