domingo, 24 de novembro de 2013

Teorema de Pitágoras sem fórmulas, você acredita em tudo que lhe dizem? Tire a prova! =) Parte 1

Esse é a primeira publicação que faço referente a educação. Apresento um código em java que realiza o cálculo da distância entre dois pontos, no caso, os pontos que formariam a hipotenusa de um triângulo retângulo isósceles de lados 1,1,hipotenusa(hip). Se fizéssemos esse procedimento com uma régua escolar teríamos um valor muito impreciso de 1,4 cm e nossos olhos perceberiam um pouco mais, para melhorarmos nossa precisão, podemos fazer um triângulo proporcionalmente maior. Se fizemos 10x, isto é, lados 10,10,10*hip teríamos a resposta de 10* maior, no entanto, nossa régua agora dá o valor de 14,1cm e mais uma vez nossos olhos nos deixam em dúvida. Se fizessemos 100x maior podemos supor que o valor seria 141,4cm. Tente fazer isso você mesmo. Existe uma afirmação que diz que se fizéssemos o cálculo perfeitamente preciso teríamos o valor da hipotenusa equivalente ao valor da raiz quadrada de 2(1,4142135623730950...), perceba que a ideia inicial que tive de medir com a régua estava nos dando valores cada vez mais precisos. Tive a ideia de fazer um programa em java que utilizasse de métodos para desenhar retas e pontos. Fiz o triângulo de lados 1,1,hipotenusa e o cálculo tem ótima precisa de 1.4142135623730951 com erro apenas no último dígito (1) que se compararmos com o cálculo feito por outros métodos mais precisos continuaria com ...0488016887242097... assim sendo o programa também tem suas limitações porém vamos assumir que para essa aproximação temos o valor de dois já que esse mesmo valor ao quadrado é aproximadamente 2,0000000000000001. Mas recentemente descobri que se montássemos um triângulo de lados 1, raiz quadrada de 2, hipotenusa, teríamos o valor impressionante da raiz quadrada de 3 como mostra a figura do link (http://www.geom.uiuc.edu/~demo5337/Group3/spiral.gif). Na figura, um dos lados de todos os outros triângulos não tem valor escrito, mas ele é igual a 1, ou seja, lados 1, 1, a para o primeiro tri. Para o segundo lados 1, a, b (note que a = raiz de 2 e b = raiz de 3) e por ai vai sucessivamente. O código abaixo irá mostrar meu algoritmo. Se desejar rodar o código basta copiá-lo para uma IDE de java (Netbeans ou Eclipse por ex.). Mas algumas saídas já adianto: Programei para nunca parar, pelo menos até aonde o programa não estourar memória. A primeira parte encerro por aqui, parte 2 incluirá a parte gráfica.
raiz de 1 1.0
raiz de 2 1.4142135623730951
raiz de 3 1.7320508075688774
raiz de 4 2.0
raiz de 5 2.23606797749979
raiz de 6 2.4494897427831783
raiz de 7 2.6457513110645907
raiz de 8 2.8284271247461903
raiz de 9 3.0000000000000004
raiz de 10 3.16227766016838
<?java


import java.awt.*;
import java.applet.*;
import java.awt.geom.*;

public class Line2D1 extends Applet {

    private Line2D Shape1;
    private Line2D Shape2;
    private Line2D Shape3;
    private Line2D iShape;
    //double diagonal;
    private Point2D Point1;
    private Point2D iPoint;
    double raizquadrada;
    boolean continua = true;

    public static void main(String[] args) {
        Line2D1 mede = new Line2D1();
        mede.raiziterativa();
        
    }

    public void raiziterativa() {

        boolean continua = true;

        while (continua == true) {
            iPoint = new Point2D.Double(0, raizquadrada);
            raizquadrada = iPoint.distance(Shape1.getP2());
            iShape = new Line2D.Double(Shape1.getP1(), iPoint);
            long i;
            i = Math.round(Math.pow(raizquadrada, 2)) ;

            System.out.println("raiz de " + i + " " + raizquadrada);
        }

    }

    public Line2D1() {
        Shape1 = new Line2D.Double(0, 0, 1, 0); // linha vertical vetor da esqPdir
        //Shape2 = new Line2D.Double();
        //Shape2.setLine(0.F, 0.F, 0.F, 1.F); // linha horizontal vetor de cimaPbaixo cpb
        //Shape3 = new Line2D.Double(120, 0, 20, 100); // diagonal cpb dpe.
        Point1 = new Point2D.Double(0, 1);
        Shape2 = new Line2D.Double(Shape1.getP1(), Point1);
        Shape3 = new Line2D.Double(Shape1.getP2(), Point1);

    }

    @Override
    public void paint(Graphics g) {
        Graphics2D g2D;
        boolean Hit;

        g2D = (Graphics2D) g;

        Hit = Shape1.intersectsLine(Shape2);
        g2D.drawString("intersects = " + Hit, 20, 145);

        g2D.draw(Shape1);
        g2D.draw(Shape2);
        g2D.draw(Shape3);

    }

}


Nenhum comentário:

Postar um comentário