根据它们位于线的哪一侧来确定颜色点

时间:2019-05-18 13:33:48

标签: math vector processing vectormath

我正在尝试制定一种算法,根据该点位于线条的哪一边,为该点着色某种颜色。这就是我目前所拥有的。代码没有给出任何错误,但是颜色也不能正确显示点。.有人可以指出我在做什么吗?

查看代码:

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 个答案:

答案 0 :(得分:3)

您需要点缀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

由于minmax是处理内置函数,因此您确定要将它们用作变量名吗?