如何在矩形的边框上绘制一个点?

mtx*_*mtx 2 java processing trigonometry vector

我正在试图解决这个问题......这个点应该位于鼠标指向的地方的边界上.换句话说,在矩形边界线与矩形中心和鼠标指针之间的线之间交叉.我需要以某种方式使用三角函数,因为矩形可能会旋转.下面的代码(处理中)使我能够绘制点,但只能在南边界...

int size = 200;

void setup() {
  size(1200,500);
  smooth();
  ellipseMode(CENTER);
  rectMode(CENTER);

}

void draw() {
  background(255);
  noFill();

  PVector center = new PVector(width/2,height/2);
  PVector mouse = new PVector(mouseX, mouseY);

  float mouseDistance = PVector.dist(center,mouse);

  mouse.sub(center); // mouse coordinates relative to center point

  float t = atan2(mouse.y, mouse.x);

  float borderDistance = (size/2) / sin(t); 
  float bx = cos(t) * borderDistance;
  float by = sin(t) * borderDistance;

  pushMatrix();
    translate(center.x, center.y);
    strokeWeight(5);
    stroke(255,0,0);
    point(0,0);
    point(mouse.x, mouse.y);
    point(cos(t)*size/2, sin(t)*size/2);
    point(bx,by);
    strokeWeight(1);
    stroke(0);
    ellipse(0, 0, size, size);
    rect(0,0, size, size);
    stroke(0,255,0);
    line(0, 0, mouse.x, mouse.y);
  popMatrix();
}
Run Code Online (Sandbox Code Playgroud)

Tyl*_*ler 7

好的,这里的数学将为您提供所需点的位置.

参考图:

问题图

为了找到这Green一点,我们需要做的就是找到虚构矩形的高度和宽度(见图),分别标记为AdjOpp,并将这些值添加到该Center点.


如果你还记得SOH CAH TOA,我们将利用TOA:

Tan(Theta) = Opposite / Adjacent 
Run Code Online (Sandbox Code Playgroud)

可以重新安排:

Opposite = Tan(Theta) * Adjacent
Run Code Online (Sandbox Code Playgroud)

所以我们需要先找到Adjacent (Adj)并且Theta.


咨询的图,Adj显然是在差异y之间OrangeCenter:

Adj = Orange.y - Center.y
Run Code Online (Sandbox Code Playgroud)

但我们不知道Orange?好吧,Orange等于Center加上矩形高度的一半:

Orange = (Center.x, Center.y + Rect.Height/2)
Run Code Online (Sandbox Code Playgroud)

将值Orange重新计入我们的Adj计算中:

Adj = Center.y + Rect.Height/2 - Center.y
Adj = Rect.Height/2
Run Code Online (Sandbox Code Playgroud)

接下来我们需要找到Theta.

在此输入图像描述

重新回到SOH CAH TOA CAH:

Cos(Theta) = Adjacent / Hypotenuse
Theta = acos(Adjacent / Hypotenuse)  //Inverse cosine
Run Code Online (Sandbox Code Playgroud)

我们已经知道Adj = Rect.Height/2从早些时候开始,所以我们只需要找到Hyp.要找到Hyp我们可以使用距离公式,其中说:

d = sqrt((x2 - x1)^2 + (y2 - y1)^2)
Run Code Online (Sandbox Code Playgroud)

在我们的情况下:

Hyp = sqrt((Center.x - Mouse.x)^2 + (Center.y - Mouse.y)^2) 
Run Code Online (Sandbox Code Playgroud)

所以现在我们拥有了我们需要的一切Theta:

Theta = acos(Adj / Hyp)  //Inverse cosine
Run Code Online (Sandbox Code Playgroud)

最后,我们有我们需要的Opp:

Opp = Tan(Theta) * Adjacent
Run Code Online (Sandbox Code Playgroud)

这意味着我们拥有回答您问题所需的一切:

Green = (Center.x + Opp, Center.y + Adj)
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 这是使用学位的"纸上数学".许多编程语言处理弧度而不是度数,因此您可能需要进行一些转换.

  • 正如@Jerry Andrews指出的那样,这个问题将有四种不同的情况,它们对应于绘图点可能落在矩形的四个不同边:

为了确定象限,他首先需要矩形中心和任何角之间的角度 - 因此,atan(高度/宽度).这将给出半角(中心到绿色,如果绿色在角落).然后atan(mouse.y/mouse.x)将提供从矩形中心到鼠标光标的线的角度(因为在他的代码中,鼠标相对于矩形的中心定位).