Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }