2016-05-29 4 views
0

Я пытался что-то сделать с этим проектом у меня есть, но не всегда до сих пор :) так решили спросить здесь :)Обработка частицы

Я хочу, чтобы частицы идти вокруг эллипса от Rock класса, не через него, но вокруг него, как скала внутри реки, вокруг которой течет вода. Какие-либо предложения ?

int NUM_PARTICLES = 1000; 
ParticleSystem p; 
Rock r; 
void setup() 
{ 
    smooth(); 
    fullScreen(P2D); 
    //size(700,700,P2D); 
    //background(0); 
    p = new ParticleSystem(); 
    r = new Rock(); 
} 

void draw() 
{ 
    background(0); 
    p.update(); 
    p.render(); 
    r.rock(); 

} 

float speed = 1; 
class Particle 
{ 
    PVector position, velocity; 

    Particle() 
    { 
    position = new PVector(random(width),random(height)); 
    velocity = new PVector(); 
    } 

    void update() 
    { 
    velocity.x = speed*(noise(position.y)); 
    velocity.y = speed*(noise(position.x)); 
    position.add(velocity); 

    if(position.x<0)position.x+=width; 
    if(position.x>width)position.x-=width; 
    if(position.y<0)position.y+=height; 
    if(position.y>height)position.y-=height; 
    } 

    void render() 
    { 
    stroke(0, 0, 255, 80); 
    line(position.x,position.y,position.x-velocity.x,position.y-velocity.y); 
    } 
} 

class ParticleSystem 
{ 
    Particle[] particles; 

    ParticleSystem() 
    { 
    particles = new Particle[NUM_PARTICLES]; 
    for(int i = 0; i < NUM_PARTICLES; i++) 
    { 
     particles[i]= new Particle(); 
    } 
    } 

    void update() 
    { 
    for(int i = 0; i < NUM_PARTICLES; i++) 
    { 
     particles[i].update(); 
    } 
    } 

    void render() 
    { 
    for(int i = 0; i < NUM_PARTICLES; i++) 
    { 
     particles[i].render(); 
    } 
    } 
} 
class Rock{ 

    void rock() 
    { 
    noFill(); 
    stroke(255); 
    strokeWeight(4); 
    ellipse(mouseX,mouseY,50,50); 

} 



} 

EDIT: 1

Я сделал некоторые работы моего на нем вчера, и я близко к тому, что я хочу, все еще есть некоторые визуальные issues.I хотят, чтобы избавиться от краев потока и когда я перемещаю мышь, я все еще вижу линии эллипса от силы. Вот результат.

int NUM_PARTICLES = 9000; 
ParticleSystem p; 
Rock r; 
void setup() 
{ 
    smooth(); 
    size(700,700,P2D); 
    p = new ParticleSystem(); 
    r = new Rock(); 
} 

void draw() 
{ 
    background(0); 
    p.update(); 
    p.render(); 
    r.rock(); 

} 

float speed = 2; 
float rad = 100; 
class Particle 
{ 
    PVector position, velocity; 
    float initialPosY; 

    Particle() 
    { 
    position = new PVector(random(width), random(height)); 
    initialPosY = position.y; 
    velocity = new PVector(); 
    } 

    void update() 
    { 

    velocity.x = speed; 
    velocity.y = 0; 

    float d = dist (position.x, position.y, mouseX, mouseY); 
    if (d < rad) { 
     float force = map(d, 0, rad, speed, 0); 
     if (position.x < mouseX) { 
     if (position.y < mouseY) { 
      velocity.y = -force; 
     } else { 
      velocity.y = force; 
     } 
     } else { 
     if (position.y < mouseY) { 
      velocity.y = force; 
     } else { 
      velocity.y = -force; 
     } 
     } 
     position.add(velocity); 
    } else { 
     position = new PVector(position.x+speed, initialPosY); 
    } 



    if (position.x<0)position.x+=width; 
    if (position.x>width)position.x-=width; 
    if (position.y<0)position.y+=height; 
    if (position.y>height)position.y-=height; 
    } 

    void render() 
    { 
    stroke(255, 255, 255, 80); 
    point(position.x, position.y); 
    } 
} 

class ParticleSystem 
{ 
    Particle[] particles; 

    ParticleSystem() 
    { 
    particles = new Particle[NUM_PARTICLES]; 
    for (int i = 0; i < NUM_PARTICLES; i++) 
    { 
     particles[i]= new Particle(); 
    } 
    } 

    void update() 
    { 
    for (int i = 0; i < NUM_PARTICLES; i++) 
    { 
     particles[i].update(); 
    } 
    } 

    void render() 
    { 
    for (int i = 0; i < NUM_PARTICLES; i++) 
    { 
     particles[i].render(); 
    } 
    } 
} 

class Rock{ 

    void rock() 
    { 
    noFill(); 
    stroke(255); 
    strokeWeight(4); 
    ellipse(mouseX,mouseY,50,50); 

} 



} 

ответ

0

Я сделал некоторые работы моего на нем вчера, и я близко к тому, что я хочу, все еще есть некоторые визуальные issues.I хотят получить избавляясь от краев потока, и когда я перемещаю мышь, я все еще вижу линии эллипса от силы. Вот результат.

int NUM_PARTICLES = 9000; 
ParticleSystem p; 
Rock r; 
void setup() 
{ 
    smooth(); 
    size(700,700,P2D); 
    p = new ParticleSystem(); 
    r = new Rock(); 
} 

void draw() 
{ 
    background(0); 
    p.update(); 
    p.render(); 
    r.rock(); 

} 

float speed = 2; 
float rad = 100; 
class Particle 
{ 
    PVector position, velocity; 
    float initialPosY; 

