我有一个关于在c#中循环的一般问题,尤其是在使用列表时.
我想实现一个简单的多边形耳朵切片算法.
这是算法:
(来源:http://www.diva-portal.org/smash/get/diva2:330344/FULLTEXT02
,第6页)
我已经实现了找到耳塞的方法.但是存在一个问题,我必须访问列表的i-1或什至i-2元素.我的解决方法是在列表顶部添加最后一个元素,在列表末尾添加第一个元素.
但是当涉及到下一步时,我必须从多边形中删除一些点以进一步深入算法,这种方法根本不好.所以问题是当我在开始处工作时尝试访问多边形末端的元素时=)我希望这是有道理的.
这是一个代码段,所以您知道我在说什么:
// suppose that i = 0 at the first step and polygonPoints is List<Vector>
Vector pi = new Vector(polygonPoints[i - 1]);
Vector pj = new Vector(polygonPoints[i]);
Vector pk = new Vector(polygonPoints[i + 1]);
// create line between i-1 and i+1
Line diagonal = new Line(pi,pk);
我将不胜感激.
提前致谢.
解决方法:
我希望我正确理解了这个问题:您的问题是要在节点列表的末尾计算邻居索引,对吗?
如果是这样,为什么不使用一个简单的模函数来计算指数呢?
int mod(int k, int x)
{
return ((k % x) + x) % x;
}
//...
polygonPoints[mod(i + n, polygonPoints.length)]
其中n是您的偏移量.
这意味着对于具有10个元素的多边形点列表,i = 9和n = 1表示:
mod((9 + 1), 10) = 0
特别是,索引9处节点的下一个邻居位于索引0处.
对于i = 0和n = -1:
mod((0 - 1), 10) = 9
这意味着索引0处的节点的前一个节点在索引位置9.