C# i-1时如何处理循环

C# i-1时如何处理循环,c#,list,loops,polygon,triangulation,C#,List,Loops,Polygon,Triangulation,我对c#中的循环有一个一般性的问题,特别是在使用列表时 我想实现一个简单的多边形耳朵切片算法。 以下是算法: (来源: ,第6页) 我已经开始寻找耳尖了。但问题是,我必须访问列表中的I-1或有时甚至I-2元素。我的工作是在列表顶部添加最后一个元素,在列表末尾添加第一个元素 但是,当进入下一步时,当我必须从多边形中删除一些点以进一步通过算法时,这种方法一点也不好。所以问题是当我在开始工作时尝试访问多边形末端的元素=)我希望这是有意义的 这里有一个片段,让你知道我在说什么: // suppose

我对c#中的循环有一个一般性的问题,特别是在使用列表时

我想实现一个简单的多边形耳朵切片算法。 以下是算法:

(来源: ,第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);
//假设第一步i=0,polygonPoints是List
向量pi=新向量(多边形点[i-1]);
向量pj=新向量(多边形点[i]);
向量pk=新向量(多克隆点[i+1]);
//在i-1和i+1之间创建线
对角线=新线(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

您还可以在集合上创建一个。 然后可以定义用于处理越界索引的

这样,您不必一直调用
mod
,它将在索引器中处理。您必须有一个支持索引或
IndexOf
的集合,例如
List

使用系统;
使用系统集合;
使用System.Collections.Generic;
班级计划
{
私有静态void Main(字符串[]args)
{
var list=新列表{1,2,3,4,5};
var decoratedList=新的超索引ListDecorator(列表);
WriteLine(“-1st元素为:{0}”,decoratedList[-1]);
WriteLine(“索引3处的元素为:{0}”,decoratedList[3]);
WriteLine(“第6个元素是:{0}”,decoratedList[6]);
Console.ReadKey();
}
}
类OverindexableListDecorator:IList
{
私有只读IList存储;
公共超索引列表装饰器(IList CollectionToRap)
{
this.store=collectionToWrap;
}
公共T此[int索引]
{
得到
{
int ACTIVENDEX=索引模块计数(索引);
返回存储[实现索引];
}
设置
{
int ACTIVENDEX=索引模块计数(索引);
存储[实现索引]=值;
}
}
公共无效删除(整数索引)
{
var现实指数=指数Modulocount(指数);
存储.删除(索引);
}
公共空白插入(整数索引,T项)
{
var现实指数=指数Modulocount(指数);
存储。插入(实施索引,项目);
}
私有int IndexModuloCount(int i)
{
int count=this.count;
返回((i%count)+count)%count;
}
#区域代理调用
公共IEnumerator GetEnumerator()
{
返回store.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}
公共作废新增(T项)
{
存储。添加(项);
}
公共空间清除()
{
store.Clear();
}
公共布尔包含(T项)
{
退货存储。包含(项目);
}
public void CopyTo(T[]数组,int arrayIndex)
{
CopyTo(数组,arrayIndex);
}
公共布尔删除(T项)
{
返回存储。移除(项目);
}
公共整数计数
{
获取{return store.Count;}
}
公共图书馆是只读的
{
获取{return store.IsReadOnly;}
}
公共整数索引(T项)
{
退货存储索引(项目);
}
#端区
}    

这看起来不错。刚刚在matlab中进行了测试,效果很好。以前从没听说过,因为我不是IT公司的。更多来自工程部门。谢谢alot@RufusL:nope
(0-1)%10=9
-也许您在验证答案时忘记了大括号…我这样做了:
控制台。WriteLine((0-1)%10)并获得
-1
。我错过了什么?在matlab中我得到:I=0,n=-1->mod((I+n),10)=9。但你是对的。在c#中,我得到-1图阿,对不起,我遵循了数学解释,而c#处理负片的方式不同。我会修复它…这也是一个很好的答案,但我会继续使用mod,因为我使用的多边形永远不会超过20个顶点。但是谢谢!这个逻辑确实是一样的,但我认为这样做更容易。