Я пытаюсь решить эту проблему: рисовать случайные строки на экране, а затем создавать точки на пересечении всех строк. Мое решение: вместо создания реальных строк я использую маленькие точки для построения строк. Каждая "строка" - это экземпляр класса 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 точки в плоскости, вы можете получить уравнение линии, используя эти 2 пункта, следуя этому https://www.khanacademy.org/test-prep/algebra1-brushup/graph-eqns-brushups/v/equation-of-a-line-3. У вас есть уравнение из двух разных линий, вы можете найти точки, где они пересекаются на G (x) = F (x).
С уважением
В настоящий момент у меня нет возможности использовать Script Script. Обработка похожа на Java, и с небольшими изменениями такой скрипт можно запустить как Java-апплет.
Однако ваш подход во многом сомнительный.
Первый вызов метода 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++;
}
}
(int)
должен быть преобразован в int
, на самом деле это просто мелочи). Я вижу ваше намерение не очищать фон, но, например, когда вы изменяете размер окна, все, что вы нарисовали раньше, все равно будет потеряно ...