我的处理草图中有一个线段和一个圆圈。我想要圆的中心,点q,找到线段上最近的点p,圆圈将朝向它移动。 我不太确定如何编码(处理中),所以任何建议都会很棒!谢谢! 到目前为止,这是我的代码:
int xPos1 = 200;
int yPos1 = 200;
int xp1 = 50;
int yp1 = 50;
int xp2 = 350;
int yp2 = 50;
void setup() {
size(400, 400);
strokeWeight(2);
line(xp1, yp1, xp2, yp2);
strokeWeight(1);
}
void draw() {
drawCircle();
}
void drawCircle() {
fill(50, 120, 120);
//circle
ellipse(xPos1, yPos1, 75, 75);
//circle center
ellipse(xPos1, yPos1, 7, 7);
fill(255);
text("Q", xPos1 + 15, yPos1 + 5);
fill(50, 120, 120);
}
答案 0 :(得分:2)
点到线上的投影如下:
以x = a + t * n和点p
形式的行开头表示距离点p的线上最近点的向量组件是:
(a-p) - ((a-p)dot n)n
所以我们得到:p +(a - p) - ((a - p)dot n)n
经过一些简化后,我们有: a - ((a - p)dot n)n注意((a - p)点n)n是向量分量,表示从最近点到开头的直线位置(即从最近点到p回到a)
让我们使用PVector
来让生活更轻松。
PVector p = new PVector(200, 200);
PVector a = new PVector(50, 50);
PVector b = new PVector(350, 50);
PVector n = new PVector(350, 50); // |p2 - p1|
void setup() {
size(400, 400);
strokeWeight(2);
strokeWeight(1);
// initialize our normalized (unit length) line direction
n.sub(a);
n.normalize();
}
void draw() {
drawCircle();
}
PVector getNearestPointOnLine(PVector p, PVector a, PVector n){
// the notation turns the computation inside out,
// but this is equivalent to the above equation
PVector q = PVector.mult(n, -PVector.sub(a, p).dot(n));
q.add(a);
return q;
}
void drawCircle() {
// lets draw everything here where we can see it
background(255, 255, 255);
line(a.x, a.y, b.x, b.y);
fill(50, 120, 120);
//circle
// NOTE: this may require hooking up a mouse move event handler
p.x = mouseX;
p.y = mouseY;
PVector q = getNearestPointOnLine(p, a, n);
ellipse(q.x, q.y, 75, 75);
//circle center
ellipse(q.x, q.y, 7, 7);
fill(0); // make text visible on white background
text("Q", q.x + 15, q.y + 5);
//fill(50, 120, 120);
}
参考:https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line#Vector_formulation