gpt4 book ai didi

java - 如何更改 mousePress() 上单行的颜色

转载 作者:行者123 更新时间:2023-11-30 01:52:11 26 4
gpt4 key购买 nike

我有一小段原型(prototype)代码。

我试图让它在 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);
}
}

最佳答案

如果有一条线,由一个点 (O) 和一个方向 (D) 给出,那么该线上距离点 p 最近的点可以计算如下

X = O + D * dot(P-O, D);

两个 vector 的点积等于两个 vector 之间的角度的余弦乘以两个 vector 的大小(长度)。

enter image description here

dot( A, B ) == | A | * | B | * cos( alpha ) 

VD 的点积等于直线 (O, D) 之间角度的余弦code>) 和 vector V = P - O,乘以 V 的数量(长度),因为 Dunit vector (D 的长度为 1.0)。

使用PVector获取从 (ranX1, ranY1) 到 (ranX2, ranY2) 的方向,并将方向 vector 设为单位 vector .normalize() 。 vector 的长度由 .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) 位于 (ranX1, ranY1) 和 (ranX2, ranY2) 之间。如果两个亚麻布之间的角度大于 90 度或小于 -90 度,则点积小于 0.0:

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;

向类 Line 添加方法 isHit,用于检查输入位置 (x, y ) 已上线。可以通过 hit_dist 设置识别线上点击的可接受精度。如果必须准确命中该线,请减小该值。增加它以允许在球线旁边但靠近球线的地方击球。添加颜色属性 col 和可以更改颜色的方法:

class Line {

// [...]

color col;

// [...]

void setColor(color c) {
col = c;
}

boolean isHit(int x, int y) {

final int hit_dist = 5;

// [...]

return hit;
}
}

使用鼠标按下事件mousePressed()循环遍历所有行。改变每条线的颜色是按下鼠标时鼠标2hit":

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) );
}
}
}

查看示例,它实现了算法并对您的代码进行了一些进一步的改进和错误修复:

int value = 0;
ArrayList<Line> l = new ArrayList<Line>();

void setup() {
size(500,500);

for (int i = 0; i < 20; ++i) {
l.add(new Line());
}
}

void draw() {

background(57, 76, 222);

strokeWeight(3);
for (int i = 0; i < l.size(); ++i) {
l.get(i).display();
}
}

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) );
}
}
}

class Line {
int ranX1, ranX2, ranY1, ranY2;
color col;

Line() {
col = color(255);
ranX1 = int(random(50,450));
ranX2 = int(random(50,450));
ranY1 = int(random(50,450));
ranY2 = int(random(50,450));
}

void setColor(color c) {
col = c;
}

boolean isHit(int x, int y) {

final int hit_dist = 5;

PVector D = new PVector(ranX2 - ranX1, ranY2 - ranY1);
if ( D.mag() > 0.0 )
D.normalize();

PVector vP1 = new PVector(x - ranX1, y - ranY1);
if ( D.dot( vP1 ) < 0.0 )
return false;

PVector vP2 = new PVector(x - ranX2, y - ranY2);
if ( D.dot( vP2 ) > 0.0 )
return false;

PVector X = new PVector(ranX1, ranY1);
X.add( D.mult( D.dot( vP1 ) ) );
boolean hit = X.dist(new PVector(x, y)) < hit_dist;

return hit;
}

void display() {
stroke(col);
line(ranX1, ranY1, ranX2, ranY2);
}
}

关于java - 如何更改 mousePress() 上单行的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55678946/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com