public double GetArea() { double[] co1 = World.GetVertexCoord(VertexCoordIds[0]); double[] co2 = World.GetVertexCoord(VertexCoordIds[1]); double[] co3 = World.GetVertexCoord(VertexCoordIds[2]); OpenTK.Vector2d v1 = new OpenTK.Vector2d(co1[0], co1[1]); OpenTK.Vector2d v2 = new OpenTK.Vector2d(co2[0], co2[1]); OpenTK.Vector2d v3 = new OpenTK.Vector2d(co3[0], co3[1]); double area = CadUtils.TriArea(v1, v2, v3); return(area); }
public void CalcTransMatrix(out double[] a, out double[] b, out double[] c) { a = new double[3]; b = new double[3]; c = new double[3]; double[] co1 = World.GetVertexCoord(VertexCoordIds[0]); double[] co2 = World.GetVertexCoord(VertexCoordIds[1]); double[] co3 = World.GetVertexCoord(VertexCoordIds[2]); OpenTK.Vector2d v1 = new OpenTK.Vector2d(co1[0], co1[1]); OpenTK.Vector2d v2 = new OpenTK.Vector2d(co2[0], co2[1]); OpenTK.Vector2d v3 = new OpenTK.Vector2d(co3[0], co3[1]); double A = CadUtils.TriArea(v1, v2, v3); OpenTK.Vector2d[] v = { v1, v2, v3 }; for (int k = 0; k < 3; k++) { int l = (k + 1) % 3; int m = (k + 2) % 3; a[k] = (1.0 / (2.0 * A)) * (v[l].X * v[m].Y - v[m].X * v[l].Y); b[k] = (1.0 / (2.0 * A)) * (v[l].Y - v[m].Y); c[k] = (1.0 / (2.0 * A)) * (v[m].X - v[l].X); } }
public bool DragArc(uint eId, OpenTK.Vector2d vec) { if (!IsElementId(CadElementType.Edge, eId)) { return(false); } if (GetEdgeCurveType(eId) != CurveType.CurveArc) { return(true); } bool oldIsLeftSide; double oldDist; { Edge2D e = GetEdge(eId); e.GetCurveArc(out oldIsLeftSide, out oldDist); } Edge2D edge = GetEdge(eId); System.Diagnostics.Debug.Assert(edge.CurveType == CurveType.CurveArc); { OpenTK.Vector2d sPt = edge.GetVertex(true); OpenTK.Vector2d ePt = edge.GetVertex(false); double edgeLen = Math.Sqrt(CadUtils.SquareLength(sPt, ePt)); if (Math.Abs(CadUtils.TriHeight(vec, sPt, ePt)) > edgeLen * 0.02) { OpenTK.Vector2d cPt; bool ret = CadUtils.CenterCircumcircle(sPt, ePt, vec, out cPt); System.Diagnostics.Debug.Assert(ret); double dist = CadUtils.TriHeight(cPt, sPt, ePt); double distRatio = dist / edgeLen; edge.SetCurveArc(CadUtils.TriArea(sPt, ePt, vec) > 0, distRatio); } else { return(true); } } HashSet <uint> setLId = new HashSet <uint>(); for (VertexEdgeItr vItr = this.BRep.GetVertexEdgeItr(edge.GetVertexId(true)); !vItr.IsEnd(); vItr++) { uint tmpLId = vItr.GetLoopId(); if (!setLId.Contains(tmpLId)) { setLId.Add(tmpLId); } } for (VertexEdgeItr vItr = this.BRep.GetVertexEdgeItr(edge.GetVertexId(false)); !vItr.IsEnd(); vItr++) { uint tmpLId = vItr.GetLoopId(); if (!setLId.Contains(tmpLId)) { setLId.Add(tmpLId); } } foreach (uint lId in setLId) { if (!this.BRep.IsElementId(CadElementType.Loop, lId)) { continue; } if (CheckLoop(lId) != 0) { // fail edge.SetCurveArc(oldIsLeftSide, oldDist); return(true); } } return(true); }