public void AddEdge(EdgeAmf edge) { if (edgeList == null) { edgeList = new List <EdgeAmf>(); } edgeList.Add(edge); }
int FindCenterPoint(int v1, int v2) { EdgeAmf edge = m_pointList[v1].FindEdge(v2); if (edge == null) { edge = m_pointList[v2].FindEdge(v1); } if (edge != null) { return(edge.v12); } return(-1); }
// get a tanget of an egde, at point v Vector3d GetTanget(int v, int v1) { EdgeAmf edge = m_pointList[v].FindEdge(v1); if (edge != null) { return(edge.t1); } edge = m_pointList[v1].FindEdge(v); if (edge != null) { return(Vector3d.negate(edge.t2)); } Point3d pt1 = m_pointList[v].pt; Point3d pt2 = m_pointList[v1].pt; return(new Vector3d(pt2.x - pt1.x, pt2.y - pt1.y, pt2.z - pt1.z)); }
void ParseEdge(XmlNode xEdge) { EdgeAmf edge = new EdgeAmf(); edge.v1 = int.Parse(xEdge["v1"].InnerText); float x = float.Parse(xEdge["dx1"].InnerText); // *m_scaleFactor; float y = float.Parse(xEdge["dy1"].InnerText); // *m_scaleFactor; float z = float.Parse(xEdge["dz1"].InnerText); // *m_scaleFactor; edge.t1 = new Vector3d(x, y, z); edge.t1.Normalize(); edge.v2 = int.Parse(xEdge["v2"].InnerText); x = float.Parse(xEdge["dx2"].InnerText); // *m_scaleFactor; y = float.Parse(xEdge["dy2"].InnerText); // *m_scaleFactor; z = float.Parse(xEdge["dz2"].InnerText); // *m_scaleFactor; edge.t2 = new Vector3d(x, y, z); edge.t2.Normalize(); edge.initialEdge = true; m_edgeList.Add(edge); m_smoothObj = true; }
// split edge v1-v2. v3 is the last corner in the triangle and is used for computing normals int SplitEdge(int v1, int v2, Vector3d norm1, Vector3d norm2, out Vector3d norm12) { EdgeAmf edge = m_pointList[v1].FindEdge(v2); if (edge == null) { edge = m_pointList[v2].FindEdge(v1); if (edge != null) { // swap verteces to match edge int tv = v1; v1 = v2; v2 = tv; Vector3d tnorm = norm1; norm1 = norm2; norm2 = tnorm; } } Vector3d t1, t2; PointAmf pamf1 = m_pointList[v1]; PointAmf pamf2 = m_pointList[v2]; Point3d pt1 = pamf1.pt; Point3d pt2 = pamf2.pt; PointAmf pamf; float x, y, z; // calculate edge vector x = pt2.x - pt1.x; y = pt2.y - pt1.y; z = pt2.z - pt1.z; Vector3d edgeDir = new Vector3d(x, y, z); // first see if we have an edge for this segment if (edge != null) { // if this edge was already split, return result if (edge.v12 >= 0) { norm12 = CalcCenterNormal(norm1, norm2, edge.t12); return(edge.v12); } t1 = edge.t1; t2 = edge.t2; } else { t1 = GetTangetFromNormal(norm1, edgeDir); t2 = GetTangetFromNormal(norm2, edgeDir); } float d = edgeDir.Mag(); // calculate mid point using Hermite interpolation x = 0.5f * pt1.x + 0.125f * t1.x * d + 0.5f * pt2.x - 0.125f * t2.x * d; y = 0.5f * pt1.y + 0.125f * t1.y * d + 0.5f * pt2.y - 0.125f * t2.y * d; z = 0.5f * pt1.z + 0.125f * t1.z * d + 0.5f * pt2.z - 0.125f * t2.z * d; pamf = new PointAmf(); pamf.pt = new Point3d(x, y, z); int v = m_pointList.Count; m_pointList.Add(pamf); // calculate new tanget and new normal x = -1.5f * pt1.x - 0.25f * t1.x * d + 1.5f * pt2.x - 0.25f * t2.x * d; y = -1.5f * pt1.y - 0.25f * t1.y * d + 1.5f * pt2.y - 0.25f * t2.y * d; z = -1.5f * pt1.z - 0.25f * t1.z * d + 1.5f * pt2.z - 0.25f * t2.z * d; Vector3d tanget = new Vector3d(x, y, z); tanget.Normalize(); norm12 = CalcCenterNormal(norm1, norm2, tanget); if (edge == null) { //pamf.normal = GetNormalFromTanget(norm1, tanget); // create an edge for this segment edge = new EdgeAmf(); edge.v1 = v1; edge.v2 = v2; edge.t1 = t1; edge.t2 = t2; pamf1.AddEdge(edge); } edge.t12 = tanget; edge.v12 = m_pointList.Count - 1; // saves double computation //tanget.Normalize(); // save 2 split edges EdgeAmf edge1 = new EdgeAmf(); edge1.v1 = v1; edge1.v2 = v; edge1.t1 = t1; edge1.t2 = tanget; pamf1.AddEdge(edge1); EdgeAmf edge2 = new EdgeAmf(); edge2.v1 = v; edge2.v2 = v2; edge2.t1 = tanget; edge2.t2 = t2; pamf.AddEdge(edge2); return(v); }
// split edge v1-v2. v3 is the last corner in the triangle and is used for computing normals int SplitEdge(int v1, int v2, Vector3d norm1, Vector3d norm2, out Vector3d norm12) { EdgeAmf edge = m_pointList[v1].FindEdge(v2); if (edge == null) { edge = m_pointList[v2].FindEdge(v1); if (edge != null) { // swap verteces to match edge int tv = v1; v1 = v2; v2 = tv; Vector3d tnorm = norm1; norm1 = norm2; norm2 = tnorm; } } Vector3d t1, t2; PointAmf pamf1 = m_pointList[v1]; PointAmf pamf2 = m_pointList[v2]; Point3d pt1 = pamf1.pt; Point3d pt2 = pamf2.pt; PointAmf pamf; float x, y, z; // calculate edge vector x = pt2.x - pt1.x; y = pt2.y - pt1.y; z = pt2.z - pt1.z; Vector3d edgeDir = new Vector3d(x, y, z); // first see if we have an edge for this segment if (edge != null) { // if this edge was already split, return result if (edge.v12 >= 0) { norm12 = CalcCenterNormal(norm1, norm2, edge.t12); return edge.v12; } t1 = edge.t1; t2 = edge.t2; } else { t1 = GetTangetFromNormal(norm1, edgeDir); t2 = GetTangetFromNormal(norm2, edgeDir); } float d = edgeDir.Mag(); // calculate mid point using Hermite interpolation x = 0.5f * pt1.x + 0.125f * t1.x * d + 0.5f * pt2.x - 0.125f * t2.x * d; y = 0.5f * pt1.y + 0.125f * t1.y * d + 0.5f * pt2.y - 0.125f * t2.y * d; z = 0.5f * pt1.z + 0.125f * t1.z * d + 0.5f * pt2.z - 0.125f * t2.z * d; pamf = new PointAmf(); pamf.pt = new Point3d(x, y, z); int v = m_pointList.Count; m_pointList.Add(pamf); // calculate new tanget and new normal x = -1.5f * pt1.x - 0.25f * t1.x * d + 1.5f * pt2.x - 0.25f * t2.x * d; y = -1.5f * pt1.y - 0.25f * t1.y * d + 1.5f * pt2.y - 0.25f * t2.y * d; z = -1.5f * pt1.z - 0.25f * t1.z * d + 1.5f * pt2.z - 0.25f * t2.z * d; Vector3d tanget = new Vector3d(x, y, z); tanget.Normalize(); norm12 = CalcCenterNormal(norm1, norm2, tanget); if (edge == null) { //pamf.normal = GetNormalFromTanget(norm1, tanget); // create an edge for this segment edge = new EdgeAmf(); edge.v1 = v1; edge.v2 = v2; edge.t1 = t1; edge.t2 = t2; pamf1.AddEdge(edge); } edge.t12 = tanget; edge.v12 = m_pointList.Count - 1; // saves double computation //tanget.Normalize(); // save 2 split edges EdgeAmf edge1 = new EdgeAmf(); edge1.v1 = v1; edge1.v2 = v; edge1.t1 = t1; edge1.t2 = tanget; pamf1.AddEdge(edge1); EdgeAmf edge2 = new EdgeAmf(); edge2.v1 = v; edge2.v2 = v2; edge2.t1 = tanget; edge2.t2 = t2; pamf.AddEdge(edge2); return v; }
public void AddEdge(EdgeAmf edge) { if (edgeList == null) edgeList = new List<EdgeAmf>(); edgeList.Add(edge); }