【问题标题】:Check point inside shape形状内的检查点
【发布时间】:2015-07-11 01:12:22
【问题描述】:

我正在搜索多边形算法内部或外部的点。到目前为止,我找到了一些算法(奇偶规则算法),如果我通过了多边形点,它就会成功运行。但是我在这样做时遇到了一个问题(用于计算积分)。问题是如果多边形只包含移动到数据和线到数据(例如,如果多边形是矩形或八边形等),那么我可以轻松计算绘制多边形的点。但是我有一些多边形可以使用弧线数据以及线和移动到数据来绘制。所以在这种情况下,我被困在以通用方式检查多边形内部或外部的点。

我在这里附上一些多边形图像。

您可以看到上面的图像使用直线绘制,移动到以及弧数据。所以在那种情况下我无法检查。

请告诉我如何检查此类多边形内部或外部的点?

(为了绘制多边形,我有类似的数据:

MoveTo:坐标:424.941955, 626.04046,

LineTo:坐标:428.941955、626.04046、

ArcTo:坐标:431.941955、633.04046 - 中心点:坐标:433.941955、628.04046 - 角度:-1.5707963267948966,

LineTo:坐标:431.941955、639.04046、

ArcTo:坐标:428.941955、646.04046 - 中心点:坐标:433.941955、644.04046 - 角度:-1.5707963267948966,

LineTo:坐标:424.941955、646.04046、

ArcTo:坐标:421.941955、639.04046 - 中心点:坐标:419.941955、644.04046 - 角度:-1.5707963267948966,

LineTo:坐标:421.941955、633.04046、

ArcTo:坐标:424.941955、626.04046 - 中心点:坐标:419.941955、628.04046 - 角度:-1.5707963267948966)

这是近似数据。

谢谢。

【问题讨论】:

  • 那么,到目前为止你的方法是什么?
  • 首先我计算了 line to 和 move to 的点,然后我尝试检查弧的内部还是外部。对于圆弧,我有起点角度、起点和半径。但我没有得到正确的结果。
  • (顺便说一句,这些形状不是多边形)

标签: java polygon


【解决方案1】:

您应该使用相同的算法(奇偶),但您需要对弧线(贝塞尔曲线)使用不同的相交算法。

下面是一篇博文,可以帮助您朝着正确的方向开始: https://www.particleincell.com/2013/cubic-line-intersection/

更新:

Here's关于如何进行线/圆相交的答案和问题。扩展以检查交点是否在您的度数范围内应该是相当简单的。

【讨论】:

  • 我阅读了您提到的上述算法,但它用于查找贝塞尔曲线和直线的交点。就我而言,我只有点击点和弧线。你能解释一下我该如何使用它吗?
  • 你的弧是如何定义的?
  • 在上图中你可以看到弧线。用于绘制图像。
  • 它在你的数据结构中是如何定义的?有多种描述弧的方法。你可以有一个中心点、一个半径和一个度数跨度,或者弧上的两个点,或者贝塞尔曲线,或者其他东西。你的长什么样?
  • 您可以将弧线转换为贝塞尔曲线并使用我链接的帖子,但我认为找到圆/线相交公式并使用/调整它会更容易。我已经更新了我的答案,并提供了指向此处另一个问题的链接。
【解决方案2】:

既然你征求意见,我能想到的有以下选择:

  1. 按照 Raniz 的建议去做。这是最好的。

  2. 使用直线段创建近似曲线的临时多边形,然后使用现有算法。这是次优的,但根据您的具体情况,这可能是一种务实的方法

  3. 使用不同的前景色和背景色对形状进行光栅化,然后只检查点下方像素的颜色。这是非常次优的,但如果您已经对这些形状进行了栅格化以显示它们,那么您已经具备了实现这一点所需的一切。

【讨论】:

  • 如果您有可用的图形系统,您可以创建一个单色(黑色或白色)位图,将位图绘制为全白,将多边形渲染为黑色位图,然后使用GetPixel( x, y ) on位图以查看 x、y 处的点是黑色还是白色。
  • 当然你也可以对红色多边形做同样的事情,虽然使用颜色意味着每像素更多的比特,因此需要更多的内存。我这样说是因为您发布的图片似乎是您创建的,因此您似乎已经具备将多边形渲染为位图所需的能力。
  • 我已经检查了 getPixel(x, y) 方法,但我没有得到正确的结果。如果您有任何使用上述多边形检查点内部或外部的示例代码,请分享。
  • stackoverflow 不是这样工作的。它的工作原理如下:您复制您的代码,剥离并非绝对必要的所有内容,以便到达 Short, Self Contained, Correct Example,然后将其发布在 stackoverflow.com 上的一个全新问题中,问:为什么我的 @987654323 @代码不起作用?为什么GetPixel() 对您不起作用的问题与如何查找点是否在多边形中的一般问题无关。
【解决方案3】:

您应该能够使用GeneralPath 来创建您的Shape。然后使用contains(...)方法判断形状是否包含你的点。

【讨论】:

  • 对于创建一般路径,它们是一个问题。万一线路或移动到他们是没有问题的。但是在弧的情况下,我该如何使用一般路径。即使我对创建弧的一般路径也有了一些想法,例如将弧分成段数,但这不是一个最佳解决方案,它会降低性能。
猜你喜欢
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
  • 1970-01-01
  • 2014-04-26
相关资源
最近更新 更多