本文整理匯總了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);
//.........這裏部分代碼省略.........