FAQ
Cover
This is the archive Discourse for the Processing (ALPHA) software.
Please visit the new Processing forum for current information.

   Processing 1.0 _ALPHA_
   Programming Questions & Help
   Programs
(Moderators: fry, REAS)
   Averaging line buffers
« Previous topic | Next topic »

Pages: 1 
   Author  Topic: Averaging line buffers  (Read 1823 times)
Mark Hill

WWW Email
Averaging line buffers
« on: Apr 7th, 2005, 10:20am »

I've been looking at TomC's elegant use of the vector class and am trying to smooth out the contents of a line buffer to the overall average shape (which kind of works).
 
The method I'm using is quite crude and force closes an object - relying upon a feedback loop.
 
Can anyone see a way of dispensing with the need to rely on the enclosure method I'm currently using
 
The ideal situation would be averaging out to a (pre-stored) geometric figure - triangle, circle, rectangle, again any ideas on an effective way of doing this
 
I've dropped out some of Tom's code just to simplify this post. I'll modify in a sec with original link... Here it is:  
 
REPLY 12
http://processing.org/discourse/yabb/board_Syntax_action_displa_y_num_1091820063.html
 
The penultimate line of Tom's melt() method should be changed to read:
 
 
Code:

 else if (finished && points.size() <= 2) {

 
otherwise the line buffer never drops an element.
 
 
 
Here's my bastardized version I'm enquiring about:
 
 
Code:

 
Vector lines = new Vector();
 
// for recording the mouse
Line newLine;
 
void setup() {
  size(320,240);
 
  strokeWeight(2);
  ellipseMode(CENTER_DIAMETER);
  smooth();
}
 
void loop() {
  background(255);
 
  if (mousePressed) {
    if (newLine == null) {
      // start a new line
      newLine = new Line();
      lines.addElement(newLine);
    }
    // record the current mouse position
    newLine.points.addElement(new Point2f(mouseX,mouseY));
  }
  else if (newLine != null) {
    // set finished
    newLine.finished = true;
    // clear the line
    newLine = null;
  }
  
              
  for (int i = 0; i < lines.size(); i++) {
  
    Line line = (Line)lines.elementAt(i);
    line.draw();
 
    if(keyPressed) {
    line.melt();    
    }      
  }
}
 
 
class Point2f {
  float x,y;
  Point2f() {
    x = y = 0;
  }
  Point2f(int x, int y) {
    this.x = x;
    this.y = y;
  }
}
 
 
class Line {
  Vector points = new Vector();
  boolean finished = false;
  boolean fade = false;
  
  void draw() {
    if (points.size() >= 2) {
      for (int j = 0; j < points.size()-1; j++) {
 
        Point2f a = (Point2f)points.elementAt(j);
        Point2f b = (Point2f)points.elementAt(j+1);
        stroke(0);
        fill(0);
        line(a.x,a.y,b.x,b.y);
        noStroke();
        ellipse(a.x,a.y, 4,4);
      }
    }
  }
 
 
  void melt() {
  
      for (int j = 0; j < points.size()-1; j++) {
        Point2f a = (Point2f)points.elementAt(j);
        Point2f b = (Point2f)points.elementAt(j+1);
        
          a.x = (a.x + b.x) / 2;
          a.y = (a.y + b.y) / 2;
        
        }
          
        // force close the object    
        Point2f a = (Point2f)points.elementAt(0);
        Point2f b = (Point2f)points.elementAt(points.size()-1);
        
        b.x = (a.x);
        b.y = (a.y);
  }
}
 
« Last Edit: Apr 7th, 2005, 1:42pm by Mark Hill »  
Pages: 1 

« Previous topic | Next topic »