我试图计算一个点是位于由两个点定义的线之上还是之下。为了澄清,我只需要知道这一点是否已经开始,这一方面"或者"那边"。我意识到如果线条是完全垂直的,那么就没有"以上#34;或"以下"。我有两行(centerX,centerY)和(xprime,yprime)定义的一行。为简单起见centerX,centerY可以转换为(0,0)。我想确定(mouseX,mouseY)是否高于或低于该行。
我试图使用这个公式,但它没有给我我预期的结果。
var position = Math.sin((xprime -centerX) * (mouseY - centerY) - (yprime - centerY) * (mouseX - prime));
位置的值似乎从正到负摆动,因为mouseX,mouseY值围绕直线旋转。我的印象是当鼠标位置(mouseX,mouseY)划过线时,符号会从正变为负一次。线上方的值将为正值,下面的值将为负值。
我将此代码与公式结合使用,以确定原始点击的偏转角度。但我无法确定鼠标现在是否位于初始点击之上或以下。 (再次请原谅"以上"以及"以下")
答案 0 :(得分:2)
利用跨产品属性的简单解决方案。
dx = xprime - centerX
dy = yprime - centerY
mx = mouseX - centerX
my = mouseY - centerY
cross = dx * my - dy * mx //zero means point on line
below = (cross > 0) //mouse is "at the right hand" of the directed line
if dx <> 0 then // check for vertical line
if dy/dx < 0 then //negative slope, invert result
below = not below
答案 1 :(得分:0)
我会尝试给你一般解决方案。
如何检查确切点是否高于或低于线功能:
想象一下,我们有一行f(x) = 4x + 2
。我们需要检查,如果在线下方或上方点(x1, y1)
,我们需要计算f(x1)并将其与y1进行比较。
如果f(x1) > y1
意味着,(x1, y1)
就行了。
如果f(x1) < y1
表示该行上方的点(x1, y1)
。
如果f(x1) = y1
- 指向一条线。
你可以看情节:
所有行函数看起来都像f(x) = k * x + b
,因此,您需要知道k
和b
常量才能知道确切的行函数。
如何通过两点获得线功能:
想象点A (x_a, y_a)
和B (x_b, y_b)
我们想得到线函数,我们需要求解两个方程的系统:
y_a = k * x_a + b
y_b = k * x_b + b
这很容易。在您知道k
和b
后,您可以检查是否低于或高于AB
行