    Particle() 
    { 
    position = new PVector(random(width), random(height)); 
    initialPosY = position.y; 
    velocity = new PVector(); 
    } 

    void update() 
    { 

    velocity.x = speed; 
    velocity.y = 0; 

    float d = dist (position.x, position.y, mouseX, mouseY); 
    if (d < rad) { 
     float force = map(d, 0, rad, speed, 0); 
     if (position.x < mouseX) { 
     if (position.y < mouseY) { 
      velocity.y = -force; 
     } else { 
      velocity.y = force; 
     } 
     } else { 
     if (position.y < mouseY) { 
      velocity.y = force; 
     } else { 
      velocity.y = -force; 
     } 
     } 
     position.add(velocity); 
    } else { 
     position = new PVector(position.x+speed, initialPosY); 
    } 



    if (position.x<0)position.x+=width; 
    if (position.x>width)position.x-=width; 
    if (position.y<0)position.y+=height; 
    if (position.y>height)position.y-=height; 
    } 

    void render() 
    { 
    stroke(255, 255, 255, 80); 
    point(position.x, position.y); 
    } 
} 

class ParticleSystem 
{ 
    Particle[] particles; 

    ParticleSystem() 
    { 
    particles = new Particle[NUM_PARTICLES]; 
    for (int i = 0; i < NUM_PARTICLES; i++) 
    { 
     particles[i]= new Particle(); 
    } 
    } 

    void update() 
    { 
    for (int i = 0; i < NUM_PARTICLES; i++) 
    { 
     particles[i].update(); 
    } 
    } 

    void render() 
    { 
    for (int i = 0; i < NUM_PARTICLES; i++) 
    { 
     particles[i].render(); 
    } 
    } 
} 

class Rock{ 

    void rock() 
    { 
    noFill(); 
    stroke(255); 
    strokeWeight(4); 
    ellipse(mouseX,mouseY,50,50); 

} 



} 
+0

Вы должны добавить это как редактирование на свой вопрос, а не ответ, потому что это не ответ –

1

Давайте начнем с чем-то более простой:

PVector position; 
PVector speed; 

void setup() { 
    size(500, 500); 
    position = new PVector(250, 0); 
    speed = new PVector(0, 1); 
} 

void draw() { 

    background(0); 

    ellipse(position.x, position.y, 20, 20); 

    position.add(speed); 

    if (position.y > height) { 
    position.y = 0; 
    } 

    if (position.x < 0) { 
    position.x = width; 
    } else if (position.x > width) { 
    position.x = 0; 
    } 
} 

Теперь, когда мы имеем это, мы должны разбить проблему на более мелкие шаги.

Шаг 1: Добавить «скалу» к эскизу. Давайте соберем наши в позиции курсора мыши:

void draw() { 

    background(0); 

    fill(0, 255, 0); 
    ellipse(mouseX, mouseY, 100, 100); 

    fill(0, 0, 255); 
    ellipse(position.x, position.y, 20, 20); 

    position.add(speed); 

    //rest of code unchanged 

Шаг 2: Добавить логику, которая определяет, когда частица приближается к скале. На данный момент, просто сделать что-то простое, как изменить цвет рока:

if(dist(position.x, position.y, mouseX, mouseY) < 100){ 
    fill(255, 0, 0); 
    } 
    else{ 
    fill(0, 255, 0); 
    } 

    ellipse(mouseX, mouseY, 100, 100); 

Шаг 3: Теперь, когда мы знаем, когда частица находится вблизи скалы, добавить логику для перемещения частиц вокруг скалы. Вот очень простой подход:

if (dist(position.x, position.y, mouseX, mouseY) < 100) { 
    fill(255, 0, 0); 
    if (position.x < mouseX) { 
     position.x--; 
    } else { 
     position.x++; 
    } 
    } else { 
    fill(0, 255, 0); 
    } 

Вы могли бы сделать эту логику гораздо более сложным, и я рекомендую играть с ним, пока вы не найдете правильный эффект.

Собирает все вместе, это выглядит следующим образом:

PVector position; 
PVector speed; 

void setup() { 
    size(500, 500); 
    position = new PVector(250, 0); 
    speed = new PVector(0, 1); 
} 

void draw() { 

    background(0); 

    if (dist(position.x, position.y, mouseX, mouseY) < 100) { 
    fill(255, 0, 0); 
    if (position.x < mouseX) { 
     position.x--; 
    } else { 
     position.x++; 
    } 
    } else { 
    fill(0, 255, 0); 
    } 

    ellipse(mouseX, mouseY, 100, 100); 

    fill(0, 0, 255); 
    ellipse(position.x, position.y, 20, 20); 

    position.add(speed); 

    if (position.y > height) { 
    position.y = 0; 
    } 

    if (position.x < 0) { 
    position.x = width; 
    } else if (position.x > width) { 
    position.x = 0; 
    } 
} 
+0

Спасибо :) но я сделал некоторые изменения, может быть, вы можете дать мне некоторое представление о моей текущей проблеме – PoYo

+0

@PoYo Если у вас есть другая проблема, пожалуйста, напишите новый вопрос (сделать новый пост отдельно от этот) вместе с [MCVE] (http://stackoverflow.com/help/mcve). Вам также повезет, если вы ** попробуете что-то ** вместо того, чтобы просто сказать нам, что вы хотите. –

+0

Ну, на самом деле я ответил на свой вопрос, и я собирался сделать то, что вы предложили, сделать новый пост, но кто-то прокомментировал мой ответ и сказал мне, что я не должен отвечать на мой вопрос, а просто добавлю его как редактирование на мой оригинальный пост , – PoYo

Смежные вопросы