我有一小段代码用于原型。
我正在尝试使用它,以便在mousePressed()或mouseClicked()上单击的行的颜色会改变。
我无法为自己的生活弄清楚!
任何帮助将不胜感激!
我到目前为止设法编写的代码如下,它应该可以正常工作。
int value = 0;
ArrayList<Line> l = new ArrayList<Line>();
void setup() {
size(500,500);
background(57, 76, 222);
//noLoop();
stroke(255);
strokeWeight(3);
}
void draw() {
for (int i = 1; i< 20; i++) {
l.add(new Line());
for (int a=0; a< l.size(); a++){
l.get(a).display();
noLoop();
}
}
int total = l.size();
println("The total number of lines is: " + total);
}
class Line {
int ranX1, ranX2, ranY1, ranY2;
Line() {
ranX1 = int(random(50,450));
ranX2 = int(random(50,450));
ranY1 = int(random(50,450));
ranY2 = int(random(50,450));
}
void update() {
//
}
void display() {
line(ranX1,ranX2,ranY1,ranY2);
}
}
答案 0 :(得分:2)
如果您有一条由点(O
和方向(D
)给出的直线,则该直线上最接近点p的点可以如下计算>
X = O + D * dot(P-O, D);
2个向量的点积等于2个向量之间的夹角余弦乘以两个向量的大小(长度)。
dot( A, B ) == | A | * | B | * cos( alpha )
V
和D
的点积等于直线(O
,D
)和向量V = P - O
之间的夹角余弦,乘以V
的数量(长度),因为D
是unit vector(D
的长度是1.0)。
使用PVector
获取从(ranX1
,ranY1
)到(ranX2
,ranY2
)的方向,并将方向矢量转换为单位矢量由.normalize()
。向量的长度由.mag()
验证:
PVector D = new PVector(ranX2 - ranX1, ranY2 - ranY1);
if ( D.mag() > 0.0 )
D.normalize();
使用上述算法来计算到一条无限长线的法线距离,其中0点(ranX1
,ranY1
)和(ranX2
,ranY2
)处于打开状态。为此,使用方法.mult()
,.add()
,.dist()
和.dot()
:
PVector X = new PVector(ranX1, ranY1);
X.add( D.mult( D.dot( vP1 ) ) );
boolean hit = X.dist(new PVector(x, y)) < hit_dist;
使用点积来验证直线与通过点(X
,x
)的法线的交点(y
)是否位于({{ 1}},ranX1
)和(ranY1
,ranX2
)。如果两个亚麻布之间的角度大于90度或小于-90度,则点积小于0.0:
ranY2
将方法PVector vP1 = new PVector(x - ranX1, y - ranY1);
if ( D.dot( vP1 ) < 0.0 )
hit = false;
PVector vP2 = new PVector(x - ranX2, y - ranY2);
if ( D.dot( vP2 ) > 0.0 )
hit = false;
添加到类isHit
中,该方法检查输入位置(Line
,x
)是否在线。可以通过y
设置识别点击的可接受精度。如果必须精确地打线,请减小此值。增加它以允许在行附近但也在行附近命中。添加颜色属性hit_dist
和可以更改颜色的方法:
col
使用鼠标事件mousePressed()
遍历循环中的所有行。按下鼠标时,将每行颜色更改为2hit”。
class Line {
// [...]
color col;
// [...]
void setColor(color c) {
col = c;
}
boolean isHit(int x, int y) {
final int hit_dist = 5;
// [...]
return hit;
}
}
请参见示例,该示例实现了算法,并对代码进行了进一步的改进和错误修复:
void mousePressed() {
for (int i = 0; i < l.size(); ++i) {
if (l.get(i).isHit(mouseX, mouseY)) {
l.get(i).setColor(color(255, 0, 0) );
}
}
}