Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
        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);
        }