domingo, 24 de abril de 2016

Calcular Angulos En Processing

Calculo de un ángulo en Processing

Para entender mejor el proceso de conversion realizado en Processig se deja el siguiente vídeo explicativo de que es un radian y su equivalencia en grados
 
Processing como lenguaje de programación cuenta con funciones predeterminadas que son útiles para la realización de operaciones matemáticas.
Las funciones principales que emplearan son las siguientes:
  • atan( valor) Realiza la función inversa de la tangente y retorna el arco de la tangente de un valor. 
  • atan2(y , x)  Realiza la función inversa de la tangente y retorna el arco de la tangente de dos valores x , y
Los parámetros o valores que se introducen en las funciones son de tipo float (real) y el valor que retornan es también float en el rango de -PI/2 a PI/2 radianes, su equivalencia en grados correspondería al rango de -180 a 180 por lo que es necesario un calculo adicional para tener un rango de 0 a 2PI radianes o de 0 a 360 grados.

Simulación y código de ejemplo



Dado que en Processing el origen del sistema coordenado esta en la esquina superior izquierda este se traslado al centro del lienzo, además se tiene en cuenta que en Processing el eje coordenado Y es positivo hacia abajo y también por esto en la operación se multiplica por -1. Las operaciones de conversión realizadas para determinar los valores x,y del puntero de ratón con respecto a un sistema cooredando en el centro de la pantalla de dibujo son las siguientes:

  X=mouseX-MitadLienzoX;
  Y=(mouseY-MitadLienzoY)*(-1);
En el código se hace la conversión del rango del rango -PI a PI radianes a 0 a 2PI por medio de la siguiente operación.

  AnguloRadianes=atan2(Y, X);
  if(AnguloRadianes<0){
   AnguloRadianes=TWO_PI-AnguloRadianes;
  }
  AnguloGrados=degrees(AnguloRadianes);

En la operación realizada se verifica si el valor es negativo es decir si esta entre -PI y 0 radianes, si la condición se cumple se hace la operación de conversión restando a 2PI el ángulo en radianes negativo calculado previamente. Finalmente el valor se convierte a grados con la función degrees()

Código de ejemplo

float AnguloRadianes, AnguloGrados, X, Y;
int MitadLienzoX,MitadLienzoY;
PFont Letra;
void setup() {
  size(640, 480);
  MitadLienzoX=width/2;
  MitadLienzoY=height/2;
  Letra = loadFont("Carlito-48.vlw");
}
void draw() {
  background(250);
  line(0, MitadLienzoY, width, MitadLienzoY);
  line(MitadLienzoX, 0, MitadLienzoX, height);
  line(MitadLienzoX, MitadLienzoY, mouseX, mouseY);
  X=mouseX-MitadLienzoX;
  Y=(mouseY-MitadLienzoY)*(-1);
  AnguloRadianes=atan2(Y, X);
  if(AnguloRadianes<0){
   AnguloRadianes=TWO_PI-AnguloRadianes;
  }
  AnguloGrados=degrees(AnguloRadianes);
  fill(#4D440C);
  text(X+" X ", mouseX+10, mouseY);
  text(Y+" Y ",mouseX+10,mouseY+10);
  text(AnguloRadianes+" Radianes ",mouseX+10,mouseY+20);
  text(AnguloGrados+" Grados ",mouseX+10,mouseY+30);
}