// Calcule a projeção de um polígono em um eixo e retorne-o como um intervalo [min, max] public void ProjecaoPoligono(Eixos global_eixo, Objeto2D poligono, ref float min, ref float max) { // Para projetar um ponto em um eixo, use o produto escalar float d = global_eixo.Produto(poligono.Vertices[0].Global); min = d; max = d; for (int i = 0; i < poligono.Vertices.Count; i++) { d = poligono.Vertices[i].Global.Produto(global_eixo); if (d < min) { min = d; } else { if (d > max) { max = d; } } } }
// desenha o número em uma face do dado private void desenhaNumeroDado(int numero, Face face) { // salva em quantas colunas os círculos aparecem para cada número (o número é indicado pelo índice) int[] intervaloA = new int[6] { 2, 4, 6, 4, 6, 4 }; int[] intervaloB = new int[6] { 2, 4, 6, 4, 6, 6 }; Eixos eixos = Eixos.X_Y; Ponto4D ptoCentro = null; Circulo c; double somarA = 0; double somarB = 0; for (int i = 0; i <= numero; i++) { // adiciona o ponto central do círculo de acordo com a face switch (face) { case Face.CIMA: ptoCentro = new Ponto4D(base.pontosLista[0].X + tamanhoDado / intervaloA[numero] + somarA, base.pontosLista[2].Y + 0.01, base.pontosLista[0].Z - tamanhoDado / intervaloB[numero] - somarB); eixos = Eixos.X_Z; break; case Face.BAIXO: ptoCentro = new Ponto4D(base.pontosLista[0].X + tamanhoDado / intervaloA[numero] + somarA, base.pontosLista[0].Y - 0.01, base.pontosLista[0].Z - tamanhoDado / intervaloB[numero] - somarB); eixos = Eixos.X_Z; break; case Face.FRENTE: ptoCentro = new Ponto4D(base.pontosLista[0].X + tamanhoDado / intervaloA[numero] + somarA, base.pontosLista[0].Y + tamanhoDado / intervaloB[numero] + somarB, base.pontosLista[0].Z + 0.01); break; case Face.FUNDO: ptoCentro = new Ponto4D(base.pontosLista[0].X + tamanhoDado / intervaloA[numero] + somarA, base.pontosLista[0].Y + tamanhoDado / intervaloB[numero] + somarB, base.pontosLista[4].Z - 0.01); break; case Face.DIREITA: ptoCentro = new Ponto4D(base.pontosLista[1].X + 0.01, base.pontosLista[1].Y + tamanhoDado / intervaloB[numero] + somarB, base.pontosLista[1].Z - tamanhoDado / intervaloA[numero] - somarA); eixos = Eixos.Y_Z; break; case Face.ESQUERDA: ptoCentro = new Ponto4D(base.pontosLista[0].X - 0.01, base.pontosLista[4].Y + tamanhoDado / intervaloB[numero] + somarB, base.pontosLista[4].Z + tamanhoDado / intervaloA[numero] + somarA); eixos = Eixos.Y_Z; break; } // altera os valores que devem ser somados nas coordenadas do ponto central do próximo círculo if (((numero == 2 || numero == 4) && (i == 0 || i == 1)) || ((numero == 1 || numero == 3 || numero == 5) && i == 0)) { somarA += 2 * (tamanhoDado / intervaloA[numero]); somarB += 2 * (tamanhoDado / intervaloB[numero]); } else if ((numero == 4 && i == 2) || ((numero == 3 || numero == 5) && i == 1)) { somarA = 0; } else if (numero == 4 && i == 3) { somarA = 4 * (tamanhoDado / intervaloA[numero]); somarB = 0; } else if ((numero == 3 || numero == 5) && i == 2) { somarA = 2 * (tamanhoDado / intervaloA[numero]); somarB = 0; } else if (numero == 5 && i == 3) { somarA = 0; somarB = 4 * (tamanhoDado / intervaloB[numero]); } else if (numero == 5 && i == 4) { somarA = 2 * (tamanhoDado / intervaloA[numero]); } // adiciona o círculo c = new Circulo(Utilitario.charProximo(), this, 15, tamanhoDado / 8, ptoCentro, eixos); c.ObjetoCor.CorR = 0; c.ObjetoCor.CorG = 0; c.ObjetoCor.CorB = 0; c.PrimitivaTipo = PrimitiveType.TriangleStrip; } }
public Circulo(char rotulo, Objeto paiRef, int qntPontos, double raio, Ponto4D centro, Eixos eixos) : base(rotulo, paiRef) { this.qntPontos = qntPontos; this.raio = raio; Ponto4D p = new Ponto4D(); Ponto4D q = new Ponto4D(); double ang = 360 / qntPontos; int cont = 0; for (int i = 0; i < qntPontos; i++) { if (cont == 1) { q = base.PontosUltimo(); base.PontosAdicionar(new Ponto4D(centro.X, centro.Y, centro.Z)); } p = Matematica.GerarPtosCirculo(ang * i, raio); switch (eixos) { case Eixos.X_Y: base.PontosAdicionar(new Ponto4D(p.X + centro.X, p.Y + centro.Y, centro.Z)); break; case Eixos.X_Z: base.PontosAdicionar(new Ponto4D(p.X + centro.X, centro.Y, p.Y + centro.Z)); break; case Eixos.Y_Z: base.PontosAdicionar(new Ponto4D(centro.X, p.X + centro.Y, p.Y + centro.Z)); break; } cont++; if (cont == 2) { p = base.PontosUltimo(); base.PontosAdicionar(new Ponto4D(q.X, q.Y, q.Z)); base.PontosAdicionar(new Ponto4D(p.X, p.Y, p.Z)); cont = 0; } } }
public void MostraCaixas(Eixos eixo, int n) { if (eixo == Eixos.X) { for (int y = min.y; y < max.y; y++) { for (int z = min.z; z < max.z; z++) { //Debug.Log(new Vector3Int(n, y, z)); MostraCaixa(matrizCaixas[n][y][z]); } } if (n == min.x - 1) { min.x--; } else { max.x++; } } else if (eixo == Eixos.Y) { for (int x = min.x; x < max.x; x++) { for (int z = min.z; z < max.z; z++) { //Debug.Log(new Vector3Int(x, n, z)); MostraCaixa(matrizCaixas[x][n][z]); } } if (n == min.y - 1) { min.y--; } else { max.y++; } } else { for (int x = min.x; x < max.x; x++) { for (int y = min.y; y < max.y; y++) { //Debug.Log(new Vector3Int(x, y, n)); MostraCaixa(matrizCaixas[x][y][n]); } } if (n == min.z - 1) { min.z--; } else { max.z++; } } }