2014-03-31 89 views
1

我想解决这个问题:在屏幕上绘制随机线,然后在所有线的交点处创建点。我的解决方案:我没有创建实际的线条,而是使用小点来构建线条。每个“行”是一个称为Pointe的类的实例。我将每一行实例的所有坐标存储在它自己的数组中。为了检测交集,我写了函数collide()来比较每一行的存储坐标。如果距离为< 10,我将线条的厚度更改为10像素以创建“气球”效果。检测线的交叉点

int p = 0; 
class Pointe { 
    int x; 
    int y; 
    int speedX; 
    int speedY; 
    float size = 2; 
    color c = color(random(255),random(255),random(255)); 
    int position_stored[] = {}; 
    Pointe(int xPosition, int yPosition, int speed_X, int speed_Y) { 
    x = xPosition; 
    y= yPosition; 
    speedX = int(random(speed_X)); 
    speedY = int(random(speed_Y)); 
    } 

    int b = int(mouseX); 
    int n = int(mouseY); 

    void move() { 
    x = x + speedX; 
    y = y + speedY; 
    if (x>60) {x = x; y = y;} 
    if (y>60) {y = y; x = x;} 
    store_position(); 
    } 

    void display() { 
    noStroke(); 
    fill(c); 
    ellipse(x,y,size,size); 
    } 
    int getX() {return x;} 
    int getY() {return y;} 
    void store_position() { 
    int position_stored2[] = append(position_stored,getX()); 
    int position_stored3[] = append(position_stored2,getY()); 
    position_stored = position_stored3; 
    } 

    void collide(int[] a) { 
    for (int i = 1; i < a.length ; i=i+2) { 
     int distance = int(dist(x,y,a[i-1],a[i])); 
     if (distance < 20) {size = 10;} 
     else {size = 2;} 
    } 
    } 
} 
int number = 109; 
void setup(){ 
    size(600,600); 
    background(255); 
    for (int i = 0; i <number; i++) { 
    points[i] = new Pointe(int(random(600)),int(random(600)),int(random(-6,6)),int(random(-6,6))); 
    } 
} 

Pointe[] points = new Pointe[number]; 

void draw(){ 
    for (int i = 0; i <number; i++) { 
    for (int z = 0; z <number; z++) { 
     if (i == z) {} 
     points[i].collide(points[z].position_stored); 
    } 
    points[i].display(); 
    points[i].move(); 
    } 
} 
+2

你的问题是什么? –

+1

*“我的解决方案:不是创建真实的线条,而是使用小点来构建线条” - 这听起来并不像解决方案,而是像新问题的源头。任何特定的原因*为什么*你这样做? – Marco13

+0

