Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.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 查找位于填充画布圆弧内的x/y坐标_Javascript_Canvas_Trigonometry_Html5 Canvas - Fatal编程技术网

Javascript 查找位于填充画布圆弧内的x/y坐标

Javascript 查找位于填充画布圆弧内的x/y坐标,javascript,canvas,trigonometry,html5-canvas,Javascript,Canvas,Trigonometry,Html5 Canvas,这是你的电话号码 我在圆外部绘制的圆弧-我想知道如何找到它们覆盖的所有x/y坐标,这样我就不必每次都使用isPointInPath()重新绘制它们来确定鼠标光标是否在它们上面。我正在考虑将所有的x/y坐标写入一个数组,我可以对照鼠标位置的x/y坐标进行检查,如果我找到了匹配的x/y坐标,我就改变光标。问题是,我不知道推导所有x/y值的代码。这是您应该使用的方法: 其工作方式实际上非常简单:如果在任何点结束的光线通过多边形周长的次数是偶数,则相应的点必须位于多边形外部。如果它是奇数,它在多边形

这是你的电话号码


我在圆外部绘制的圆弧-我想知道如何找到它们覆盖的所有x/y坐标,这样我就不必每次都使用isPointInPath()重新绘制它们来确定鼠标光标是否在它们上面。我正在考虑将所有的x/y坐标写入一个数组,我可以对照鼠标位置的x/y坐标进行检查,如果我找到了匹配的x/y坐标,我就改变光标。问题是,我不知道推导所有x/y值的代码。

这是您应该使用的方法:

其工作方式实际上非常简单:如果在任何点结束的光线通过多边形周长的次数是偶数,则相应的点必须位于多边形外部。如果它是奇数,它在多边形内

以下是Pimvdb发现的一个函数:

function isPointInPoly(poly, pt){
    for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i)
        ((poly[i].y <= pt.y && pt.y < poly[j].y) || (poly[j].y <= pt.y && pt.y < poly[i].y))
        && (pt.x < (poly[j].x - poly[i].x) * (pt.y - poly[i].y) / (poly[j].y - poly[i].y) + poly[i].x)
        && (c = !c);
    return c;
}
函数isPointInPoly(poly,pt){
对于(var c=false,i=-1,l=poly.length,j=l-1;++i((poly[i].y我不会称之为“弧”(它们更像是弯曲的矩形),但下面是如何编写函数以确定点是否在这样的东西内的大致示意图:

  • 从端点和半径计算圆心。
  • 如果该点比闭合弧更靠近中心(到中心的距离平方大于闭合半径平方),则返回false
  • 如果该点距离中心的距离大于远弧的距离,则返回false
  • 计算矩形端点相对于圆心的起点和终点角度。(提示:)
  • 计算点相对于圆心的角度。如果该角度不在端点的角度之间,则返回false。
    • 注意跨越
      Math.atan2
      包装值的端点
  • 如果其他测试通过,则返回true
  • 您无法计算此区域中的“所有”点,因为它们的数量是无限的。创建图像中所有整数像素坐标的查找表是可能的,但会造成浪费


    我要做的,而不是你所建议的,是使用一个保留模式图形系统(提示:SVG),让它使用更高效的代码为我跟踪鼠标事件。

    这里有一个更简单的方法:

    我修改了drawtabs功能,以检查鼠标是否位于选项卡内:

    警告


    此方法很简单,但需要您在mousemove上重新绘制
    所有内容。

    使用
    .isPointInPath()
    ——只需省略对
    .fill()
    .stroke()
    的任何调用,您就可以使用一个路径来测试它是否包含点


    我建议使用一个函数来概括弧路径(
    .beginPath()
    ,路径命令,
    .closePath()
    )然后是两个调用它的函数——一个调用arc path函数,然后设置填充样式并填充路径来绘制它,另一个调用arc path函数,然后只测试路径中是否有点。

    你推荐该页面上的哪种算法?好的,我看到我需要传递一个x/y coor数组dinates和我想测试的x/y坐标在我的多边形中。我仍然困惑的是如何获得/计算要传递给isPointInPoly的x/y坐标数组。获得鼠标x/y位置很简单,但计算我的圆弧所覆盖的x/y的三角学让我很困惑。@jarnauss:再想想,我认为我发布的k可能没有多大帮助,因为它是关于直线而不是圆弧的。如果你想使用它,你可以使用角点,但这将是圆弧的近似值…是的,我正在搜索一个“isPointInArc”解决方案。谷歌目前的前景很黯淡。这两种方法都可以,每个多边形都是用p构建的点和线(甚至是圆)。只要你提供这些点,拱门就会被正确地画出来。你知道,你实际上不必重新画弧来使用
    。isPointInPath()
    --省略对
    .fill()
    .stroke()的任何调用
    您将有一个路径,可以用来测试它是否包含一个点。@ellisbben您应该将其作为答案发布!:)嗯,我想知道为什么我没有考虑这个问题。让我试一试。“艾利森-谢谢你的建议。这真的很有效,因为我的瓶颈是在画布上不断地重新渲染几个项目。如果你想把你的评论添加到答案中,我很乐意接受它。完成了。我很高兴当人们发现一个好的答案藏起来。.:)这就是我最后要做的。我将一个标志传递到函数中,它决定我是否真的绘制了任何东西。