I’ve been playing around a bit with Processing.org – a kinda-graphical programming language. As the topwritingservice.com writers at http://topwritingservice.com/ web and I wanted to capture and analyze one of the effects I wanted to play with was radial transparency - a color blob that fades to the edges. After playing around with drawing a few ellipses, I settled on a pixel-based routine. After playing around for a while withdrawing multiple ellipses, I settled on a pixel-based subroutine.

We create a new PGraphics object to hold the blob, then for each pixel calculate the distance from the center as a proportion of the radius using the handy Math.hypot() method. Then, to get nice smooth fade-outs near the edges, we invert it to get the distance from the edge and then use the square of that value to determine the transparency. This gives a smoother effect – if we don’t use the square then the edges don’t transition smoothly (probably something to do with the sensitivity of human vision / LCD monitors to colour being non-linear). Anyway, here’s the code:

UPDATE – turns out that using Math.hypot() is very slow – switching to Math.sqrt() speeds up the code x10. The new code is below.

void radialGradient(float x, float y, int c, int size) {
  PGraphics pg = createGraphics(size, size, JAVA2D);
  pg.beginDraw();
  pg.background(30, 0);
  int halfsize = size / 2;

    for (int i = 0; i <= size; i += 1) {
    for (int j = 0; j <= size; j += 1) {
      // calculate distance to center
      //float distance = (float) Math.hypot(i - size / 2, j - size / 2) / (size / 2);
      //float distance = (float) sqrt(sq(i-size/2) + sq(j-size/2)) / (size/2);
      float xDist = i - halfsize;
                float yDist =  j - halfsize;
                float distance = (float) Math.sqrt(xDist*xDist + yDist*yDist) / halfsize;
      float scale = 1 - distance;
      if (scale < 0 ) {
        scale = 0;
      }
      float transparency = 255 * (scale * scale);
      int thisColour = color(c, int(transparency));
      pg.set(i, j, thisColour);
    }
  }

  pg.endDraw();
  imageMode(CENTER);
  image(pg, x, y);
}

Subscribe to articles from the programming category via RSS or ATOM

Comments


comments powered by Disqus