基于它们位于线的哪一侧的颜色点

color points based on what side of line they are on

我正在尝试制作一个小算法,根据点所在的直线的哪一侧为点着色。这就是我现在所拥有的。代码没有给出任何错误,但是点的颜色也不正确。有人可以指出我做错了什么吗?

查看代码:

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% 的时间里它不起作用。第一张图是正确的结果,第二张图是错误的结果

如果有任何不清楚的地方,请告诉我,以便我澄清!

您需要用来自 min:

的向量点

替换

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

来自

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

它将按预期工作:

切线地,由于 minmax 正在处理 built-ins,您确定要将它们用作变量名吗?