public SURFACE Get_Surface(SURFACE s0) { /* * 返回在当前线的面链中与当前面s0相邻的面,而且该面在面s0的合适位置 */ util u1 = new util(); Node <SURFACE> sn = sl.Head; PO pt;//用于记录需要检测的面上的一个点 //如果s0是sl的第一个面,则返回sl的最后一个面 if (sn.Data == s0 && sl.Head.Next != null) { pt = sl.Last.Data.GetPd(this); if (u1.noSearched(sn.Data, pt)) { return(sl.Last.Data); } } //如果s0是最后一个面,返回第一个面 if (sl.Last.Data == s0 && sl.Head != sl.Last) { pt = sl.Head.Data.GetPd(this); if (u1.noSearched(sl.Last.Data, pt)) { return(sl.Head.Data); } } //如果s0既不是第一个面也不是最后一个面 while (sn != null) { //考查s0的后一个面 if (sn.Data == s0 && sn.Next != null) { pt = sn.Next.Data.GetPd(this); if (u1.noSearched(sn.Data, pt)) { return(sn.Next.Data); } } //考查s0的前一个面 if (sn.Next != null && sn.Next.Data == s0) { pt = sn.Data.GetPd(this); if (u1.noSearched(sn.Next.Data, pt)) { return(sn.Data); } } sn = sn.Next; } //如果sl中不存在s0面 return(null); }
private void SearchD(LINE l0) { /* * 针对某个面,在模型的点链中搜索某个满足条件的点 */ pg = null; Node <PO> pt = null; soliangle1 = 0; util u1 = new util(); u1.InFile(u1.infopath, "--start SearchD--"); pt = pl.Head; while (pt != null) { soliangle2 = u1.d2_Cal_Op_Angle(l0, pt.Data); if (soliangle1 < soliangle2 && u1.noSearched(l0, pt.Data)) { soliangle1 = soliangle2; pg = pt.Data; } pt = pt.Next; } u1.InFile(u1.infopath, "--end SearchD--"); }
private void SearchD(SURFACE s0) { /* * 针对某个面,在模型的点链中搜索某个满足条件的点 */ pi = s0.p1; pj = s0.p2; pk = s0.p3; pg = null; Node <PO> pt = null; soliangle1 = 0; util u1 = new util(); info.Insert("--start SearchD--"); pt = pl.Head; while (pt != null) { soliangle2 = u1.d3_Cal_Solid_Angle(pt.Data, pi, pj, pk); if (soliangle1 < soliangle2 && u1.noSearched(s0, pt.Data)) { soliangle1 = soliangle2; pg = pt.Data; } pt = pt.Next; } info.Insert("--end SearchD--"); }
void SearchD() { util u1 = new util(); soliangle1 = 0; int i, j; float d; d = 3; pg = null; LINE l0 = nt_current.Data; Node <PO> pn; Node <PO> cn; do { Two_po_netnumberlist(l0, d); pn = net_choosed.Head; while (pn != null) { if (pn.Data.x >= 0 && pn.Data.x < Mx && pn.Data.y >= 0 && pn.Data.y < Ny) { i = (int)pn.Data.x; j = (int)pn.Data.y; cn = DataNet[i, j].Head; while (cn != null) { soliangle2 = u1.d2_Cal_Op_Angle(l0, cn.Data); if (soliangle1 < soliangle2 && u1.noSearched(l0, cn.Data)) { //u1.InFile(u1.infopath,"change it"); soliangle1 = soliangle2; pg = cn.Data; } cn = cn.Next; } } pn = pn.Next; } d += Xi; } while (d < 5 && pg == null); }
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; } }
private void Insert1() { util u1 = new util(); LINE l0 = nt_current.Data; pg.ToPrint(info); /*获取线链的头边和尾边的外端点*/ PO PLa, PFa; if (pkey.IsEqualToMe(l0.p1)) { PLa = l0.p2; } else { PLa = l0.p1; } if (pkey.IsEqualToMe(pre_l.Head.Data.p1)) { PFa = pre_l.Head.Data.p2; } else { PFa = pre_l.Head.Data.p1; } if (pg.selected) { info.Insert("po selected"); } else { info.Insert("po not selected"); } LINE lt;//获取相应边 info.Insert("t4"); #region PLa-PFa已存在 //如果PLa-PFa已存在,且尾边位于首边未搜索侧或首边两侧都搜索过 lt = Is_OutSide(PLa, PFa); if (lt != null) { info.Insert("ok"); } if (lt != null && (u1.noSearched(pre_l.Head.Data, PLa) || !pre_l.Head.Data.positive && !pre_l.Head.Data.negtive) && pkey.key != 3) { info.Insert("t1"); pkey.non_merged = false; Set_direction(pre_l.Head.Data, PLa); Set_direction(pre_l.Last.Data, PFa); Set_direction(lt, pkey); nt_current = nt_current.Next; // u1.InFile(u1.tri_num, (numbertri++).ToString() + '\t' + pkey.number + '\t' + PLa.number + '\t' + PFa.number); return; } #endregion //后面的没有PLa-PFa已存在的情况 #region pg位于其已搜索侧 if (!u1.noSearched(pre_l.Head.Data, pg) && u1.noSearched(pre_l.Head.Data, PLa) || pg == PFa) { //pg是当前边首边的外端点 info.Insert("t3"); pkey.non_merged = false; Set_direction(pre_l.Head.Data, PLa); Set_direction(l0, PFa); AddLine(PFa, PLa, pkey); nt_current = nt_current.Next; return; //u1.InFile(u1.tri_num, (numbertri++).ToString() + '\t' + pkey.number + '\t' + PLa.number + '\t' + PFa.number); } #endregion if (pg.selected) { //如果pg已经被选过 #region delete shadowpo //当前被处理的点的影子点位于pg的边链上 LINE shadow_l = Is_OutSide(pg, pkey); if (shadow_l != null) { info.Insert("shadow_pg_side"); PO shadow_po = shadow_l.getanotherpo(pg); PO shadow_po1, shadow_po2, shadow_pokey; shadow_po1 = shadow_po.ll.Head.Data.getanotherpo(shadow_po); shadow_po2 = shadow_po.ll.Last.Data.getanotherpo(shadow_po); float shadow_ang1, shadow_ang2; shadow_pokey = shadow_po1; shadow_ang1 = u1.d2_Cal_Op_Angle(PLa, shadow_po1, pkey); shadow_ang2 = u1.d2_Cal_Op_Angle(PLa, shadow_po2, pkey); if (shadow_ang2 < shadow_ang1) { shadow_pokey = shadow_po2; } lt = Is_OutSide(shadow_pokey, PLa); if (lt == null) { lt = AddLine(shadow_pokey, PLa, shadow_po); } PAINT.GetLL(lt); shadowPO(shadow_po, shadow_pokey, pkey, PLa); nt_current = pkey.ll.Last; return; } #endregion #region last's outside //如果pg是last的边链的外端点 lt = Is_OutSide(PLa, pg); if (lt != null) { info.Insert("last's outside\n"); Set_direction(pre_l.Last.Data, pg); AddLine(pkey, pg, PLa); //以上两句代码的顺序不能反,否则会出错 Set_direction(lt, pkey); nt_current = nt_current.Next; return; } #endregion last'soutside #region shadow_deal #region create shadowpo //如果pg是非特殊位置 info.Insert("arbitrary POint\n"); PO pt = new PO(pg.x, pg.y, pg.z); if (pg.shadow_pl != null) { pg.shadow_pl.Insert(pt); } else { info.Insert("add new shadow po\n"); pg.shadow_pl = new LinkList <PO>(); pg.shadow_pl.Insert(pg); pg.shadow_pl.Insert(pt); } pt.shadow_pl = pg.shadow_pl; pg = pt; //u1.InFile(u1.infopath, "here1"); AddLine(pkey, pg, PLa); // u1.InFile(u1.infopath, "here2"); AddLine(PLa, pg, pkey); //u1.InFile(u1.infopath, "here3"); Set_direction(l0, pg); // u1.InFile(u1.infopath, "here4"); //u1.InFile(u1.tri_num, (numbertri++).ToString() + '\t' + pkey.number + '\t' + PLa.number + '\t' + pg.number); work_pl.Insert(pg); //u1.InFile(u1.infopath,"here5"); pg.selected = true; nt_current = nt_current.Next; #endregion #endregion } else { #region ordinary_po info.Insert("ordinary point" + pg.number); //pg作为普通点处理 pg.number = number++; pg.selected = true; //u1.InFile(u1.node_key, pg.number.ToString() + '\t' + pg.x + '\t' + pg.y + '\t' + pg.key); AddLine(pkey, pg, PLa); AddLine(PLa, pg, pkey); Set_direction(l0, pg); //u1.InFile(u1.tri_num, (numbertri++).ToString() + '\t' + pkey.number + '\t' + PLa.number + '\t' + pg.number); if (pg.key != 3) { work_pl.Insert(pg); } //work_pl.Dispaly(); nt_current = nt_current.Next; #endregion } }