• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

FreiNando

Coordenadas

20 mensagens neste tópico

Olá pessoal!

Mesmo sendo novo no forum, vou colocar um pequeno desafio.

Mais cedo ou mais tarde um programador precisa criar graficos, tais como  linhas, curvas e circulos, por isso ao olhar para o manual de geometria da minha filha, veio este problema à cabeça:

    Dadas as coordenadas dos pontos de um segmento de recta, o comprimento do raio e coordenadas do centro de uma circunferencia, queria saber se o segmento de recta cruza com a circunferencia e caso cruze, quais as coordenadas desse ponto?

  O que pedia era um procedimento (no meu caso, fiz em VB), para achar o resultado a partir de coordenadas criadas aleatoriamente.

  para ilustrar tenho a seguinte imagem:

                      linhacirculo.png

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

EDIT

Li mal o post. :(:D

Existe a resolução matemática bastante fácil. :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A ideia é desenvolver um programa, não necessariamente resolve-lo matematicamente.

De qualquer forma, essa tua sugestão envolve a resolução de um sistema de equações do segundo grau, algo.. chato.

Existe uma solução bastante mais simples (numérica), agora não tenho tempo para escrever o código (ai as horas..), mas vou deixar aqui a dica para ver se entretanto alguém se lembra.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pelo vosso interesse.

No meu trabalho tenho de desenhar muitas vezes perfis de redes de água e saneamento básico, de forma a facilitar o meu trabalho fiz umas rotinas em VBA do AutoCad para as desenhar utilizo um ficheiro com os dados dos pontos pré-estabelecidos com cotas de terreno e cotas de profundidade da rede.

Como a linha de perfil não pode ser quebrada, tenho de desenhar um arco concordante e as linhas verticais têm de cortar no arco, daí a utilidade deste procedimento, que se torna dificil de resolver para linhas em qualquer outra orientação além da vertical.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Parece que ninguém se lembrou de responder.

A maneira mais simples de resolver este problema é fazer uma pesquisa binária no segmento.

Verificamos se ambos os pontos estão dentro do círculo ou ambos fora (uma comparação) e nesse caso é impossível.

Caso contrário, podemos simplesmente ir dividindo o segmento ao meio, e verificar qual das duas metades obedece ao critério acima, até atingirmos a precisão necessária.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Verificamos se ambos os pontos estão dentro do círculo ou ambos fora (uma comparação) e nesse caso é impossível.

Eles podem estar os dois fora e cortarem a circunferência.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se estiverem os dois fora, acha-se o ponto médio e repete-se o procedimento para cada metade.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como se pedia "quais as coordenadas desse ponto" nem me lembrei disso.

Ainda assim: pode-se traçar uma recta desde o centro da circunferência perpendicular ao segmento de recta, o ponto de intersecção entre o segmento e a recta, se ele intersectar a circunferência, está dentro ou sobre esta.

Pode-se fazer pesquisa binária nas duas metades.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para já, o problema está matematicamente mal definido porque com essas restrições pode haver não um, mas dois pontos de intersecção.

Definindo as coordenadas do centro do círculo como (Xc,Yc) e o seu raio 'R', e os pontos do segmento, o da esquerda (Xi,Yi) e o da direita (Xf, Yf):

Determinamos o declive da recta 'm' (m = (Yf - Yi) / (Xf - Xi)) e a ordenada na origem 'y0' (y0 = Yi - m*Xi). De seguida temos um sistema de equações (x^2 + y^2 = R^2  e y = mx + y0)  que se resume a uma equação de 2º grau:

ax^2 + bx + c = 0, com a=1+m^2, b=-2(Xc+Yc+m), c=Xc^2 + Yc^2 + y0^2 - R^2

Determinamos agora o sinal do binómio discriminante, b^2 - 4ac:

Se for menor que 0, não existe solução. Se for igual a 0 avaliamos a fórmula de Bhaskara x = -b / (2a). Caso seja maior que 0 avaliamos a fórmula de Bhaskara duas vezes x = (-b +- sqrt(b^2 - 4ac)) / (2a).

Após este passo que consiste apenas em meia dúzia de operações aritméticas, e numa raíz quadrada, verificamos para cada uma das soluções, se respeita Xi <= x <= Xf. Caso isso aconteça usamos y = mx +y0 para obter a ordenada do ponto, para cada solução que respeite a condição acima definida.

Et voilà. Um método que permite obter a(s) solução(ões) exacta(s) em:

Cálculo de m: 2 somas, 1 divisão

Cálculo de y0: 1 soma, 1 produto

Cálculo de a: 1 soma, 1 produto

Cálculo de b: 2 somas, 1 produto

Cálculo de c: 3 somas, 4 produtos

Cálculo do binómio e verificação: 1 soma, 3 produtos, 1 comparação

Pior caso para achar x(2 soluções): 2 somas, 1 produto, 2 divisões, 1 raíz

Verificar se são soluções(2 soluções): 4 comparações

Calcular os y(2 soluções) : 2 somas, 2 produtos

Total(pior caso, 2 soluções):  14 somas, 13 produtos, 3 divisões, 1 raíz, 5 comparações

Nice.

P.S.: Não funciona para o caso em que o segmento é vertical, mas esse é obviamente um caso trivial.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Para já, o problema está matematicamente mal definido porque com essas restrições pode haver não um, mas dois pontos de intersecção.

Não é o problema, é a solução para o problema que tem de verificar qual o ponto correcto.

Para calcular a orientação em 360º de um segmento de recta eu uso o seguinte procedimento(VB):

   Public Function AnguloRotacao(ByVal A As Point, ByVal B As Point) As Double
       If A.Y = B.Y Then
           Return 0.5 * PI + PI * -(A.X > B.X)
       ElseIf A.X = B.X Then
           Return PI * -(A.Y > B.Y)
       Else
           Return AnguloVertical(A, B) + 0.5 * PI * -((A.Y > B.Y) = (A.X < B.X)) _
           + PI * Abs(1.5 * -(A.X > B.X) + 0.5 * (A.Y > B.Y))
       End If
   End Function

   Public Function AnguloVertical(ByVal A As Point, ByVal B As Point) As Double
       If A.Y = B.Y Then
           Return (1 + 2 * (A.X < B.X)) * PI / 2
       Else
           Return Atan((B.X - A.X) / (B.Y - A.Y))
       End If
   End Function

Devolve valores em Radianos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Dadas as coordenadas dos pontos de um segmento de recta, o comprimento do raio e coordenadas do centro de uma circunferencia, queria saber se o segmento de recta cruza com a circunferencia e caso cruze, quais as coordenadas desse ponto?

Queria saber se o segmento de recta cruza com a circunferência: Resposta Sim/Não

Quais as coordenadas desse ponto: Resposta indefinida, pode haver intersecção em 2 pontos e o enunciado do problema não dá qualquer informação para determinar qual o "ponto correcto".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpem-me, faltou mencionar esse facto.

Deveria ser ponto ou pontos de intersecção.

    -Nenhum ponto quando não intersecta;

    -Um ponto quanto o segmento de recta é tangente ou quando um dos pontos do segmento está no interior da circunferencia;

    -Dois pontos quando ambos os pontos do segmento estão fora da circunferencia e cruzam-na sem ser tangente.

No entanto como o assunto principal é a programação eu gostaria de ver a vossa resposta em forma de um procedimento ou função em qualquer linguagem.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu dei a resolução matemática. A implementação, em C por exemplo:

int is_sol(double X, double Xi, double Xf,double m, double y0, double *Y) {
         if(X<Xi || X>Xf)
               return 0;
         *Y = m*X + y0;
          return 1;
}

int pontos(double Xi, doubleYi, double Xf, double Yf, double Xc, double Yc, double R, double *X, double *Y) {
      int nsol;
      double m,y0,a,b,c,bin,aux;
      if(Xf == Xi) { //Se for segmento vertical
          if(Xf >= Xc + R || Xi <= Xc - R)
             return 0;
          bin = sqrt(4 * Yc^Yc - 4*(Yc*Yc + Xf*Xf - 2*Xf*Xc + Xc*Xc - R*R)/2;
          if(Yi>Yf) {
               aux=Yf;  Yf=Yi; Yi=aux;
          }
          if(Yi <= (Yc - bin)) {
               nsol++;
               X[0]=Xi;
               Y[0]=Yc - bin;
           }
           if( Yf >= (Yc + bin)) {
               X[nsol] = Xi;
               Y[nsol] = Yc + bin;
           }
           return nsol;
      } 
      //caso geral        
     m=(Yf - Yi) / (Xf - Xi);
     y0 = Yi - m*Xi;
     a = 1 + m*m;
     b=-2*(Xc+Yc+m);
     c=Xc*Xc + Yc*Yc + y0*y0 - R*R;
     bin = b*b - 4*a*c;
     if(bin < 0)
         return 0;
     if(bin == 0) {
           X[0] = -b/(2*a);
           return is_sol(X[0],Xi,Xf,m,y0,Y);
     }
     nsol = 2;
     bin = sqrt(bin);
     X[0] = (-b - bin)/(2*a);
     X[1] = (-b + bin)/(2*a);
     if(! is_sol(X[0],Xi,Xf,m,y0,Y)) {
        nsol--;
        X[0] = X[1];
      }
     if(! is_sol(X[nsol-1],Xi,Xf,m,y0,Y+nsol-1))
        nsol--;
     return nsol;
}

       

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Eu dei a resolução matemática. A implementação, em C por exemplo:

Não foi testado, ou foi?

    Será C#?  É que o ^ é um operador binário XOR (Or Exclusivo)

    E a variavel yo está usada como y0.

   

   

   

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em C# esse operador também é o XOR. Se calhar foi só distracção ou só escreveu o código em estilo de pseudo-código.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em C# esse operador também é o XOR. Se calhar foi só distracção ou só escreveu o código em estilo de pseudo-código.

Lol sorry, é C com as expressões copiadas do que estava acima, sorry =/

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Penso que o desafio não seja muito complicado, mas é interessante.

Com as duas coordenadas podemos definir um vector director do segmento, com os dados da circunferência podemos definir a equação da circunferencia (isto tudo praticamente sem cálculos) e tal como penso que já foi dito resolver um calculo de um intersepçao de segundo grau, se resultar num ponto basta verificar se esse ponto pertence ao segmento que também é bastante simples.

Alias isto foi o que o pedrosorio fez mas exposto de uma forma menos pesada :). Como a soluçao dele é praticamente a mesma que a minha nao vale a pena apresentar codigo.

Nao penso que precisamos de pesquisas binárias ou algo mais complexo. Digo eu :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Alias isto foi o que o pedrosorio fez mas exposto de uma forma menos pesada . Como a soluçao dele é praticamente a mesma que a minha nao vale a pena apresentar codigo.

A solução do Pedrosorio não é funcional, e mesmo depois das pequenas alterações necessárias não deu resultado correcto, por isso gostaria de ver a sua solução, isto se não for pedir muito, e desde já agradeço o seu interesse.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A solução do Pedrosorio não é funcional, e mesmo depois das pequenas alterações necessárias não deu resultado correcto, por isso gostaria de ver a sua solução, isto se não for pedir muito, e desde já agradeço o seu interesse.

É refazer as contas :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como ninguém quis apresentar uma solução, eu vou colocar aqui um pequeno e funcional programa que demonstra muito bem a resposta, e também pode ser usado como base para outras implementações gráficas.

frmcoordenadas.png

1. Criar um novo projecto em VB.NET

2. Nomear o form1 para frmCoordenadas

3. Inserir uma pictureBox "pic", uma statusBar "stb" com um botão "stbInf" e os labels como a figura descreve.

4. Inserir um modulo e colocar o seguinte código:

'-------------------------------------------------
'Varias Funções usadas em geometria e topografia -
'--------------------------------------------------

Imports System.Math

Module modTopografia


    'Calculo do rumo de um ponto em relação a outro
    'Devolve um valor em Radianos na ordem [0, 2*pi[
    'em que 0=Eixo X positivo e pi/2=Eixo Y positivo
    Public Function Rumo(ByVal P1 As Point, ByVal P2 As Point) As Double
        Return Rumo(P1.X, P1.Y, P2.X, P2.Y)
    End Function

    Public Function Rumo(ByVal xA As Double, ByVal yA As Double, ByVal xB As Double, ByVal yB As Double) As Double
        Dim A As Double = Angulo(xA, yA, xB, yB)
        If yA = yB Then
            If xA = xB Then Return 0
            If xA < xB Then Return PI / 2 Else Return 1.5 * PI
        ElseIf xA = xB Then
            If yA < yB Then Return 0 Else Return PI
        ElseIf yA < yB Then
            If xA < xB Then Return A Else Return 2 * PI + A
        Else
            Return PI + A
        End If
    End Function

    Public Function SubtrRumos(ByVal Az1 As Double, ByVal Az2 As Double) As Double
        Return 2 * PI * -(Az1 < Az2) + Az1 - Az2
    End Function

    Public Function AdicaoRumos(ByVal Az1 As Double, ByVal Az2 As Double) As Double
        Return (Az1 + Az2) Mod (2 * PI)
    End Function


    'devolve o angulo de quadrante do rumo
    Public Function Angulo(ByVal Rumo As Double) As Double
        While Rumo < 0 : Rumo = Rumo + 2 * PI : End While
        While Rumo > (2 * PI) : Rumo = Rumo - 2 * PI : End While
        If Rumo >= (1.5 * PI) Then Return 2 * PI - Rumo
        If Rumo >= PI Then Return Rumo - PI
        If Rumo >= (PI / 2) Then Return PI - Rumo
        Return Rumo
    End Function


    'Calcula o angulo em relação ao Eixo X
    Public Function Angulo(ByVal P1 As Point, ByVal P2 As Point) As Double
        Return Angulo(P1.X, P1.Y, P2.X, P2.Y)
    End Function

    Public Function Angulo(ByVal xA As Double, ByVal yA As Double, ByVal xB As Double, ByVal yB As Double) As Double
        If yA = yB Then
            If xA = xB Then Return 0
            If xA < xB Then Return PI / 2 Else Return -PI / 2
        End If
        Return Atan((xB - xA) / (yB - yA))
    End Function


    'Calculo da distancia entre dois pontos
    Public Function Distancia(ByVal xA As Double, ByVal yA As Double, ByVal xB As Double, ByVal yB As Double) As Double
        Return Sqrt((xB - xA) ^ 2 + (yB - yA) ^ 2)
    End Function

    Public Function Distancia(ByVal P1 As Point, ByVal P2 As Point) As Double
        Return Sqrt((P1.X - P2.X) ^ 2 + (P2.Y - P1.Y) ^ 2)
    End Function


    'Transporte de coordenadas, dado um rumo e uma distancia a partir de um ponto
    Public Function GetPonto(ByVal P1 As Point, ByVal Dist As Double, ByVal Rumo As Double) As Point
        Return GetPonto(P1.X, P1.Y, Dist, Rumo)
    End Function

    Public Function GetPonto(ByVal X As Double, ByVal Y As Double, ByVal Dist As Double, ByVal Rumo As Double) As Point
        Dim P As Point, A As Double, dX As Double, dY As Double

        While Rumo < 0 : Rumo = Rumo + 2 * PI : End While
        While Rumo > (2 * PI) : Rumo = Rumo - 2 * PI : End While

        A = Abs(Angulo(Rumo))
        dX = Dist * Sin(A)
        dY = Dist * Cos(A)

        If Rumo >= (1.5 * PI) Then
            P.X = X - dX
            P.Y = Y + dY
        ElseIf Rumo >= PI Then
            P.X = X - dX
            P.Y = Y - dY
        ElseIf Rumo >= (PI / 2) Then
            P.X = X + dX
            P.Y = Y - dY
        Else
            P.X = X + dX
            P.Y = Y + dY
        End If

        Return P
    End Function


    'Funções de conversão entre Radianos,Graus e Grados
    Public Function Rad2Deg(ByVal Radiano As Double) As Double
        Return Radiano * 180 / PI
    End Function

    Public Function Rad2Grad(ByVal Radiano As Double) As Double
        Return Radiano * 200 / PI
    End Function

    Public Function Deg2Rad(ByVal Graus As Double) As Double
        Return Graus * PI / 180
    End Function

    Public Function Deg2Grad(ByVal Graus As Double) As Double
        Return Graus * 200 / 180
    End Function

    Public Function Grad2Rad(ByVal Grados As Double) As Double
        Return Grados * PI / 200
    End Function

    Public Function Grad2Deg(ByVal Grados As Double) As Double
        Return Grados * 180 / 200
    End Function

End Module

5. No código do frmcoodenadas colocar o código:

Imports System.Math


Public Class frmCoordenadas

    'Variaveis
    Dim P1 As System.Drawing.Point
    Dim P2 As System.Drawing.Point

    Dim Centro As System.Drawing.Point
    Dim Raio As Integer

    Dim isDraw As Boolean ' False=Primeiro Ponto; True=Segundo Ponto


    Private Sub frmCoordenadas_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        lblPonto1.Text = "n/a"
        lblPonto2.Text = "n/a"
        lblPonto1.Text = "n/a"
        lblPonto2.Text = "n/a"
        lblPontoM.Text = "n/a"
        lblPontoX1.Text = "n/a"
        lblPontoX2.Text = "n/a"
        CalcularCirculo()
    End Sub

    Private Sub frmCoordenadas_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
        pic.Width = Me.Width - pic.Left - 10
        pic.Height = Me.Height - 55
        CalcularCirculo()
    End Sub

    Private Sub CalcularCirculo()
        Centro.X = pic.Width / 2
        Centro.Y = pic.Height / 2
        If Centro.X < Centro.Y Then Raio = Centro.X / 2 Else Raio = Centro.Y / 2
        pic.Refresh()
    End Sub

    '**************************************
    'Tela do Desenho
    Private Sub pic_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pic.MouseClick

        'verificar se está a desenhar
        If isDraw Then
            P2 = e.Location
            lblPonto2.Text = P2.X & "," & P2.Y
            pic.Refresh()
        Else
            P1 = e.Location
            lblPonto1.Text = P1.X & "," & P1.Y
            lblPonto2.Text = "n/a"
        End If
        isDraw = Not isDraw
    End Sub

    Private Sub pic_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pic.MouseMove

        If isDraw Then
            P2 = e.Location
            lblPonto2.Text = P2.X & "," & P2.Y
            pic.Refresh()
        Else
            stbInf.Text = "Coordeandas: (" & Str(e.X) & "," & Str(e.Y) & ")"
        End If
    End Sub

    Private Sub pic_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles pic.Paint
        Dim Q As Point

        'desenhar o circulo
        Q.X = Centro.X - Raio
        Q.Y = Centro.Y - Raio
        e.Graphics.DrawEllipse(Pens.Blue, Q.X, Q.Y, 2 * Raio, 2 * Raio)
        lblCentro.Text = Centro.X & "," & Centro.Y
        lblRaio.Text = Round(Raio, 2)

        If isDraw Then DesenharLinhas(e.Graphics)
    End Sub

    Private Sub DesenharLinhas(ByRef g As Graphics)
        Dim rAB As Double, rAC As Double, rBC As Double, dA As Double
        Dim M As Point, X1 As Point, X2 As Point, nP As Integer = 0
        Dim cAB As Double, cBC As Double, cAC As Double
        Dim cCM As Double, cAM As Double, cBM As Double, cMX As Double
        Dim F As Drawing.Font = New Drawing.Font("Arial", 8)

        'calcular Comprimentos
        cAB = Distancia(P1, P2)
        cAC = Distancia(P1, Centro)
        cBC = Distancia(P2, Centro)

        'calcular rumos 
        rAB = Rumo(P1, P2)
        rBC = Rumo(P2, Centro)
        rAC = Rumo(P1, Centro)

        'Angulo de variação do rumo de [AB] e [AC]
        dA = Angulo(SubtrRumos(rAC, rAB))

        'distancia da perpendicular do Centro à recta AB
        cCM = Abs(Sin(dA) * cAC)

        'Calculo do ponto M ( cruzamento da perpendicular)
        If SubtrRumos(rBC, rAB) > PI Then
            M = GetPonto(Centro, cCM, rAB + 0.5 * PI)
        Else
            M = GetPonto(Centro, cCM, rAB + 1.5 * PI)
        End If
        lblPontoM.Text = M.X & "," & M.Y
        'Traçar a perpendicular
        g.DrawLine(Pens.Lime, Centro, M)

        'distancia [A-M]
        cAM = Distancia(P1, M)
        'distancia [b-M]
        cBM = Distancia(P2, M)

        'desenhar linhas guia desde a linha perpendicular
        'quando a perpendicular não cruzar[AB]
        If (cAM > cAB) Or (cBM > cAB) Then
            If cAC < cBC Then
                g.DrawLine(Pens.LightGray, P1, M)
            Else
                g.DrawLine(Pens.LightGray, P2, M)
            End If
        End If

        'Distancia entre o ponto medio(M) e os ponto de cruzamento
        cMX = Sqrt(Raio ^ 2 - cCM ^ 2)


        If cAC < Raio Then
            'ponto de partida dentro do circulo
            If cBC < Raio Then
                'Não cruza se o ponto final estiver dentro do circulo também
                g.DrawLine(Pens.Black, P1, P2)
            Else
                'cruza em um ponto de dentro para fora
                'Calcular o ponto de cruzamento
                X1 = GetPonto(P2, cBM - cMX, rAB + PI)
                g.DrawLine(Pens.Black, P1, X1)
                g.DrawLine(Pens.LightGray, X1, P2)
                nP = 1
            End If
        ElseIf cBC < Raio Then
            'cruza em um ponto de fora para dentro
            'Calcular o ponto de cruzamento
            X1 = GetPonto(P1, cAM - cMX, rAB)
            g.DrawLine(Pens.Black, P1, X1)
            g.DrawLine(Pens.LightGray, X1, P2)
            nP = 1
        Else
            'Dois pontos no Exterior
            If (cCM > Raio) Or (cAB < cAM) Or (cAB < cBM) Then
                'Não cruza
                g.DrawLine(Pens.Black, P1, P2)
            ElseIf cCM = Raio Then
                'Tangente
                g.DrawLine(Pens.Black, P1, M)
                g.DrawLine(Pens.LightGray, M, P2)
                nP = 1
            Else
                'Cruza em dois pontos
                'Calcular os dois pontos de cruzamento
                X1 = GetPonto(P1, cAM - cMX, rAB)
                X2 = GetPonto(P2, cBM - cMX, rAB + PI)
                g.DrawLine(Pens.Black, P1, X1)
                g.DrawLine(Pens.LightSkyBlue, X1, X2)
                g.DrawLine(Pens.LightGray, X2, P2)
                nP = 2
            End If
        End If

        'Dados e nome dos pontos
        g.DrawString("A", F, Brushes.Black, P1.X, P1.Y - 15)
        g.DrawString("B", F, Brushes.Black, P2.X, P2.Y - 15)
        g.DrawString("C", F, Brushes.Blue, Centro.X, Centro.Y - 15)
        If nP = 2 Then
            g.DrawString("X", F, Brushes.Red, X1.X, X1.Y - 15)
            g.DrawString("X'", F, Brushes.Red, X2.X, X2.Y - 15)
            lblPontoX1.Text = X1.X & "," & X1.Y
            lblPontoX2.Text = X2.X & "," & X2.Y
        ElseIf nP = 1 Then
            g.DrawString("X", F, Brushes.Red, X1.X, X1.Y - 15)
            lblPontoX1.Text = X1.X & "," & X1.Y
            lblPontoX2.Text = "n/a"
        Else
            lblPontoX1.Text = "n/a"
            lblPontoX2.Text = "n/a"
        End If


    End Sub


End Class

Podem encontrar o projecto aqui: http://www.box.net/shared/bvvhouc2d3

Espero comentários...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora