public float Direct(SURFACE s0, PO p0) { util u1 = new util(); PO p1, p2, p3, vec1, vec2, vec, vecx; p1 = s0.p1; p2 = s0.p2; p3 = s0.p3; vec1 = new PO(); vec2 = new PO(); vec = new PO(); vecx = new PO(); cal_vec(p1, p2, vec1); cal_vec(p1, p3, vec2); //u1.InFile("e:/info.txt","---start Direct---"); //vec1.ToPrint(); //vec2.ToPrint(); cal_vecdot(vec1, vec2, vec);//计算向量积 //vec.ToPrint(); cal_vec(p1, p0, vecx); //vecx.ToPrint(); //u1.InFile("e:/info.txt", "---end Direct---"); if (System.Math.Abs(Dot(vec, vecx)) > 0.0001) { return(Dot(vec, vecx)); } else { return(0); } }
private void AddSurface(SURFACE s, LINE lk, SURFACE cur_s) { /* * 根据s与lk的面链的头尾的面的关系来确定s应该放在面链的头还是尾 * 如果该边已经封闭则返回true,否则返回false */ util u1 = new util(); SURFACE Last_s; if (lk.sl.Head == null) { lk.sl.Insert(s); } else { if (Surface_belong_line(lk, s)) { return; } Last_s = lk.sl.Last.Data;//获取面链尾部的面 if (cur_s.id == Last_s.id) { lk.sl.Insert(s); } else { lk.sl.Head_Insert(s); } } }
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--"); }
private SURFACE New_SURFACE(PO p1, PO p2, PO p3) { SURFACE s0 = new SURFACE(p1, p2, p3); s0.id = sid++; return(s0); }
private void Output(SURFACE s0) { info.Insert("------surface-------"); info.Insert("po:" + '(' + s0.p1.x + ',' + s0.p1.y + ',' + s0.p1.z + ')'); info.Insert("po:" + '(' + s0.p2.x + ',' + s0.p2.y + ',' + s0.p2.z + ')'); info.Insert("po:" + '(' + s0.p3.x + ',' + s0.p3.y + ',' + s0.p3.z + ')'); info.Insert("------surface end-------"); }
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 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 int Stateofsurface(SURFACE s0, PO po) { /* * 分析po与s0的关系, * 如果po与s0的一个点共边,返回1;两个点共边,返回2;三个点共边,返回3 */ int num_coin_po = 0; if (OutSideofpo(s0.p1, po) != null) { num_coin_po++; } if (OutSideofpo(s0.p2, po) != null) { num_coin_po++; } if (OutSideofpo(s0.p3, po) != null) { num_coin_po++; } return(num_coin_po); }
private bool Surface_belong_line(LINE l0, SURFACE s0) { /* * 判断s0是否已经存在于l0的面链上 * 是,返回true;否,返回false; */ Node <SURFACE> sn = l0.sl.Head; if (l0.shadow_ll != null) { Node <LINE> ln = l0.shadow_ll.Head; while (ln != null) { sn = ln.Data.sl.Head; while (sn != null) { if (sn.Data.id == s0.id) { return(true); } sn = sn.Next; } ln = ln.Next; } } else { while (sn != null) { if (sn.Data.id == s0.id) { return(true); } sn = sn.Next; } } return(false); }
public void GetSL(SURFACE s0) { sl.Insert(s0); return; }