当前位置: 首页>>代码示例>>C#>>正文


C# List.Cast方法代码示例

本文整理汇总了C#中WpfApplication1.List.Cast方法的典型用法代码示例。如果您正苦于以下问题:C# List.Cast方法的具体用法?C# List.Cast怎么用?C# List.Cast使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在WpfApplication1.List的用法示例。


在下文中一共展示了List.Cast方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。

示例1: Cut

        // 传入的多边形的点需要封闭,即首尾点要相同
        public static List<List<VertexBase>> Cut(List<VertexBase> listS, List<VertexBase> listC)
        {
            //如果是浮点数,使用这个处理保证相等比较正确
            PrepareVertex(listS);
            PrepareVertex(listC);

            int cutStartIdx = 0;//实际切割由这个idx起始即可

            // 阶段1: 这个循环中的切割用于判断方向
            // 如果这步中没有发现交点,则进入不相交多边形的处理
            for (; cutStartIdx < listS.Count; cutStartIdx++)
            {
                //用实体多边形的一条边去切切割多边形
                var s1 = listS[cutStartIdx % listS.Count];
                var s2 = listS[(cutStartIdx + 1) % listS.Count];

                Tuple<CrossInOut, int, bool> ret;
                if (s1.X == s2.X)
                    ret = CutByLineVerticalForCrossDi(s1, s2, listC, false);
                else
                    ret = CutByLineForCrossDi(s1, s2, listC, false);
                //如果没有交点,继续下一条边。
                if (!ret.Item3) continue;

                var interDirect1 = ret.Item1;//交点对于切割多边形的进出性
                var cutLineIdx = ret.Item2;//交点所在的切割多边形的边的起点的索引,用于在使用切割多边形边去切实体多边形时,确定那条边

                WindowLog.Default.Log("得到S多边形边{0}{1}切割C多边形{2}{3}产生的交点,对于S进出性为{4}", s1.Name, s2.Name,
                    listC[cutLineIdx % listC.Count].Name,
                    listC[(cutLineIdx + 1) % listC.Count].Name,
                    interDirect1 == CrossInOut.In ? "进" : "出");

                //用切割多边形的一条边(cutLineIdx->cutLineIdx+1)去切实体多边形
                var ret2 = CutByLineForCrossDi(listC[cutLineIdx % listC.Count],
                                               listC[(cutLineIdx + 1) % listC.Count],
                                               listS, true, cutStartIdx);
                var interDirect2 = ret2.Item1;

                WindowLog.Default.Log("得到C多边形边{0}{1}切割S多边形{2}{3}产生的交点,对于C进出性为{4}",
                  listC[cutLineIdx % listC.Count].Name,
                  listC[(cutLineIdx + 1) % listC.Count].Name,
                  s1.Name, s2.Name,
                  interDirect2 == CrossInOut.In ? "进" : "出");

                if (interDirect1 == interDirect2) //进出性相同表示多边形不同向,反转其中一个多边形
                {
                    WindowLog.Default.Log("交点进出性相同,把C多边形反向");
                    //文档中是把S进行了反向,但这里不行,如果反向S,则记录的第一个交点(主要是记录这个交点的进出性)就不再是第一个交点了
                    //所以实际实现中需要将C反向,而且反向后第一条边,仍然需要是确定第一点那条线段
                    var listCReverse = new List<VertexBase>();
                    var reverseStartIdx = cutLineIdx + 1;
                    for (int i = 0; i < listC.Count; i++)
                    {
                        listCReverse.Add(listC[(reverseStartIdx - i + listC.Count) % listC.Count]);
                    }

                    listC = listCReverse;

                    WindowLog.Default.ReversePolygon();
                    WindowLog.Default.Log("反向后多边形点序列为:{0}", string.Join("->", listC.Select(r => r.Name)));
                }

                WindowLog.Default.Log("使用S多边形边{0}{1}与C多边形{2}{3}交点为第一个点,对于S进出性为{4}", s1.Name, s2.Name,
                        listC[cutLineIdx % listC.Count].Name,
                        listC[(cutLineIdx + 1) % listC.Count].Name,
                        interDirect1 == CrossInOut.In ? "进" : "出");

                _firstInterDi = ret.Item1;
                break;
            }

            if (cutStartIdx == listS.Count)//没有交点
            {
                WindowLog.Default.Log("没有交点,进入无交点情况处理");

                var ret = ProcessNoCross(listS, listC);
                return ret == null ? new List<List<VertexBase>>() : new List<List<VertexBase>> { ret };
            }

            // 阶段2: 链接多边形,即设置Next
            LinkNode(listS.Cast<Vertex>().ToList());
            LinkNode(listC.Cast<Vertex>().ToList());
            var listI = new List<Intersection>();
            var linkC = new LinkedList<VertexBase>(listC);

            //循环中用S中每条边切割C(准确说是C的链表,每次切割后交点插入C的列表再进行下次切割),把交点插入S和C形成多边形链表
            for (; cutStartIdx < listS.Count; cutStartIdx++)
            {
                var s1 = listS[cutStartIdx % listS.Count] as Vertex;
                var s2 = listS[(cutStartIdx + 1) % listS.Count] as Vertex;

                WindowLog.Default.Log("---------------使用S多边形边{0}{1}切割C多边形---------------", s1.Name, s2.Name);

                var inters = CutByLine(s1, s2, linkC);
                //var inters = ret;

                if (inters.Count == 0) continue;

                listI.AddRange(inters);
//.........这里部分代码省略.........
开发者ID:woniuchn,项目名称:blog_sample_codes,代码行数:101,代码来源:ArbitraryPolygonCut.cs


注:本文中的WpfApplication1.List.Cast方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。