цветовые точки в зависимости от того, на какой стороне линии они находятся - PullRequest
3 голосов
/ 18 мая 2019

Я пытаюсь создать небольшой алгоритм, который окрашивает точку в определенный цвет, основываясь на том, на какой стороне линии находится точка. Это то, что у меня есть на данный момент. Код не выдает никаких ошибок, но цвета также не верны для точек. Может ли кто-нибудь указать мне, что я делаю неправильно?

См. Код:

PVector[] points; 

void setup() {
  size(500, 500);
  points = new PVector[10];
  for (int i = 0; i < points.length; i++) {
    points[i] = new PVector(random(0, width), random(0, height));
  }

  ExtremesLine(points);
}

void ExtremesLine(PVector[] pts) {
  float maxx = 0, minx = width+1;
  PVector min = new PVector(), max = new PVector();
  ArrayList<PVector> groupA = new ArrayList<PVector>(), groupB = new ArrayList<PVector>();
  for (int i = 0; i < pts.length; i++) {
    if (pts[i].x > maxx) { 
      maxx = pts[i].x;
      max = pts[i];
    } 
    if (pts[i].x < minx) {
      minx = pts[i].x;
      min = pts[i];
    }
  }
  PVector divisionLine  = new PVector();
  PVector.sub(max, min, divisionLine);
  PVector normal  = new PVector(-divisionLine.y, divisionLine.x).normalize();
  for (int i = 0; i < pts.length; i++) {
    float s = PVector.dot(normal, pts[i].copy().normalize());
    if ( s < 0) groupA.add(pts[i]);
    else if ( s > 0) groupB.add(pts[i]);
  }

  fill(0);
  line(min.x, min.y, max.x, max.y);
  for (int i = 0; i < groupA.size(); i++) {
    fill(255, 0, 0);
    ellipse(groupA.get(i).x, groupA.get(i).y, 10, 10);
  }
  for (int i = 0; i < groupB.size(); i++) {
    fill(0, 0, 255);
    ellipse(groupB.get(i).x, groupB.get(i).y, 10, 10);
  }
}

Как видно из изображений ниже, иногда это работает, но в 90% случаев это не так. Первое изображение - правильный результат, второе изображение - неправильный результат
enter image description here enter image description here

Если есть что-то неясное, пожалуйста, дайте мне знать, чтобы я мог уточнить!

1 Ответ

3 голосов
/ 18 мая 2019

Вам нужно расставить точки с векторами из min:

заменить

float s = PVector.dot(normal, pts[i].copy().normalize());

на

float s = PVector.dot(normal, pts[i].copy().sub(min).normalize());

, и все будет работать как положено:

enter image description here

Тангенциально, поскольку min и max обрабатывают встроенные функции, вы уверены, что хотите использовать их в качестве имен переменных?

...