C# -  Verificando a relação de um ponto e uma circunferência


Neste artigo vamos lembrar um pouco de matemática básica com a ajuda da linguagem C#.   Vamos criar um pequeno programa para verificar se um ponto pertence a um determinado círculo.
Nosso objetivo será : Dados 1 ponto  P(x,y) com sua respectiva coordenada, devemos verificar se o ponto pertence a uma circunferência de raio C(x,y) conhecido.

Um trabalho bem simples para a linguagem C# como você mesmo verá.
 
Recursos usados:
 
Teoria
 
O ponto comparado à circunferência pode assumir três posições diferentes, pode ser:
  1. externo à circunferência,
  2. interno à circunferência ou
  3. pertencer à circunferência.

    Antes é preciso saber o que é uma circunferência, veja o desenho abaixo que distingue círculo de circunferência:
 
 
Portanto, circunferência é o contorno de um círculo. E podemos dizer que no círculo e fora dele e na própria circunferência existem infinitos pontos.
  1. Ponto externo à circunferência

Podemos concluir que nesse caso o raio é menor que a distância do ponto P ao centro da circunferência.

Então, como dPC > R podemos escrever: (Cx – Px)^2 + (Cy – Py)^2 > Raio^2

  1. Ponto interno à circunferência

Podemos concluir que nesse caso o raio é maior que a distância do ponto P ao centro da circunferência.

Então, como dPC < R podemos escrever: (Cx – Px)^2 + (Cy – Py)^2 < Raio^2

  1. Ponto pertence à circunferência

Podemos concluir que nesse caso o raio é igual à distância do ponto P ao centro da circunferência.

Então, como dPC = R podemos escrever:(Cx – Px)^2 + (Cy – Py)^2 = Raio^2

Sendo assim, quando tivermos que verificar a posição relativa de um ponto em relação a uma circunferência, devemos calcular a distância entre o centro e o ponto, ou então substituir as coordenadas do ponto na equação da circunferência e verificar o valor numérico obtido.

fonte: http://www.brasilescola.com/matematica/posicoes-relativas-entre-ponto-circunferencia.htm (acessado em março de 2014)

Criando o Projeto

Abra o Visual Studio Express 2012 for Windows Desktop e crie um novo projeto clicando em New Project;

A seguir selecione o template : Windows Forms Appliacation e informe o nome PontoECircunferencia e clique no botão OK;

 

No formulário form1.cs vamos incluir os seguintes controles:

Para não ocupar muito espaço e como o projeto será disponibilizado no final do artigo eu não vou relacionar os controles usados em cada tabPage.
 
As imagens usadas no projeto estão contidas na pasta \bin\Debug\Imagens.

Agora podemos definir o código do formulário.
 
Em cada tabPage temos um controle Button - Calcular - que realiza os cálculos e exibe o resultado vamos ver o código de cada evento Click de cada um desses botões de comando:
  1. tabPage1 - botão Calcular - btnCalcular1
private void btnCalcular1_Click(object sender, EventArgs e)
        {
            int vpx1 = 0;
            int vpy1 = 0;
            int vcx1 = 0;
            int vcy1 = 0;
            int vr1 = 0;
            double Dpc = 0.0;
            //coordenadas do ponto P	
            vpx1 = Convert.ToInt32(txtPx1.Text);
            vpy1 = Convert.ToInt32(txtPy1.Text);
            //coordenadas do centro da circunferencia
            vcx1 = Convert.ToInt32(txtCx.Text);
            vcy1 = Convert.ToInt32(txtCy.Text);
            vr1 = Convert.ToInt32(txtvr.Text);
            //formula para calcular a distância entre o ponto P e o Centro da circunferência
            Dpc = Math.Sqrt((Math.Pow((vpx1 - vcx1), 2) + Math.Pow((vpy1 - vcy1), 2)));
            lblValor.Text = " Dpc =  " + Dpc.ToString();
            if (Dpc > vr1)
            {
                //exibe a imagem no controle PictureBox e o resultado
                Image imagem = Image.FromFile(Application.StartupPath + "\\Imagens\\circ1.gif");
                picCalc1.Image = imagem;
                lblResultado.Text = " O ponto é externo à circunferência";
            }
            if (Dpc < vr1)
            {
                //exibe a imagem no controle PictureBox e o resultado
                picCalc1.ImageLocation = (Application.StartupPath + "\\Imagens\\circ2.gif");
                lblResultado.Text = " O ponto é interno à circunferência";
            }
            if (Dpc == vr1)
            {
                //exibe a imagem no controle PictureBox e o resultado
                picCalc1.ImageLocation = (Application.StartupPath + "\\Imagens\\circ.gif");
                lblResultado.Text = " O ponto esta na circunferência";
            }
        }
  1. tabPage2 - botão Calcular - btnCalcular2
  private void btnCalcular2_Click(object sender, EventArgs e)
        {
            //coordenadas do ponto
            int vPx2 =0;
            int vPy2 = 0;
            //valores das coordenadas do centro
            int vCv1 = 0;
            int vCv2 = 0;
            //valor do raio
            int vCr = 0;
            //valor do resultado
            double Calc = 0.0;
            //valor do ponto P
            vPx2 = Convert.ToInt32(txtPx2.Text);
            vPy2 = Convert.ToInt32(txtPy2.Text);
            //valor do centro
            vCv1 = Convert.ToInt32(txtv1.Text);
            vCv2 = Convert.ToInt32(txtv2.Text);
            //valor do raio
            vCr = Convert.ToInt32(txtCr.Text);
            //calculo da distância entre P e C
            Calc = Math.Sqrt((Math.Pow((vPx2 - vCv1), 2) + Math.Pow((vPy2 - vCv2), 2)));
            lblRaio.Text = " Raio = " + txtCr.Text;
            lblValor2.Text = " Dpc =  " + Calc.ToString();
            if (Calc  > vCr)
            {
                Image imagem = Image.FromFile(Application.StartupPath + "\\Imagens\\circ1.gif");
                picCalc2.Image = imagem;
                lblResultado2.Text = " O ponto é externo à circunferência";
            }
            if (Calc < vCr)
            {
                picCalc2.ImageLocation = (Application.StartupPath + "\\Imagens\\circ2.gif");
                lblResultado2.Text = " O ponto é interno à circunferência";
            }
            if (Calc == vCr)
            {
                picCalc2.ImageLocation = (Application.StartupPath + "\\Imagens\\circ.gif");
                lblResultado2.Text = " O ponto esta na circunferência";
            }
        }
  1. tabPage3 - botão Calcular - btnCalcular2
