/// <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); }
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); }
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 } } }