首页 > 解决方案 > 颜色点基于它们所在的线的哪一侧

问题描述

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

见代码:

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% 的时间它不起作用。第一张图是正确的结果,第二张图是错误的结果
在此处输入图像描述 在此处输入图像描述

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

标签: mathvectorprocessingvectormath

解决方案


你需要用来自的向量点min

代替

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

经过

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

它将按预期工作:

在此处输入图像描述

切线,因为minmax是 Processing 内置的,您确定要将它们用作变量名吗?


推荐阅读