2014-03-31 86 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