说明不应该作为答案添加,而是通过添加注释或编辑原始问题。 (并在http://stackoverflow.com/questions/22771887再次问同样的问题也不会在这里帮助)。显然,这个问题或你的意图不够清楚。 – Marco13

回答

0

我目前没有在这里使用处理脚本的可能性。处理与Java非常相似,只需稍作更改,这样的脚本就可以作为Java Applet运行。

但是,您的方法在很多方面都有问题。

draw方法的第一次调用实际上应该是

void draw() 
{ 
    background(0xFFFFFF); 
    ... 
} 

,以清除背景。如果你没有这样做,那么你所看到的任何东西都与你实际拥有的“状态”无关。

目前,您正在将position_stored阵列中的点的坐标(移动后)存储起来。但是这个数组的内容并不是用于绘画,而是仅用于距离计算!

最重要的是:这个动画应该运行多长时间?它运行的时间越长,你需要的内存就越多。你总是存储新的点坐标...

因此,最后,每个人都可以 - 在最好的情况下 - 只有你想达到什么。我它是这样的,但考虑到我对处理有限的知识,并随时打算至少轻微相似,你最初发布什么,这仍然是不良实现,也许应该有不同的解决。

import processing.core.PApplet; 

public class ScribblingTest extends PApplet 
{ 
    class Pointe 
    { 
     int x; 
     int y; 
     int speedX; 
     int speedY; 
     float size = 2; 
     int c = color(random(255), random(255), random(255)); 

     Pointe(int xPosition, int yPosition, int speed_X, int speed_Y) 
     { 
      x = xPosition; 
      y = yPosition; 
      speedX = (int)(random(speed_X)); 
      speedY = (int)(random(speed_Y)); 
     } 

     Pointe(Pointe other) 
     { 
      x = other.x; 
      y = other.y; 
      speedX = other.speedX; 
      speedY = other.speedY; 
      c = other.c; 
     } 


     void move() 
     { 
      x = x + speedX; 
      y = y + speedY; 
      if (x > 600) 
      { 
       x = 0; 
      } 
      if (y > 600) 
      { 
       y = 0; 
      } 
      if (x < 0) 
      { 
       x = 600; 
      } 
      if (y < 0) 
      { 
       y = 600; 
      } 
     } 

     void display() 
     { 
      noStroke(); 
      fill(c); 
      ellipse(x, y, size, size); 
     } 

     int getX() 
     { 
      return x; 
     } 

     int getY() 
     { 
      return y; 
     } 

     boolean collide(int[] a) 
     { 
      for (int i = 1; i < a.length; i = i + 2) 
      { 
       int distance = (int)(dist(x, y, a[i - 1], a[i])); 
       if (distance < 20) 
       { 
        return true; 
       } 
      } 
      return false; 
     } 
    } 

    int number = 20; 
    int maxSteps = 300; 
    int currentStep = 0; 
    Pointe[][] points = new Pointe[number][maxSteps]; 

    public void setup() 
    { 
     size(600, 600); 
     background(255); 
     for (int i = 0; i < number; i++) 
     { 
      points[i] = new Pointe[maxSteps]; 
      points[i][0] = new Pointe(
       (int)(random(600)), 
       (int)(random(600)), 
       (int)(random(-6, 6)), 
       (int)(random(-6, 6))); 
     } 
    } 


    public void draw() 
    { 
     background(0xFFFFFF); 

     int currentIndex = currentStep % maxSteps; 
     int nextIndex = (currentStep + 1) % maxSteps; 
     for (int i = 0; i < number; i++) 
     { 
      Pointe currentP = points[i][currentIndex]; 
      Pointe nextP = new Pointe(currentP); 
      nextP.move(); 

      boolean collides = false; 
      for (int j=0; j<number; j++) 
      { 
       if (i != j) 
       { 
        for (int k=0; k<maxSteps; k++) 
        { 
         Pointe otherP = points[j][k]; 
         if (otherP != null) 
         { 
          float d = dist(nextP.x, nextP.y, otherP.x, otherP.y); 
          if (d < 20) 
          { 
           collides = true; 
           break; 
          } 
         } 
        } 
        if (collides) 
        { 
         break; 
        } 
       } 
      } 
      if (collides) 
      { 
       nextP.size = 10; 
      } 
      else 
      { 
       nextP.size = 2; 
      } 

      points[i][nextIndex] = nextP; 
     } 

     for (int i = 0; i < number; i++) 
     { 
      for (int j=0; j<maxSteps; j++) 
      { 
       Pointe p = points[i][j]; 
       if (p != null) 
       { 
        p.display(); 
       } 
      } 
     } 
     currentStep++; 


    } 

} 
+0

非常感谢您花时间为我解决这个问题。 我其实现在没有java,所以我无法测试你的程序。但我不想清除背景,因为我希望在屏幕上画点,就像在白板上涂写而不擦除它一样。我会测试这个Java小程序,并让你知道。 – user3480364

+0

应该只需要很少的修改将它转换回处理脚本(例如'(int)'必须转换为'int',实际上只是小事)。我看到你的意图是*不*清除背景,但是例如,当你调整窗口大小时,你以前画的任何东西都会丢失...... – Marco13