コード例 #1
0
ファイル: Circle2.cs プロジェクト: sbialkowski-pixel/rhino3dm
        public LineCircleX Intersect(Line2 line, ref double l0, ref double l1)
        {
            if (this.R <= 0.0)
            {
                throw new Exception("Invalid circle, zero or negative radius");
            }
            l0 = double.NaN;
            l1 = double.NaN;
            int         num1 = (int)this.Contains(line.Ax, line.Ay);
            int         num2 = (int)this.Contains(line.Bx, line.By);
            double      t    = line.ClosestPoint(this.O);
            Node2       pt   = line.PointAt(t);
            LineCircleX lineCircleX;

            switch (this.Contains(pt))
            {
            case Containment.coincident:
                l0          = t;
                l1          = l0;
                lineCircleX = LineCircleX.Tangent;
                break;

            case Containment.outside:
                lineCircleX = LineCircleX.None;
                break;

            default:
                double num3 = Math.Sqrt(this.R * this.R - pt.DistanceSquared(this.O)) / line.Length();
                l0          = t - num3;
                l1          = t + num3;
                lineCircleX = LineCircleX.Secant;
                break;
            }
            return(lineCircleX);
        }
コード例 #2
0
        /// <summary>Rgister a new node with this collection.</summary>
        /// <param name="node">Node to register</param>
        /// <param name="index">Index of node</param>
        /// <returns>True if node was accepted, false if the node is too far or too close.</returns>
        public bool RegisterNode(Node2 node, int index)
        {
            if (index == m_base_index)
            {
                return(false);
            }
            double num = m_base.DistanceSquared(node);

            if (num < m_min_2)
            {
                return(false);
            }
            if (num > m_max_2)
            {
                return(false);
            }
            int num2 = m_D.BinarySearch(num);

            if (num2 < 0)
            {
                num2 ^= -1;
            }
            if (num2 == m_max_count)
            {
                return(false);
            }
            if (m_I[m_max_count - 1] < 0)
            {
                m_cur_count++;
            }
            if (num2 == m_max_count - 1)
            {
                m_I[num2] = index;
                m_D[num2] = num;
                return(true);
            }
            if (m_I[num2] < 0)
            {
                m_I[num2] = index;
                m_D[num2] = num;
            }
            else
            {
                int num3 = m_max_count - 1;
                int num4 = num2 + 1;
                for (int i = num3; i >= num4; i += -1)
                {
                    m_I[i] = m_I[i - 1];
                    m_D[i] = m_D[i - 1];
                }
                m_I[num2] = index;
                m_D[num2] = num;
            }
            return(true);
        }
コード例 #3
0
ファイル: Line2.cs プロジェクト: sbialkowski-pixel/rhino3dm
        public static Line2 MidLine(Node2 A, Node2 B)
        {
            Line2 line2;

            if (Math.Abs(A.DistanceSquared(B)) < Line2.tolerance)
            {
                line2 = (Line2)null;
            }
            else
            {
                double nAx  = 0.5 * (A.x + B.x);
                double nAy  = 0.5 * (A.y + B.y);
                double num1 = B.x - A.x;
                double num2 = B.y - A.y;
                line2 = new Line2(nAx, nAy, nAx + num2, nAy - num1);
            }
            return(line2);
        }
コード例 #4
0
ファイル: Line2.cs プロジェクト: sbialkowski-pixel/rhino3dm
        public static Line2 MidLine(Node2 A, Node2 B, double Wa, double Wb)
        {
            Line2 line2;

            if (Math.Abs(A.DistanceSquared(B)) < Line2.tolerance)
            {
                line2 = (Line2)null;
            }
            else
            {
                double num1 = Wa / (Wa + Wb);
                double nAx  = A.x + num1 * (B.x - A.x);
                double nAy  = A.y + num1 * (B.y - A.y);
                double num2 = B.x - A.x;
                double num3 = B.y - A.y;
                line2 = new Line2(nAx, nAy, nAx + num3, nAy - num2);
            }
            return(line2);
        }