Ver Mensaje Individual
  #549 (permalink)  
Antiguo 31/12/2011, 02:11
Avatar de jorgelpadronb
jorgelpadronb
 
Fecha de Ingreso: agosto-2011
Ubicación: Cuba
Mensajes: 281
Antigüedad: 13 años, 3 meses
Puntos: 37
Respuesta: Competencias PHP

Cita:
Iniciado por iovan Ver Mensaje
Yo soy noob :D

La manera mas fácil es hacer segmentos dirigidos entre los 3 vértices respecto a 1 punto y obtener el área utilizando producto cruz, Si el area es igual a 0 se trata de una recta si es diferente se trata de un triangulo.

PHP:

Código PHP:
Ver original
  1. <?php
  2.  
  3. function magnitud($c){
  4.     return sqrt( ($c[0]*$c[0])+($c[1]*$c[1])+($c[2]*$c[2]) );
  5. }
  6.  
  7. function getVector($A,$B){
  8.     $cadena = ($B[0] - $A[0]).",".($B[1]-$A[1]).",".($B[2]-$A[2]);
  9.     return preg_split("/,/", $cadena);
  10. }
  11.  
  12. function esTriangulo($A,$B,$C){
  13.     //¿Es el mismo punto?
  14.     $equals = ($A==$B OR $A==$C OR $B==$C) ? true : false;
  15.     if($equals) return false;
  16.    
  17.     //Obtengo los puntos
  18.     $A = preg_split("/,/", $A);
  19.     $B = preg_split("/,/", $B);
  20.     $C = preg_split("/,/", $C);
  21.    
  22.     $vector1 = getVector($A, $B);
  23.     $vector2 = getVector($A, $C);
  24.    
  25.    
  26.     $i = $vector1[1]*$vector2[2] - $vector2[1]*$vector1[2];
  27.     $j = ($vector1[0]*$vector2[2] - $vector2[0]*$vector1[2])*-1;
  28.     $k = $vector1[0]*$vector2[1] - $vector2[0]*$vector1[1];
  29.    
  30.     $area_total = (magnitud(preg_split("/,/", $i.",".$j.",".$k))/2);
  31.    
  32.     if($area_total==0) return false; else return true;
  33. }
  34.  
  35. $A = "3,1,4";
  36. $B = "3,3,4";
  37. $C = "3,8,4";
  38.  
  39. if(esTriangulo($A, $B, $C)) echo "Si es un triangulo";
  40.     else echo "No es un triangulo";
  41. ?>

Feliz año nuevo un saludo y fuerte abrazo atodos mis amigos de ForosDelWeb. Nos vemos el 3 de Enero. Be Happy everybuddy!
Saludos iovan y feliz año nuevo para tí también. Que bueno que te animaste a hacer el reto de los triángulos. Yo lo resolví de esta forma:

Se parte del principio de proporcionalidad que existe entre los puntos de una misma recta.
O sea que si tres puntos (x1,y1) , (x2,y2) y (x3,y3) están alineados, pertenecen a una misma recta,
por lo que hay una relación proporcional entre las diferencias entre las x o las y del dichos punto y
las distancias lineal entre ellos (esto se ilustraría mejor en una gráfica).
Por este principio, si los puntos están alineados se cumple que:

(x2-x1)/distancia(p2:p1)=(x3-x1)/distancia(p3:p1)

donde la distancia($p2:p1) se expresa:

sqrt(pow($x2-$x1,2)+pow($y2-y1,2))

y la distancia($p3:p1) se expresa:

sqrt(pow($x3-$x1,2)+pow($y3-y1,2))

Luego, si se cumple esto es porque los tres puntos están alineados, por lo cual es imposible construir
el triángulo.

La implementación de la función evaluadora:

Código PHP:
Ver original
  1. function Triangulo($x1,$y1,$x2,$y2,$x3,$y3){
  2.   $result=false;  
  3.   if(!($x1==$x2 && $y1==$y2) || ($x2==$x3 && $y2==$y3) || ($x3==$x1 && $y3==$y1)){
  4.       $result=!(($x1-$x2)/sqrt(pow($x1-$x2,2)+pow($y1-$y2,2))==($x1-$x3)/sqrt(pow($x1-$x3,2)+pow($y1-$y3,2)));
  5.   }
  6.   return $result;
  7. }

Y listo, devuelve true si el triángulo es posible, si no, devuelve false.

Feliz año nuevo para todos.
__________________
Los hombres pequeños, nunca se sienten pequeños; los hombres grandes, nunca se sienten grandes.

No sé quien fué el que dijo eso, pero está bueno.