/// <summary> /// Compute the Facet Normal between three vertices in space. The direction is given by rhs-rule /// v1v2 x v1v3 /// </summary> /// <param name="v1"></param> /// <param name="v2"></param> /// <param name="v3"></param> /// <returns></returns> public static Vector3 CalcFacetNormal(Vertex v1, Vertex v2, Vertex v3) { var M = new Vector3(v2.X - v1.X, v2.Y - v1.Y, v2.Z - v1.Z); var N = new Vector3(v3.X - v1.X, v3.Y - v1.Y, v3.Z - v1.Z); var normalVector = M.CrossProduct(N); normalVector.Normalize(); return normalVector; }
public static Quaternion _computeQuaternion(Vector3 direction, Vector3 upVector) { Quaternion q = new Quaternion(); Vector3 zVec = direction; zVec = zVec.NormalisedCopy; Vector3 xVec = upVector.CrossProduct(zVec); if (xVec.IsZeroLength) xVec = Vector3.UNIT_X; xVec = xVec.NormalisedCopy; Vector3 yVec = zVec.CrossProduct(xVec); yVec = yVec.NormalisedCopy; q.FromAxes(xVec, yVec, zVec); return q; }
private void planeAngleToolStripMenuItem_Click(object sender, EventArgs e) { // plane Vector3 planeDir = Vector3.UNIT_Z; TopoShape plane1 = GlobalInstance.BrepTools.MakePlaneFace(Vector3.ZERO, planeDir, -100, 100, -100, 100); { GeomSurface gs = new GeomSurface(); gs.Initialize(plane1); List<Vector3> rst = gs.D1(gs.FirstUParameter(), gs.FirstVParameter()); Vector3 dir2 = rst[1].CrossProduct(rst[2]); MessageBox.Show(dir2.ToString()); } Vector3 normal = new Vector3(0,1,1); normal.Normalize(); TopoShape plane2 = GlobalInstance.BrepTools.MakePlaneFace(Vector3.ZERO, normal, -100, 100, -100, 100); renderView.ShowGeometry(plane1, ++shapeId); renderView.ShowGeometry(plane2, ++shapeId); LineStyle style = new LineStyle(); style.SetColor(ColorValue.GREEN); // witness Vector3 end1 = new Vector3(0, 0, 100); LineNode line1 = new LineNode(); line1.Set(Vector3.ZERO, end1); line1.SetLineStyle(style); renderView.ShowSceneNode(line1); Vector3 end2 = normal * 100; LineNode line2 = new LineNode(); line2.Set(Vector3.ZERO, end2); line2.SetLineStyle(style); renderView.ShowSceneNode(line2); // angle float angle = normal.AngleBetween(planeDir); Vector3 dir = normal.CrossProduct(planeDir); dir.Normalize(); TopoShape arc = GlobalInstance.BrepTools.MakeArc(end2, end1, Vector3.ZERO, dir); SceneNode arcNode = renderView.ShowGeometry(arc, ++shapeId); arcNode.SetLineStyle(style); // text TextNode text = new TextNode(); text.SetText(angle.ToString()); Vector3 pos = end2 + end1; pos = pos * 0.5f; text.SetPosition(pos); renderView.ShowSceneNode(text); renderView.RequestDraw(); }
private void evolvedToolStripMenuItem_Click(object sender, EventArgs e) { List<Vector3> points = new List<Vector3>(); points.Add(new Vector3()); points.Add(new Vector3(200, 0, 0)); points.Add(new Vector3(200, 200, 0)); points.Add(new Vector3(0, 200, 0)); TopoShape polygon = GlobalInstance.BrepTools.MakePolygon(points); float radius = 100; TopoShape arc = GlobalInstance.BrepTools.MakeArc(Vector3.ZERO, new Vector3(-radius, -radius, 0), new Vector3(0, -radius, 0), Vector3.UNIT_Z); TopoShape line = GlobalInstance.BrepTools.MakeLine(new Vector3(-radius, -radius, 0), new Vector3(-radius, -radius * 2, 0)); TopoShapeGroup edges = new TopoShapeGroup(); edges.Add(arc); edges.Add(line); TopoShape wire = GlobalInstance.BrepTools.MakeWire(edges); Vector3 dirZ = new Vector3(1,-1,0); dirZ.Normalize(); Vector3 dirX = dirZ.CrossProduct(Vector3.UNIT_Z); Coordinate3 coord = new Coordinate3(Vector3.ZERO, dirX, Vector3.UNIT_Z, dirZ); TopoShape path = GlobalInstance.BrepTools.Transform(wire, coord); renderView.ShowGeometry(path, ++shapeId); AdvFeatureTools advFT = new AdvFeatureTools(); TopoShape shape = advFT.MakeEvolved(polygon, path, 0, true); renderView.ShowGeometry(shape, ++shapeId); }