确定两个点是否在javascript中在线的同一侧

|| 假设我有两点代表线A,例如:
var A = [ { x: 385, y: 380 }, { x: 420, y: 400 }]
我还有另外两点B和C,例如:
var B = { x: 385, y: 420 }
var C = { x: 405, y: 423 }
我如何确定B和C是否都在A行的同一侧?为了增加一些上下文,我尝试对六边形进行命中测试,其中B是六边形的中心点,C是当前鼠标位置,A是六边形的每条线。所有这些点本质上都是像素坐标,其中0,0是左上角。 我不需要这样快速燃烧,我只是在尝试创建可能的最简单的六边形命中测试算法。我的理论是,如果我可以确定C与B在六边形的每一行的同一侧,则命中测试成功。我已经阅读了几种数学算法来执行此操作,但是它们似乎始终处于不同类型的坐标系中,因此我正努力将其转换为可在javascript中使用的内容。 编辑:这是我的实际六角函数给出下面的答案。这个问题的答案在更新功能中。
var TILE_WIDTH = 70
var TILE_HEIGHT = 80

function Hexagon(x, y) {
    var normalColor = \'rgb(207, 226, 243)\'
    var hilightColor = \'rgb(204, 204, 204)\'
    var currentColor = normalColor

    var coords = new TileCoordinates(x, y)
    var points = [
        { x: coords.x, y: coords.y - TILE_HEIGHT / 2 },
        { x: coords.x + TILE_WIDTH / 2, y: coords.y - TILE_HEIGHT / 4 },
        { x: coords.x + TILE_WIDTH / 2, y: coords.y + TILE_HEIGHT / 4 },
        { x: coords.x, y: coords.y + TILE_HEIGHT / 2 },
        { x: coords.x - TILE_WIDTH / 2, y: coords.y + TILE_HEIGHT / 4 },
        { x: coords.x - TILE_WIDTH / 2, y: coords.y - TILE_HEIGHT / 4 },
    ]

    var sides = [
        [points[0], points[1]],
        [points[1], points[2]],
        [points[2], points[3]],
        [points[3], points[4]],
        [points[4], points[5]],
        [points[5], points[0]]
    ]

    this.update = function (totalTime, updateTime) {

        var B = coords
        var C = Mouse.state
        var inside = C != null
        if (inside) {
            for (i in sides) {
                var A = sides[i]
                var w = { y: A[1].x - A[0].x, x: -(A[1].y - A[0].y) }
                var P = A[1]

                inside = ((B.x - P.x) * w.x + (B.y - P.y) * w.y) * ((C.x - P.x) * w.x + (C.y - P.y) * w.y) > 0
                if (!inside) break
            }
        }

        if (inside)
            currentColor = hilightColor
        else
            currentColor = normalColor
    }

    this.draw = function (ctx) {
        ctx.fillStyle = currentColor
        ctx.strokeStyle = \'rgb(11, 83, 148)\'
        ctx.beginPath()
        ctx.moveTo(points[0].x, points[0].y)
        ctx.lineTo(points[1].x, points[1].y)
        ctx.lineTo(points[2].x, points[2].y)
        ctx.lineTo(points[3].x, points[3].y)
        ctx.lineTo(points[4].x, points[4].y)
        ctx.lineTo(points[5].x, points[5].y)
        ctx.lineTo(points[0].x, points[0].y)
        ctx.fill()
        ctx.stroke()

        ctx.fillStyle = \'#000\'
        var text = coords.pos_x + \',\' + coords.pos_y
        var measure = ctx.measureText(text)
        ctx.fillText(text, coords.x - measure.width / 2, coords.y + 12 + (TILE_HEIGHT / 4))
    }
}

// this is in a separate function because other objects that render into the hex
// need the pixel coordinates of the tile also
function TileCoordinates(x, y) {
    this.pos_x = x
    this.pos_y = y
    this.x = x * TILE_WIDTH + ((y + 1) * TILE_WIDTH / 2)
    this.y = (y + 1) * (3 / 4 * TILE_HEIGHT)
}
为了确定相同性,我将B和C的结果相乘,如果结果> 0,那么它们要么都是正的,要么都是负的。我正在使用setInterval在循环上渲染六边形并将其更新为画布。     
已邀请:
表示A的线由向量
v = { x: 420 - 385, y: 400 - 380 } = { x: 35, y: 20 }
和起点
P = { x: 385, y: 380 }
描述。给定2d中的向量
(x, y)
,向量
(y, -x)
总是与其成直角。因此向量
w = { x: 20, y: -35 }
v
成直角。线性代数告诉我们
(B - P) dot w
的符号告诉我们,线line的哪一边位于
dot
是标准点积的位置。 (该行本身为零。) 因此,在您的示例中,我们需要执行的计算是:
For B:
(B - P) dot w
  = { x: 385 - 385, y: 420 - 380 } dot { x: 20, y: -35 }
  = { x: 0, y: 40} dot { x: 20, y: -35 }
  = (0 * 20) + (40 * (-35))
  = -1400

For C:
(C - P dot w
  = { x: 405 - 385, y: 423 - 380 } dot { x: 20, y: -35 }
  = { x: 20, y: 43} dot { x: 20, y: -35 }
  = (20 * 20) + (43 * (-35))
  = -1105
由于符号相同,因此它们在同一侧。 实际上,我们可以说更多。如果您位于
A
的起点并且正对终点,则两个点都在您的左侧。 (左侧为负,右侧为正。)     

要回复问题请先登录注册