Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 计算线是否穿过圆,在某些角度的奇怪行为_Javascript_Math_Angle - Fatal编程技术网

Javascript 计算线是否穿过圆,在某些角度的奇怪行为

Javascript 计算线是否穿过圆,在某些角度的奇怪行为,javascript,math,angle,Javascript,Math,Angle,好的,我想计算一条线是否穿过一个圆(至少是圆内的一部分线)。我找到了几个答案,但我觉得它们太复杂了,所以我想出了这个。我不是学数学的,所以我现在有点困了。当直线垂直对齐时,“半径>=Math.sqrt(len*len+len*len-o);”变为真(45°角时变为0)。我不知道为什么会这样。谢谢:) 工作原理基本相同,但速度更快。问题是它计算的是一条无限长的直线。我该如何解决这个问题 编辑2: function lineInCircle(sx, sy, x, y, cx, cy, radius)

好的,我想计算一条线是否穿过一个圆(至少是圆内的一部分线)。我找到了几个答案,但我觉得它们太复杂了,所以我想出了这个。我不是学数学的,所以我现在有点困了。当直线垂直对齐时,“半径>=Math.sqrt(len*len+len*len-o);”变为真(45°角时变为0)。我不知道为什么会这样。谢谢:)

工作原理基本相同,但速度更快。问题是它计算的是一条无限长的直线。我该如何解决这个问题

编辑2:

function lineInCircle(sx, sy, x, y, cx, cy, radius) {
    cx -= sx; x -= sx; //sx is the first point's x position
    cy -= sy; y -= sy;//sy is the first point's y position
    ctp = Math.sin(Math.atan(y / x) - Math.atan(cy / cx)) * Math.sqrt((cy * cy) + (cx * cx));
    return radius >= ctp && ctp >= -radius;
}
function lineInCircle(sx, sy, x, y, cx, cy, radius) {
    cx -= sx; x -= sx;
    cy -= sy; y -= sy;
    var h = Math.sqrt(cy * cy + cx * cx)
    ctp = Math.sin(Math.atan(y / x) - Math.atan(cy / cx)) * h;
    sideb = Math.sqrt(h * h - ctp * ctp);
    line = Math.sqrt(x * x + y * y)
    if (sideb - radius > line) {return false}
    return radius >= ctp && ctp >= -radius;
}
部分修正,从直线(直线末端)的一个方向不无穷大

编辑3: 稍微长一点,但快一倍多,回到原点

function lineInCircle2(sx, sy, x, y, cx, cy, radius) {
    var ysy = y - sy
    var xsx = x - sx
    var k = ((y-sy) * (cx-sx) - (x-sx) * (cy-sy)) / (ysy * ysy + xsx * xsx)
    var ncx = cx - k * (y-sy)
    var ncy = cy + k * (x-sx)
    ncx -= cx
    ncy -= cy
    var ctp = Math.sqrt(ncx * ncx + ncy * ncy)
    return radius >= ctp && ctp >= -radius;
}
编辑4: 成功

功能线内圆(sx、sy、x、y、cx、cy、半径){
如果(sx>cx+radius&&x>cx+radius | | xcy+radius&&y>cy+radius | | y=数学sqrt(ncx*ncx+ncy*ncy);
}

做了我想要的,我优化了100000000次迭代到4.5-4.6秒,与第一个版本的10+秒相比,仍然更加精确(这意味着在某些角度上不再有奇怪的行为)。我很满意:工作太多了。找到穿过中心的法线,查看交点是否比半径更近。

功能线内圆(sx、sy、x、y、cx、cy、半径){
function lineInCircle(sx, sy, x, y, cx, cy, radius) {
    if (sx > cx + radius && x > cx + radius || x < cx - radius && sx < cx - radius) {return false;}
    if (sy > cy + radius && y > cy + radius || y < cy - radius && sy < cy - radius) {return false;}
    var k = ((y - sy) * (cx - sx) - (x - sx) * (cy - sy)) / ((y - sy) * (y - sy) + (x - sx) * (x - sx))
    var ncx = k * (y - sy)
    var ncy = k * (x - sx)
    return radius >= Math.sqrt(ncx * ncx + ncy * ncy);
}
如果(sx>cx+radius&&x>cx+radius | | xcy+radius&&y>cy+radius | | y=数学sqrt(ncx*ncx+ncy*ncy); }

在我的机器上完成100000000次迭代大约需要4.5-4.6秒。

您的问题目前只包含一堆代码。这段代码背后的逻辑是什么?也许张贴一张图表会有所帮助。也许这个问题能有所帮助:我正在做一个由9个点组成的“游戏”,你知道“跳出框框思考”游戏。这是为了尝试看看你能用html5画布做些什么。“要想完成它,你必须用这四条线来覆盖所有的点。”费尔南多。是的,我读过。我不知道为什么,但我不知道该怎么办。我不能把我的头绕在它周围。你建议我怎么做?把线放在一般形式上,旋转90°,找到穿过中心的平行线的常数项,找到交点,然后计算距离。这有多快?我不确定我是否知道该怎么做。我在做的不是找到正常的吗?
function lineInCircle(sx, sy, x, y, cx, cy, radius) {
    if (sx > cx + radius && x > cx + radius || x < cx - radius && sx < cx - radius) {return false;}
    if (sy > cy + radius && y > cy + radius || y < cy - radius && sy < cy - radius) {return false;}
    var k = ((y - sy) * (cx - sx) - (x - sx) * (cy - sy)) / ((y - sy) * (y - sy) + (x - sx) * (x - sx))
    var ncx = k * (y - sy)
    var ncy = k * (x - sx)
    return radius >= Math.sqrt(ncx * ncx + ncy * ncy);
}
function lineInCircle(sx, sy, x, y, cx, cy, radius) {
    if (sx > cx + radius && x > cx + radius || x < cx - radius && sx < cx - radius) {return false;}
    if (sy > cy + radius && y > cy + radius || y < cy - radius && sy < cy - radius) {return false;}
    var k = ((y - sy) * (cx - sx) - (x - sx) * (cy - sy)) / ((y - sy) * (y - sy) + (x - sx) * (x - sx))
    var ncx = k * (y - sy)
    var ncy = k * (x - sx)
    return radius >= Math.sqrt(ncx * ncx + ncy * ncy);
}