确定多边形背面的算法

时间:2019-04-25 18:43:20

标签: c#

在2D场景中,给定多边形和源点,如何确定多边形的背面或背离源点的侧面?

编辑:在示例图片中,圆圈表示视觉(或光源)源点。多边形可以有任意多个边。我正在寻找示例代码来识别多边形中与源点相对的边。

Example picture

更新:我在“查找边界点”部分下浏览了该页面,该页面描述了我想做的事情,但仍未提供示例代码。 Dynamic 2D Soft Shadows

1 个答案:

答案 0 :(得分:3)

这个问题非常令人困惑。在您的示例中,您有一个凹多边形,但是您链接到仅在凸多边形上解决问题的页面。您说您不知道要使用哪种算法,但是链接到的页面给出了该算法:

For every edge:
  Find normal for edge
  Classify edge as front facing or back facing
  Determine if either edge points are boundary points or not.

您说停留的步骤是“将边缘分类为正面还是背面”,但是一旦知道法线和观察者点,就知道边缘是正面还是背面!链接到的页面显示:

  使用该矢量和该矢量对光进行点积。如果该值大于零,则边缘为正面。

也就是说,如果法线指向观察者 ,那么它是面向观察者;这就是我们定义“面向”的方式。

这个问题令人困惑,您实际编写一些代码,然后向我们展示您编写了什么代码,将会大大受益。显然,您被困在某个地方,但是我们很难说出您被困在哪里或如何解困。

我的建议是,从您所知道的开始,即算法:

For every edge:
  Find normal for edge
  Classify edge as front facing or back facing
  Determine if either edge points are boundary points or not.

现在,将该单词转换为C#:

foreach(Edge edge in myPolygon.Edges()) 
{
  var normal = GetNormalOfEdge(edge);
  var classification = Classify(normal, observer);
  var eitherBoundary = IsBoundary(edge.Start) || IsBoundary(edge.End);
}

现在开始填写详细信息:那些当地人的类型是什么?这些辅助方法的类型签名是什么?您可以实现哪些辅助方法?你坚持在哪一个?等等。

请记住,如果您有一个概念,请键入一个代表它的类型。没有类型来表示分类吗?发明一个。现在,您已经有了一个有用的工具,可以使您解决更难的问题。如果您有一个操作,请创建一个表示它的方法,然后再次获得一个可以构建的工具。缓慢而有条理地工作,建立有用的类型和方法的库。独立测试它们,使您知道它们的可靠性。