public bool SmoothingPolylineEdge(uint eId, uint nIter, OpenTK.Vector2d pos, double radius) { if (!this.IsElementId(CadElementType.Edge, eId)) { return(false); } if (GetEdgeCurveType(eId) != CurveType.CurvePolyline) { return(true); } if (nIter == 0) { return(true); } Edge2D edge = GetEdge(eId); IList <double> axys = edge.GetCurveRelPoint(); System.Diagnostics.Debug.Assert(axys.Count % 2 == 0); uint nno = (uint)axys.Count / 2; IList <uint> aIndNo = new List <uint>(); if (radius > 0) { uint[] tmp = new uint[nno]; for (int i = 0; i < nno; i++) { if (i < aIndNo.Count) { tmp[i] = aIndNo[i]; } else { tmp[i] = 0; } } aIndNo.Clear(); aIndNo = tmp.ToList(); OpenTK.Vector2d sPt = edge.GetVertex(true); OpenTK.Vector2d ePt = edge.GetVertex(false); var v0 = ePt - sPt; OpenTK.Vector2d v1 = new OpenTK.Vector2d(-v0.Y, v0.X); for (int ino = 0; ino < nno; ino++) { var p = sPt + v0 * axys[ino * 2 + 0] + v1 * axys[ino * 2 + 1]; if (CadUtils.SquareLength(p - pos) < radius * radius) { aIndNo.Add((uint)ino); } } } else { aIndNo = new List <uint>(); for (int ino = 0; ino < nno; ino++) { aIndNo[ino] = (uint)ino; } } // strength of smoothing(0から1) double w = 0.8; for (uint iiter = 0; iiter < nIter; iiter++) { for (int iIndNo = 0; iIndNo < aIndNo.Count; iIndNo++) { int ino = (int)aIndNo[iIndNo]; double[] po0 = new double[2]; double[] po1 = new double[2]; double[] po2 = new double[2]; if (ino == 0) { po0[0] = 0; po0[1] = 0; } else { po0[0] = axys[ino * 2 - 2]; po0[1] = axys[ino * 2 - 1]; } po1[0] = axys[ino * 2 + 0]; po1[1] = axys[ino * 2 + 1]; if (ino == nno - 1) { po2[0] = 1; po2[1] = 0; } else { po2[0] = axys[ino * 2 + 2]; po2[1] = axys[ino * 2 + 3]; } //////////////// double[] mPt = { (po0[0] + po2[0]) * 0.5, (po0[1] + po2[1]) * 0.5 }; double[] dPt = { (1.0 - w) * po1[0] + w * mPt[0], (1.0 - w) * po1[1] + w * mPt[1] }; axys[ino * 2 + 0] = dPt[0]; axys[ino * 2 + 1] = dPt[1]; } } edge.SetCurveRelPoint(axys); return(true); }
public void SetCadEdge(CadObject2D cad2D, uint eId, OpenTK.Vector2d pickPos) { this.PickPos = pickPos; this.ECadId = eId; ClearMemory(); IList <double> relCoPolys = new List <double>(); { System.Diagnostics.Debug.Assert(cad2D.IsElementId(CadElementType.Edge, eId)); Edge2D e = cad2D.GetEdge(eId); relCoPolys = e.GetCurveRelPoint(); } IList <double> xys = new List <double>(); uint ndiv = (uint)(relCoPolys.Count / 2 + 1); No = ndiv + 1; for (int i = 0; i < No * 2; i++) { xys.Add(0); } uint sVId = cad2D.GetEdgeVertexId(eId, true); uint eVId = cad2D.GetEdgeVertexId(eId, false); OpenTK.Vector2d sV = cad2D.GetVertexCoord(sVId); OpenTK.Vector2d eV = cad2D.GetVertexCoord(eVId); OpenTK.Vector2d hse = eV - sV; OpenTK.Vector2d vse = new OpenTK.Vector2d(-hse.Y, hse.X); xys.Add(sV.X); xys.Add(sV.Y); for (int i = 0; i < ndiv - 1; i++) { OpenTK.Vector2d v = sV + relCoPolys[i * 2 + 0] * hse + relCoPolys[i * 2 + 1] * vse; xys.Add(v.X); xys.Add(v.Y); } xys.Add(eV.X); xys.Add(eV.Y); ////////////////////////////////////// Mat = new TriDiaMat3(No); IniX = new double[No * 2]; Ut = new double[No * 3]; Res = new double[No * 3]; Dut = new double[No * 3]; BCFlag = new int[No * 3]; //// for (int i = 0; i < No * 2; i++) { IniX[i] = xys[i]; } for (int i = 0; i < No * 3; i++) { Ut[i] = 0; } for (int i = 0; i < No * 3; i++) { BCFlag[i] = 0; } ////////////////////////////////////// SetFixedBoundaryFlag(0, 0); SetFixedBoundaryFlag(0, 1); SetFixedBoundaryFlag(No - 1, 0); SetFixedBoundaryFlag(No - 1, 1); double alpha; double ndist; double normX; double normY; ProjectPoint(pickPos.X, pickPos.Y, ref PickedDivIndex, out alpha, out ndist, out normX, out normY); if (PickedDivIndex == -1) { return; } SetFixedBoundaryFlag((uint)PickedDivIndex, 0); SetFixedBoundaryFlag((uint)PickedDivIndex, 1); SetFixedBoundaryFlag((uint)PickedDivIndex + 1, 0); SetFixedBoundaryFlag((uint)PickedDivIndex + 1, 1); }
public bool MoveEdgeCtrl(uint eId, uint iCtrl, OpenTK.Vector2d deltaVec) { if (!IsElementId(CadElementType.Edge, eId)) { return(false); } IList <double> oldRelCos = null; { Edge2D e = GetEdge(eId); oldRelCos = e.GetCurveRelPoint(); } Edge2D edge = GetEdge(eId); if (iCtrl >= edge.GetCurvePoint().Count) { return(true); } { OpenTK.Vector2d sPt = edge.GetVertex(true); OpenTK.Vector2d ePt = edge.GetVertex(false); double sqLen = CadUtils.SquareLength(ePt - sPt); var eh = (ePt - sPt) * (1 / sqLen); OpenTK.Vector2d ev = new OpenTK.Vector2d(-eh.Y, eh.X); var p0 = edge.GetCurvePoint()[(int)iCtrl] + deltaVec; IList <double> aRelCo = edge.GetCurveRelPoint(); aRelCo[(int)(iCtrl * 2 + 0)] = OpenTK.Vector2d.Dot(p0 - sPt, eh); aRelCo[(int)(iCtrl * 2 + 1)] = OpenTK.Vector2d.Dot(p0 - sPt, ev); edge.SetCurveRelPoint(aRelCo); } 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.SetCurveRelPoint(oldRelCos); return(true); } } return(true); }