Как нарисовать 3D дуговой куб с нерегулярной фигурой?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как нарисовать 3D дуговой куб с нерегулярной фигурой?

Сообщение Anonymous »

Теперь я хочу нарисовать трехмерную фигуру, которая с дугой и нерегулярным путем.
Теперь я могу нарисовать 3D -куб и повернуть его. Но я не знаю, как нарисовать 3D с дугой или нерегулярным путем.
Вы можете сказать, почему вы добавляете Tag Andoid и C#. Я думаю, что независимо от языка, функция такая же, верно? Если я могу сделать это в JavaScript, я могу сделать это в Android.
Это изображение:
< /p>
if (myCube == null)
{
myCube = new XyCube(canvas.Width, canvas.Height, paint);
}

myCube.DrawCube(canvas);
public class XyCube
{
public float width;
public float height;
public Color Color;
public float center_x;
public float center_y;
public float center_z;
public float size;

public double speed;
public double line_width = 0;

Paint paint;

public XyCube(float w, float h, Paint _paint)
{
width = w;
height = h;
center_x = width / 2;
center_y = height / 2;
center_z = 0;
size = height / 2 / 2;
speed = 30 / (float)180 * Math.PI;
line_width = Math.Min(width, height) / 150;

paint = _paint;

vertices[0, 0] = center_x - size;
vertices[0, 1] = center_y - size;
vertices[0, 2] = center_z - size;
vertices[1, 0] = center_x + size;
vertices[1, 1] = center_y - size;
vertices[1, 2] = center_z - size;
vertices[2, 0] = center_x + size;
vertices[2, 1] = center_y + size;
vertices[2, 2] = center_z - size;
vertices[3, 0] = center_x - size;
vertices[3, 1] = center_y + size;
vertices[3, 2] = center_z - size;
vertices[3 + 1, 0] = center_x - size;
vertices[3 + 1, 1] = center_y - size;
vertices[3 + 1, 2] = center_z + size;
vertices[5, 0] = center_x + size;
vertices[5, 1] = center_y - size;
vertices[5, 2] = center_z + size;
vertices[6, 0] = center_x + size;
vertices[6, 1] = center_y + size;
vertices[6, 2] = center_z + size;
vertices[7, 0] = center_x - size;
vertices[7, 1] = center_y + size;
vertices[7, 2] = center_z + size;
}

private int[,] edges = {
{ 0, 1 },{1,2},{2,3},{3,0},
{3+1,5 },{5,6},{6,7},{7,3+1},
{0,3+1 },{1,5},{2,6},{3,7}
};

private float[,] vertices = new float[8, 3];
private float[,] vertices1 = new float[8, 3];

private void DrawRect(Canvas canvas, float x1, float y1, float x2, float y2)
{
paint.SetStyle(Paint.Style.Fill);
paint.Color = Color;
canvas.DrawRect(x1, y1, x2, y2, paint);
}

public void DrawCube(Canvas canvas)
{
paint.SetStyle(Paint.Style.Stroke);
paint.Color = Color;

var ex = edges.GetLength(0);

float _x = float.MaxValue;
float _y = float.MaxValue;
for (int i = 0; i < ex; i++)
{
var x1 = vertices[edges[i, 0], 0];
var y1 = vertices[edges[i, 0], 1];
if (x1 < _x)
{
_x = x1;
}
if (y1 < _y)
{
_y = y1;
}
}

_x = center_x / 5 - _x;
_y = center_y / 5 - _y;
_x = 0;
_y = 0;

for (int i = 0; i < ex; i++)
{
//var x1 = vertices[edges[i, 0], 0];
//var y1 = vertices[edges[i, 0], 1];
//var x2 = vertices[edges[i, 1], 0];
//var y2 = vertices[edges[i, 1], 1];
var x1 = vertices1[edges[i, 0], 0];
var y1 = vertices1[edges[i, 0], 1];
var x2 = vertices1[edges[i, 1], 0];
var y2 = vertices1[edges[i, 1], 1];

canvas.DrawLine(x1 + _x, y1 + _y, x2 + _x, y2 + _y, paint);
}
}

public float[,] MultiplyMatrices(float[,] m1, float[,] m2)
{
float[,] res = new float[m1.GetLength(0), m2.GetLength(1)];
var row = m1.GetLength(0);
var cols = m2.GetLength(1);
for (int i = 0; i < row; i++)
{
for (int j = 0; j < cols; j++)
{
for (int x = 0; x < m2.GetLength(0); x++)
{
res[i, j] += m1[i, x] * m2[x, j];
}
}
}
return res;
}

public float[,] RotateVertex(float x, float y, float angle_x, float angle_y, float angle_z)
{
float[,] rotate_x =
{
{1,0,0 },
{0,(float)Math.Cos(angle_x), -(float)Math.Sin(angle_x)},
{0,(float)Math.Sin(angle_x),(float)Math.Cos(angle_x) }
};
float[,] rotate_y =
{
{(float)Math.Cos(angle_y),0,(float)Math.Sin(angle_y) },
{0,1,0 },
{-(float)Math.Sin(angle_y),0,(float)Math.Cos(angle_y) }
};
float[,] rotate_z =
{
{(float)Math.Cos(angle_z),-(float)Math.Sin(angle_z),0 },
{(float)Math.Sin(angle_z),(float)Math.Cos(angle_z),0 },
{0,0,1 }
};

//x -= center_x;
//y -= center_y;

float[,] rotateCube = new float[8, 3];

//float[]=MultiplyMatrices(rotate_x,)
for (int i = 0; i < 8; i++)
{
float[,] p = new float[3, 1]
{
{vertices[i,0] },
{vertices[i,1] },
{vertices[i,2] }
};

float[,] rx = MultiplyMatrices(rotate_x, p);
float[,] ry = MultiplyMatrices(rotate_y, rx);
float[,] rz = MultiplyMatrices(rotate_z, ry);

//rotateCube[i, 0] = rz[0, 0] + center_x;
//rotateCube[i, 1] = rz[1, 0] + center_y;
//rotateCube[i, 2] = rz[2, 0] + center_z;
rotateCube[i, 0] = rz[0, 0];
rotateCube[i, 1] = rz[1, 0];
rotateCube[i, 2] = rz[2, 0];
}

//vertices = rotateCube;
vertices1 = rotateCube;

return rotateCube;
}
}


Подробнее здесь: https://stackoverflow.com/questions/795 ... lar-figure
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»