Colegas, estou com uma grande dificuldade para criar regions sobre uma imagem.

Estou usando DrawPolygon para mapear as coordenadas, mas tem sido bastante trabalhoso conseguir acertar. Usando 4 pontos. Tem sido na exaustiva tentativa e erro. Alguém teria alguma solução, sugestão ou orientação, por gentileza?

Segue a imagem em si e o código que delimita o primeiro campo, primeiro polígono na parte superior esquerda da figura.

protected override void OnPaint(PaintEventArgs e)
{

Point pointBtn1_1 = new Point(104,3); 
Point pointBtn1_2 = new Point(104,67);
Point pointBtn1_3 = new Point(78,76);
Point pointBtn1_4 = new Point(34,32);
Point[] curvePoints1 =
{
pointBtn1_1,
pointBtn1_2,
pointBtn1_3,
pointBtn1_4,
};

// Make the GraphicsPath
GraphicsPath polygonPath= new GraphicsPath(FillMode.Winding);
polygonPath.AddPolygon(curvePoints);

// Convert the GraphicsPath into a Region.
Region polygonRegion= new Region(polygonPath);

// Constrain to the region.
this.Region = polygonRegion;

} // -- End OnPaint method

Existe uma informação relevante que pode ajudar a solucionar o problema. Invertendo-se as coordenadas dos pontos (trocando x por y em cada Point), mapeia-se o polígono à centro esquerda da imagem.

Desde já agradeço a quem puder colaborar.

Exibições: 58

Anexos

Respostas a este tópico

Caro Marcos Mendes,

Para mapear os polígonos do jeito que vc deseja, a melhor forma de se obter os pontos é através da trigonometria. Onde inserimos o raio e o ângulo e através dos seno e cosseno obtemos os pontos x e y.

Eis aqui um simples método para calcular o ponto.

Veja que criei uma struct para ajudar. Depois disso é só substituir os valores nos pontos de sua biblioteca.

 public struct Point
    {
        double x, y;
        public Point(double x, double y)
        {
            this.x = x;
            this.y = y;
        }
        public double X => x;
        public double Y => y;

        public override string ToString()
        {
            return $"X:{x}; Y:{y}";
        }
    }

  public static Point CriarPonto(double angulo, double raio, Point origem)
        {
            var anguloradiano = (angulo * Math.PI) / 180;
            var y = (raio * Sin(anguloradiano)) + origem.Y;
            var x = (raio * Cos(anguloradiano)) + origem.X;
            return new Point(x, y);
        }

Com isso, basta apenas gerar um loop para obter os pontos...

A curvatura dos segmentos, irá depender dessa biblioteca que vc utiliza...No meu caso estou utilizando o UWP, se eu quisesse um perfeito contorno no botões, bastaria apenas trocar o LineSegment por BezierSegment, porem deveria também fazer pequenos ajustes...Mas aqui não vem ao caso...

Veja o resultado do mapeamento de pontos...

pronto, espero que tenha o ajudado...

Se quiser , depois posso com mais calma mostrar o resultado contornando perfeitamente os botões utilizando o BezierSegment para o UWP


Pô Bruno! Obrigado companheiro!

Vou experimentar aqui!!!!

Bruno Torres Mendes da Silva disse:

Caro Marcos Mendes,

Para mapear os polígonos do jeito que vc deseja, a melhor forma de se obter os pontos é através da trigonometria. Onde inserimos o raio e o ângulo e através dos seno e cosseno obtemos os pontos x e y.

Eis aqui um simples método para calcular o ponto.

Veja que criei uma struct para ajudar. Depois disso é só substituir os valores nos pontos de sua biblioteca.

 public struct Point
    {
        double x, y;
        public Point(double x, double y)
        {
            this.x = x;
            this.y = y;
        }
        public double X => x;
        public double Y => y;

        public override string ToString()
        {
            return $"X:{x}; Y:{y}";
        }
    }

  public static Point CriarPonto(double angulo, double raio, Point origem)
        {
            var anguloradiano = (angulo * Math.PI) / 180;
            var y = (raio * Sin(anguloradiano)) + origem.Y;
            var x = (raio * Cos(anguloradiano)) + origem.X;
            return new Point(x, y);
        }

Com isso, basta apenas gerar um loop para obter os pontos...

A curvatura dos segmentos, irá depender dessa biblioteca que vc utiliza...No meu caso estou utilizando o UWP, se eu quisesse um perfeito contorno no botões, bastaria apenas trocar o LineSegment por BezierSegment, porem deveria também fazer pequenos ajustes...Mas aqui não vem ao caso...

Veja o resultado do mapeamento de pontos...

pronto, espero que tenha o ajudado...

Se quiser , depois posso com mais calma mostrar o resultado contornando perfeitamente os botões utilizando o BezierSegment para o UWP

RSS

© 2017   Criado por Ramon Durães.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço