Example #1
0
        /// <summary>
        /// Obtém a posição no espaço 2D através da coordenada x e y da tela
        /// </summary>
        /// <param name="cam"></param>
        /// <param name="mouseXY"></param>
        /// <returns>Retorna ponto 2d pela coordenada X e Y da tela</returns>
        public static Eixos2 ObterPosEspaco2DMouseXY(
            this Camera2D cam, Eixos2 mouseXY)
        {
            Vetor2 PosCamZoomDiff = new Vetor2();

            PosCamZoomDiff = cam.Pos / cam.PosZ * cam.ZoomCamera - cam.Pos;

            float x = cam.Left + mouseXY.X + PosCamZoomDiff.X;
            float y = cam.Top + mouseXY.Y + PosCamZoomDiff.Y;

            Vetor2 ponto   = new Vetor2(x * cam.PosZ / cam.ZoomCamera, y * cam.PosZ / cam.ZoomCamera); // Reduz escala para tamanho real em 2D
            Eixos2 ponto2D = Util2D.RotacionarPonto2D(cam.Pos, ponto, cam.Angulo.Z);                   // Rotaciona ponto no tamanho real

            return(ponto2D);
        }
Example #2
0
        public static PointF ObterXYTelaPeloEspaco2D(this Camera2D cam, Eixos2 pos2D)
        {
            Vetor2 PosCam         = new Vetor2(cam.Pos);
            Vetor2 PosCamZoomDiff = new Vetor2();

            PosCamZoomDiff = cam.Pos / cam.PosZ * cam.ZoomCamera - cam.Pos;

            Vetor2 globalPos = (Vetor2)pos2D * cam.ZoomCamera / cam.PosZ;
            Eixos2 rot       = Util2D.RotacionarPonto2D(PosCam * cam.ZoomCamera / cam.PosZ,
                                                        globalPos, -cam.Angulo.Z);

            PointF pontoTela = new PointF();

            pontoTela.X = -cam.Left - PosCamZoomDiff.X + rot.X;
            pontoTela.Y = -cam.Top - PosCamZoomDiff.Y + rot.Y;

            return(pontoTela);
        }
Example #3
0
        public static IEnumerable <Vertice2> ObterVetoresObjeto2DPelaTela(this Camera2D camera, List <Objeto2D> objs, RectangleF rect)
        {
#warning Inserir novo sistema que considera angulo e zoom da camera
            for (int o = 0; o < objs.Count; o++)
            {
                Objeto2D obj = objs[o];

                for (int i = 1; i < obj.Vertices.Count() + 1; i++)
                {
                    Vertice2 v1, v2;
                    if (i == obj.Vertices.Count())
                    {
                        v1 = obj.Vertices[i - 1];
                        v2 = obj.Vertices[0];
                    }
                    else
                    {
                        v1 = obj.Vertices[i - 1];
                        v2 = obj.Vertices[i];
                    }

                    float x1Tela = -(camera.Pos.X - camera.ResWidth / 2) + obj.Pos.X + v1.X;
                    float y1Tela = -(camera.Pos.Y - camera.ResHeight / 2) + obj.Pos.Y + v1.Y;

                    float x2Tela = -(camera.Pos.X - camera.ResWidth / 2) + obj.Pos.X + v2.X;
                    float y2Tela = -(camera.Pos.Y - camera.ResHeight / 2) + obj.Pos.Y + v2.Y;

                    // Testa se o vetor está colidindo com a região do retângulo
                    if (Util2D.IntersecaoRetaRetangulo(new Vetor2(x1Tela, y1Tela), new Vetor2(x2Tela, y2Tela), rect))
                    {
                        yield return(v1);

                        yield return(v2);
                    }

                    i++; // Próximo vetor
                }
            }
        }