private void Open_direction(LINE l0, PO pk) { //开启尾面的未搜索方向 Node <SURFACE> stail, stailp, sn; sn = l0.sl.Head; stail = null; stailp = null; while (sn.Next != null) { stailp = sn; stail = sn.Next; sn = sn.Next; } PO pt; pt = stailp.Data.GetPd(l0); util u1 = new util(); if (u1.Direct(stail.Data, pt) > 0) { stail.Data.negtive = true; } else { stail.Data.positive = true; } }
private void Set_direction(SURFACE s, PO p0) { /* * 根据p0与s的相互关系,决定s的某个方向上是否有效 * 设定为无效,则对应的标志为 */ util u1 = new util(); float f; f = u1.Direct(s, p0); if (f > 0) { s.positive = false; } else if (f < 0) { s.negtive = false; } }
public bool noSearched(SURFACE s, PO p0) { /* * 判断某个面的某个方向是否被搜索过, * 搜索过返回true,未搜索过返回false */ util u1 = new util(); float f; f = u1.Direct(s, p0); if (f > 0 && s.positive) { return(true); } else if (f < 0 && s.negtive) { return(true); } return(false); }
private void Insert(LINE lk) { /* * lk:某个正在被操作的边,本函数的目的是将某个生成面加到与该 * 边以工作面相连的边的面链合适的位置 */ util u1 = new util(); SURFACE Last_s, First_s;//保存l0面链尾上的面对象; Last_s = lk.sl.Last.Data; First_s = lk.sl.Head.Data; PO pi, pj, pd, pfd;//当前所处理的面的三个顶点 pi = lk.p1; pj = lk.p2; pd = Last_s.GetPd(lk); //获取面slast上除边l0外的剩余的点 pfd = lk.sl.Head.Data.GetPd(lk); //获取面链上首面除边l0外的剩余的点 LINE lk1, lk2; //取l0面链尾面除lk外的其他两条边 lk1 = Last_s.GetLine(pi, pd); lk2 = Last_s.GetLine(pj, pd); LINE l1, l2, l3; //新生成的三条边 SURFACE s, s1, s2; //新生成的三个面 if (!u1.noSearched(First_s, pg) && u1.noSearched(First_s, pd)) { pg = pfd; } if (pg.selected) { int State; State = Stateofsurface(Last_s, pg); if (State == 1 || State == 0) { info.Insert("pg与Last_s的一个定点或零个顶点共边"); #region pg与Last_s的一个定点或零个顶点共边 l1 = Get_LINE_From_One_Po(pi, pg); l2 = Get_LINE_From_One_Po(pd, pg); l3 = Get_LINE_From_One_Po(pj, pg); //生成的三条边l1,l2,l3,加入工作链中 Set_direction(Last_s, pg); s = New_SURFACE(pi, pj, pg); s.l1 = l1; s.l2 = l3; s.l3 = lk; PAINT.GetSL(s); Set_direction(s, pd); s1 = New_SURFACE(pi, pd, pg); s1.l1 = l1; s1.l2 = lk1; s1.l3 = l2; PAINT.GetSL(s1); Set_direction(s1, pj); s2 = New_SURFACE(pg, pj, pd); s2.l1 = l2; s2.l2 = l3; s2.l3 = lk2; PAINT.GetSL(s2); Set_direction(s2, pi); //将生成的面加到边的面链中 AddSurface(s, lk, Last_s); AddSurface(s, l1, Last_s);//将面加到l1的面链中去 AddSurface(s, l3, Last_s); AddSurface(s1, l1, Last_s); AddSurface(s1, lk1, Last_s); AddSurface(s1, l2, Last_s); AddSurface(s2, l3, Last_s); AddSurface(s2, lk2, Last_s); AddSurface(s2, l2, Last_s); #endregion sn_current = sn_current.Next; } else { info.Insert("pg与Last_s的两个顶点或三个顶点共边"); LINE l_shadow = Get_LINE_From_One_Po(lk, pg); if (l_shadow != null && !First_s.Belongme(pg)) { if (u1.Direct(l_shadow.sl.Head.Data, pg) * u1.Direct(l_shadow.sl.Head.Data, pd) < 0) { pg = l_shadow.sl.Head.Data.GetPd(lk); } if (u1.Direct(l_shadow.sl.Last.Data, pg) * u1.Direct(l_shadow.sl.Last.Data, pd) < 0) { pg = l_shadow.sl.Last.Data.GetPd(lk); } #region pg与Last_s的两个顶点或三个顶点共边 l1 = New_LINE(pi, pg); l2 = New_LINE(pd, pg); l3 = New_LINE(pj, pg); Set_direction(Last_s, pg); s = New_SURFACE(lk, pg); s.l1 = l1; s.l2 = l3; s.l3 = lk; Set_direction(s, pd); s1 = New_SURFACE(lk1, pg); s1.l1 = l1; s1.l2 = lk1; s1.l3 = l2; Set_direction(s1, pj); s2 = New_SURFACE(lk2, pg); s2.l1 = l2; s2.l2 = l3; s2.l3 = lk2; Set_direction(s2, pi); //将生成的面加到边的面链中 AddSurface(s, lk, Last_s); AddSurface(s, l1, Last_s);//将面加到l1的面链中去 AddSurface(s, l3, Last_s); AddSurface(s1, l1, Last_s); AddSurface(s1, lk1, Last_s); AddSurface(s1, l2, Last_s); AddSurface(s2, l3, Last_s); AddSurface(s2, lk2, Last_s); AddSurface(s2, l2, Last_s); #endregion Shadow_Delete(lk, pd, l_shadow, pg); } else { #region pg与Last_s的两个顶点或三个顶点共边 l1 = New_LINE(pi, pg); l2 = New_LINE(pd, pg); l3 = New_LINE(pj, pg); Set_direction(Last_s, pg); s = New_SURFACE(lk, pg); s.l1 = l1; s.l2 = l3; s.l3 = lk; Set_direction(s, pd); s1 = New_SURFACE(lk1, pg); s1.l1 = l1; s1.l2 = lk1; s1.l3 = l2; Set_direction(s1, pj); s2 = New_SURFACE(lk2, pg); s2.l1 = l2; s2.l2 = l3; s2.l3 = lk2; Set_direction(s2, pi); //将生成的面加到边的面链中 AddSurface(s, lk, Last_s); AddSurface(s, l1, Last_s);//将面加到l1的面链中去 AddSurface(s, l3, Last_s); AddSurface(s1, l1, Last_s); AddSurface(s1, lk1, Last_s); AddSurface(s1, l2, Last_s); AddSurface(s2, l3, Last_s); AddSurface(s2, lk2, Last_s); AddSurface(s2, l2, Last_s); #endregion sn_current = sn_current.Next; } } } else { #region pg是一个普通点 l1 = new LINE(pg, pi); l2 = new LINE(pg, pd); l3 = new LINE(pg, pj); PAINT.GetLL(l1); PAINT.GetLL(l2); PAINT.GetLL(l3); //生成的三条边l1,l2,l3,加入工作链中 pg.ll.Insert(l1); pg.ll.Insert(l2); pg.ll.Insert(l3); pi.ll.Insert(l1); pd.ll.Insert(l2); pj.ll.Insert(l3); Set_direction(Last_s, pg); s = New_SURFACE(pi, pj, pg); s.l1 = l1; s.l2 = l3; s.l3 = lk; PAINT.GetSL(s); Set_direction(s, pd); s1 = New_SURFACE(pi, pd, pg); s1.l1 = l1; s1.l2 = lk1; s1.l3 = l2; PAINT.GetSL(s1); Set_direction(s1, pj); s2 = New_SURFACE(pg, pj, pd); s2.l1 = l2; s2.l2 = l3; s2.l3 = lk2; PAINT.GetSL(s2); Set_direction(s2, pi); //将生成的面加到边的面链中 AddSurface(s, lk, Last_s); AddSurface(s, l1, Last_s);//将面加到l1的面链中去 AddSurface(s, l3, Last_s); AddSurface(s1, l1, Last_s); AddSurface(s1, lk1, Last_s); AddSurface(s1, l2, Last_s); AddSurface(s2, l3, Last_s); AddSurface(s2, lk2, Last_s); AddSurface(s2, l2, Last_s); pg.selected = true; work_pl.Insert(pg); #endregion sn_current = sn_current.Next; } }