J'ai créé (avec aide) une fonction qui trace et dessine une ligne de blocs dans un espace 3D. Généralement, ceci est effectué dans un cube quadrillé 64x64x64.Correction du dessin au trait 3D en C#
C'est le code que j'ai:
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;
}
Il doit faire la queue le dessin de bloc et retourne le nombre de blocs qu'elle a tirées. Le problème est qu'il ne dessine pas une ligne non brisée. Dans certains cas, il laisse des espaces entre les blocs quand au moins tous les blocs devraient être connectés par leurs sommets.
La seule partie du code avec laquelle j'ai lutté est que je calculais la plus grande différence d'axe et que je produisais une constante de pente. J'ai rencontré un problème en essayant de faire une ligne diagonale parfaite. Toutes les valeurs étaient égales donc je suis juste par défaut à l'axe z - c'est là où je crois que le problème existe.
Permettra de tester ce code dans quelques heures. – SystemX17
Quelles étaient les valeurs de x0, y0, z0, x1, y1 et z1 qui donnaient la sortie incorrecte? –
désolé, s'il vous plaît noter dans mon code z est répertorié comme la hauteur si j'ai essayé avec juste une surface plane: x0 = 1 y0 = 1 Z0 = 1 x1 = 3 y1 = 3 z1 = 1 Cette tentative échoua à dessiner des résultats. – SystemX17