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