Welcome to Fractal Forums

Fractal Math, Chaos Theory & Research => Mathematics => Topic started by: cKleinhuis on September 12, 2013, 01:45:59 PM




Title: help - round rectangle - for metaballs...
Post by: cKleinhuis on September 12, 2013, 01:45:59 PM
hello, i know you can help me, for a decent metaball visualisation (just in 2d ) i want to visualise the balls
as rounded rectangles, the standard distance function for the metaballs uses sqrt(distx^2+disty^2) to create
the shape of circles, but i would like to have rounded rectangles instead, anyone has a round rectangle distance function handy for me ?!
  :)


Title: Re: help - round rectangle - for metaballs...
Post by: lkmitch on September 12, 2013, 05:42:52 PM
Use (distx^n + disty^n)^(1/n) for larger values of n.  4 or 6 may work.


Title: Re: help - round rectangle - for metaballs...
Post by: cKleinhuis on September 12, 2013, 07:16:57 PM
Ah right its that simple, will check it out!!


Title: Re: help - round rectangle - for metaballs...
Post by: Roquen on September 13, 2013, 11:10:14 AM
Let me know if you need this explained.

Code:
#ifdef GL_ES
precision mediump float;
#endif

uniform float time;
uniform vec2  mouse;
uniform vec2  resolution;
uniform vec2  surfaceSize;
varying vec2  surfacePosition;

// exterior distance: p = test point, e = extent of rectange
float box(vec2 p, vec2 e)
{
  vec2 d;
 
  p = abs(p);      // fold into Q1
  p = p - e;       // translate corner of rect to origin
  p = max(p, 0.0); // fold into Q1

  // final result is distance to origin
  return length(p);
}

// exterior distance p = test point, e = extent of rectange, r = radius of circle
// which extends 'e'. (move center of circle around perimeter)
float rbox(vec2 p, vec2 e, float r)
{
  p = max(abs(p)-e, 0.0);  // same as above

  // returns '0' inside unextended rect, negative if inside extended, zero on
  // perimeter and positive outside.  Add another clamp if no negative
  // result desired.
  return length(p)-r;
}

void main(void)
{
  vec2 p = 2.0 * surfacePosition - vec2(0.5, 0.0);
  vec2 mousePosition = (mouse - (gl_FragCoord.xy/resolution)) * surfaceSize + surfacePosition;

  vec2 a = vec2(.2);
  vec3 c = rbox(p, a, .1) >= 0.0 ? vec3(1.0) : vec3(0.0);
 
  gl_FragColor.rgb = c;
  gl_FragColor.a   = 1.0;
}


Title: Re: help - round rectangle - for metaballs...
Post by: jehovajah on October 07, 2013, 09:07:23 AM
Cool, De Fermat's last theorem applied ! Make sure you use even numbers. If n is very large you may get a perfect square, so play around with the range.