Sitio Web de Héctor E. Medellín Anaya

Algoritmos para dibujar cónicas

Círculo

 

Algoritmo basado en la ecuación del círculo

 

void PlotPoint(Graphics g, int xc, int yc, int x, int y)

{

  g.drawLine(,xc + x,yc + y);

  g.drawLine(,xc - x,yc + y);

  g.drawLine(,xc + x,yc - y);

  g.drawLine(,xc - x,yc - y);

  g.drawLine(,xc + x,yc + x);

  g.drawLine(,xc - y,yc + x);

  g.drawLine(,xc + y,yc - x);

  g.drawLine(,xc - y,yc - x);

}

 

void CircleSimple(Graphics g, int xc, int yc, int r){

  int x,y;
  double yr;
  x = 0;
  y = r;
  yr = r;
  PlotPoint(x,y);
/* se cicla hasta trazar todo un octante */
  while (x < yr){
    x = x + 1;
    yr = Math.sqrt(r*r-x*x);
    y = (int)Math.round(yr);
    PlotPoint(x,y);
  }

}

 

El siguiente applet permite ver el proceso paso a paso. Seleccione dos puntos sobre la cuadrícula y presione el botón "Siguiente" para ejecutar cada paso. Para borrar presione el botón "Borrar". 

 

 

 

Algoritmo de punto medio

 

void CircleMidPoint(Graphics g, int xc, int yc, int r){

  int x, y, p;

  x = 0;

  y = r;

  p = 1 - r;

  PlotPoint(g,xc,yc,x,y);

/* se cicla hasta trazar todo un octante */

  while (x < y){

    x = x + 1;

    if (p < 0)

      p = p + 2*x + 1;

    else {

      y = y - 1;

      p = p + 2*(x - y) + 1;

    }

    PlotPoint(g,xc,yc,x,y);

  }

}

 

El siguiente applet permite ver el proceso paso a paso. Seleccione dos puntos sobre la cuadrícula y presione el botón "Siguiente" para ejecutar cada paso. Para borrar presione el botón "Borrar". 

 

Elipse

 

Algoritmo de punto medio para elipse

 

public void Elipse(Graphics g, int xc, int yc, int rx, int ry){
  int x, y, p, px, py;
  int rx2, ry2, tworx2, twory2;
  ry2 = ry*ry;
  rx2 = rx*rx;
  twory2 = 2 * ry2;
  tworx2 = 2 * rx2;
/* región 1 */
  x = 0;
  y = ry;
  PlotPoint(x,y);
  p = (int)Math.round(ry2 - rx2*ry + 0.25*rx2);
  px = 0;
  py = tworx2*y;
  while (px < py) { /* se cicla hasta trazar la región 1 */
    x = x + 1;
    px = px + twory2;
    if (p < 0)
      p = p + ry2 + px;
    else {
      y = y - 1;
      py = py - tworx2;
      p = p + ry2 + px - py;
    }
    PlotPoint(x,y);
  }
/* región 2 */
  p = (int)Math.round(ry2*(x+0.5)*(x+0.5) + rx2*(y-1)*(y-1) - rx2*ry2);
  px = 0;
  py = tworx2*y;
  while (y > 0) { /* se cicla hasta trazar la región 2 */
    y = y - 1;
    py = py - tworx2;
    if (p > 0)
      p = p + rx2 - py;
    else {
      x = x + 1;
      px = px + twory2;
      p = p + rx2 + py + px;
    }
    PlotPoint(x,y);
  }
}

 

El siguiente applet permite seguir paso a paso el agoritmo de punto medio para elipses. Haga clic sobre el área cuadriculada para establecer el centro de la elipse. A continuación vuelva a hacer clic para definir los radios en x y y. El radio en x es la distancia en x entre el primer clic y el segundo y el radio en y es la distancia en y entre el primer clic y el segundo.

 

 

 

Parábola

 

Algoritmo de punto medio para parábolas

 

public void parabola(Graphics g,int xc, int yc, int p, int bound){

  int x,y,d;

  int p2, p4;

  p2 = 2*p;

  p4 = 2*p2;

  x = 0;

  y = 0;

  d = 1 - p;

//region 1

  while(y < p && x<=bound){

    g.drawLine(xc+x,yc+y,xc+x,yc+y);

    g.drawLine(xc+x,yc-y,xc+x,yc-y);

    if(d >= 0){

      x++;

      d = d - p2;

    }

    y++;

    d = d + 2*y +1;

  }

  if(d == 1) d = 1 - p4;

  else d = 1 - p2;

//region 2

  while(x<=bound){

    g.drawLine(xc+x,yc+y,xc+x,yc+y);

    g.drawLine(xc+x,yc-y,xc+x,yc-y);

    if(d <= 0){

      y++;

      d = d + 4*y;

    }

    x++;

    d = d - p4;

  }

}

 

El siguiente applet permite ver el algoritmo en acción. Haga clic una vez para establecer el vértice de la parábola. Haga clic una segunda vez para establecer el foco, este estará definido en la línea horizontal en donde se ha definido el vértice.

 

 

Hipérbola

 

Algoritmo de punto medio para hipérbola

 

public void hiperbola(Graphics g,int xc, int yc, long a,long b, int bound){
  long a_sqr,b_sqr,a22,b22,a42,b42,x_slope,y_slope;
  long d,mida,midb;
  long x,y;
  x = a;
  y = 0;
  a_sqr = a*a;
  b_sqr = b*b;
  a22 = 2*a_sqr;
  b22 = 2*b_sqr;
  a42 = 2*a22;
  b42 = 2*b22;
  x_slope = b42*(x+1);//x_slope = 4*b^2*(x+1)
  y_slope = a42; //y_slope = 4*a^2*(y-1)
  mida = a_sqr/2;
  midb = b_sqr/2;
  d = a22-b_sqr*(1+2*a)+midb;
  //region 1
  while(d<x_slope && y<=bound){
  //dibujar
    points(g,xc,yc,(int)x,(int)y);
    if(d>=0){
      d = d-x_slope;
      x++;
      x_slope = x_slope+b42;
    }
    d = d+a22+y_slope;
    y++;
    y_slope = y_slope+a42;
  }
  d = d-(x_slope+y_slope)/2+(a_sqr+b_sqr)-mida-midb;
  //region 2
  if(a>b)
    while(y<=bound){
      //dibujar
      points(g,xc,yc,(int)x,(int)y);
      if(d<=0){
        d = d+y_slope;
        y++;
        y_slope = y_slope+a42;
      }
      d = d-b22-x_slope;
      x++;
      x_slope = x_slope+b42;
    }
}

 

El siguiente applet permite seguir paso a paso el agoritmo de punto medio para hipérbola. Haga clic sobre el área cuadriculada para establecer el centro de la hipérbola. A continuación vuelva a hacer clic para definir los valores de a y b. El valor de a es la distancia en x entre el primer clic y el segundo y el valor de b es la distancia en y entre el primer clic y el segundo.