private void btnCalcular3_Click(object sender, EventArgs e)
        {
            //coordenadas do ponto
            int vPx3 = 0;
            int vPy3 = 0;
            //valores das coordenadas do centro
            int vCv1 = 0;
            int vCv2 = 0;
            //valor do raio
            int vCr = 0;
            //valor do resultado
            double Calc = 0.0;
            //
            double raio = 0.0;
            //valor do ponto P
            vPx3 = Convert.ToInt32(txtPx3.Text);
            vPy3 = Convert.ToInt32(txtPy3.Text);
            //valor do centro
            vCv1 = Convert.ToInt32(txtCv1.Text);
            vCv2 = Convert.ToInt32(txtCv2.Text);
            //valor do raio
            vCr = Convert.ToInt32(txtCvr.Text);
            raio = Math.Sqrt(vCr);
            //calculo da distância
            Calc = Math.Sqrt((Math.Pow((vPx3 - vCv1), 2) + Math.Pow((vPy3 - vCv2), 2)));
            //
            lblRaio1.Text = " Raio = " + raio.ToString();
            lblValor3.Text = " Dpc =  " + Calc.ToString();
            if (Calc > raio)
            {
                picCalc3.ImageLocation = (Application.StartupPath + "\\Imagens\\circ1.gif");
                lblResultado3.Text = " O ponto é externo à circunferência";
            }
            if (Calc < raio)
            {
                picCalc3.ImageLocation = (Application.StartupPath + "\\Imagens\\circ2.gif");
                lblResultado3.Text = " O ponto é interno à circunferência";
            }
            if (Calc == raio)
            {
                picCalc3.ImageLocation = (Application.StartupPath + "\\Imagens\\circ.gif");
                lblResultado3.Text = " O ponto esta na circunferência";
            }
        }
 

Os cálculos usam a fórmula : expressa da seguinte forma na linguagem C#:

 

Math.Sqrt((Math.Pow((vPx3 - vCv1), 2) + Math.Pow((vPy3 - vCv2), 2)));

 

Onde usamos o namespace Math e os métodos estáticos Sqrt e Pow:

Você pode melhorar o projeto em muitos aspectos como tratamento de erros, aceitar valores não inteiros, otimizar o código para remover código que esta duplicado, criar uma classe para realizar o cálculo, etc.

 

Fique a vontade, use o seu talento e aprenda C#.

Pegue o projeto completo aqui :  PontoECircunferencia.zip

Tito 3:3 Porque também nós éramos outrora insensatos, desobedientes, extraviados, servindo a várias paixões e deleites, vivendo em malícia e inveja odiosos e odiando-nos uns aos outros.

Tito 3:4 Mas quando apareceu a bondade de Deus, nosso Salvador e o seu amor para com os homens,

Tito 3:5 não em virtude de obras de justiça que nós houvéssemos feito, mas segundo a sua misericórdia, nos salvou mediante o lavar da regeneração e renovação pelo Espírito Santo,

Tito 3:6 que ele derramou abundantemente sobre nós por Jesus Cristo, nosso Salvador;

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 


Veja os Destaques e novidades do SUPER DVD VB (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C# com exclusivo material de suporte e vídeo aulas com curso básico sobre C#
 

 

Referências:


José Carlos Macoratti