Обнаружение пересечения линии

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
    «Мое решение: вместо создания реальных линий я использую маленькие точки для построения линий» - на самом деле это звучит не как решение, а скорее как источник новых проблем. Есть какая-то конкретная причина, почему вы делаете это таким образом?
Показать ещё 2 комментария
Теги:
arrays
processing
intersection
trigonometry

2 ответа

2

Это простая математическая проблема. То, что у вас есть для каждой линии, составляет 2 точки в плоскости, вы можете получить уравнение линии, используя эти 2 пункта, следуя этому https://www.khanacademy.org/test-prep/algebra1-brushup/graph-eqns-brushups/v/equation-of-a-line-3. У вас есть уравнение из двух разных линий, вы можете найти точки, где они пересекаются на G (x) = F (x).

С уважением

0

В настоящий момент у меня нет возможности использовать 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++;


    }

}
  • 0
    Большое вам спасибо за то, что уделили мне время. У меня сейчас нет Java, поэтому я не могу проверить вашу программу. Но я не хочу очищать фон, потому что хочу, чтобы точки рисовались на экране, например, когда вы пишете на белой доске, не стирая ее. Я протестирую этот Java-апплет и сообщу вам.
  • 0
    Должно быть только несколько модификаций, необходимых для преобразования его обратно в сценарий обработки (например, (int) должен быть преобразован в int , на самом деле это просто мелочи). Я вижу ваше намерение не очищать фон, но, например, когда вы изменяете размер окна, все, что вы нарисовали раньше, все равно будет потеряно ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню