基于它们位于线的哪一侧的颜色点
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());
它将按预期工作:
切线地,由于 min
和 max
正在处理 built-ins,您确定要将它们用作变量名吗?
我正在尝试制作一个小算法,根据点所在的直线的哪一侧为点着色。这就是我现在所拥有的。代码没有给出任何错误,但是点的颜色也不正确。有人可以指出我做错了什么吗?
查看代码:
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());
它将按预期工作:
切线地,由于 min
和 max
正在处理 built-ins,您确定要将它们用作变量名吗?