如何在mousePress()

时间:2019-04-14 19:00:30

标签: java processing

我有一小段代码用于原型。

我正在尝试使用它,以便在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);
    }
}

1 个答案:

答案 0 :(得分:2)

如果您有一条由点(O和方向(D)给出的直线,则该直线上最接近点p的点可以如下计算

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

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

enter image description here

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

VD的点积等于直线(OD)和向量V = P - O之间的夹角余弦,乘以V的数量(长度),因为Dunit vectorD的长度是1.0)。

使用PVector获取从(ranX1ranY1)到(ranX2ranY2)的方向,并将方向矢量转换为单位矢量由.normalize()。向量的长度由.mag()验证:

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

使用上述算法来计算到一条无限长线的法线距离,其中0点(ranX1ranY1)和(ranX2ranY2)处于打开状态。为此,使用方法.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;

使用点积来验证直线与通过点(Xx)的法线的交点(y)是否位于({{ 1}},ranX1)和(ranY1ranX2)。如果两个亚麻布之间的角度大于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中,该方法检查输入位置(Linex)是否在线。可以通过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) );
        }
    } 
}