public void Interval2D_Equals()
        {
            var sut      = Interval2D.Create(Interval1D.Create(0, 5), Interval1D.Create(2, 5));
            var equal    = Interval2D.Create(Interval1D.Create(0, 5), Interval1D.Create(2, 5));
            var notEqual = Interval2D.Create(Interval1D.Create(2, 5), Interval1D.Create(0, 5));

            Assert.IsTrue(sut.Equals(equal));
            Assert.IsFalse(sut.Equals(notEqual));
        }
Example #2
0
        public unsafe void F64MatrixView_SubView()
        {
            var matrix = Matrix();

            using (var pinnedMatrix = matrix.GetPinnedPointer())
            {
                var subView   = pinnedMatrix.View().View(Interval2D.Create(Interval1D.Create(0, 2), Interval1D.Create(0, 3)));
                var subMatrix = matrix.Rows(new int[] { 0, 1 });
                AssertMatrixView(subMatrix, subView);
            }
        }
    /// <summary>
    /// 判断两个平面是否相交。
    /// </summary>
    /// <param name="that">需要判断的另一个平面。</param>
    /// <returns>相交则返回 <c>true</c>,否则返回 <c>false</c>。</returns>
    public bool Intersects(Interval2D that)
    {
        if (!_x.Intersect(that._x))
        {
            return(false);
        }

        if (!_y.Intersect(that._y))
        {
            return(false);
        }

        return(true);
    }
 /// <summary>
 /// Gets a subview over the specified interval
 /// </summary>
 /// <param name="subView"></param>
 /// <returns></returns>
 public F64MatrixView View(Interval2D subView)
 {
     return(new F64MatrixView(GetSubViewDataPointer(subView), subView.Rows.Length, subView.Cols.Length, m_strideInBytes));
 }
 double *GetSubViewDataPointer(Interval2D subView)
 {
     return(this[subView.Cols.FromInclusive] + subView.Rows.FromInclusive);
 }
Example #6
0
    /// <summary>
    /// 主绘图函数。
    /// </summary>
    /// <param name="number">2D 间隔的数目。</param>
    /// <param name="min">分布范围的下界。(大于 0 且小于 1)</param>
    /// <param name="max">分布范围的上界。(大于 0 且小于 1)</param>
    public static void StartDrawing(int number, double min, double max)
    {
        var list   = new Interval2D[number];
        var random = new Random();

        // 开始绘图
        var drawPad = new Form2();

        drawPad.Show();
        var graphics = drawPad.CreateGraphics();

        // 生成随机二维间隔
        for (var i = 0; i < number; i++)
        {
            var x = random.NextDouble() * (max - min) + min;
            var y = random.NextDouble() * (max - min) + min;
            if (x >= y)
            {
                var temp = x;
                x = y;
                y = temp;
            }
            x *= drawPad.ClientRectangle.Width;
            y *= drawPad.ClientRectangle.Width;
            var tempx = new Interval1D(x, y);

            x = random.NextDouble() * (max - min) + min;
            y = random.NextDouble() * (max - min) + min;
            if (x >= y)
            {
                var temp = x;
                x = y;
                y = temp;
            }
            x *= drawPad.ClientRectangle.Height;
            y *= drawPad.ClientRectangle.Height;
            var tempy = new Interval1D(x, y);

            list[i] = new Interval2D(tempx, tempy);
        }

        // 计算相交和包含的数量
        var intersectNum = 0;

        for (var i = 0; i < number; i++)
        {
            for (var j = i + 1; j < number; j++)
            {
                if (list[i].Intersects(list[j]))
                {
                    intersectNum++;
                }
            }
        }

        var containsNum = 0;

        for (var i = 0; i < number; i++)
        {
            for (var j = 0; j < number; j++)
            {
                if (i == j)
                {
                    continue;
                }

                if (list[i].Contains(list[j]))
                {
                    containsNum++;
                }
            }
        }

        // 移动原点至左下方,翻转坐标系
        graphics.TranslateTransform(0, drawPad.ClientRectangle.Height);
        graphics.ScaleTransform(1, -1);

        // 绘制所有区间
        foreach (var n in list)
        {
            n.Draw(graphics);
        }

        // 新建一个窗口,显示计算结果
        MessageBox.Show($"相交的区间对数:{intersectNum}, 包含的区间对数:{containsNum}");

        // 清理资源
        graphics.Dispose();
    }
 /// <summary>
 /// 判断目标区间是否被本区间包含。
 /// </summary>
 /// <param name="that">需要判断是否被包含的区间。</param>
 /// <returns>如果 <paramref name="that"/> 被包含,则返回 <c>true</c>,否则返回 <c>false</c>。</returns>
 public bool Contains(Interval2D that)
 {
     return(_x.Contains(that._x) && _y.Contains(that._y));
 }
        /// <summary>
        /// 主绘图函数。
        /// </summary>
        /// <param name="N">2D 间隔的数目。</param>
        /// <param name="Min">分布范围的下界。(大于 0 且小于 1)</param>
        /// <param name="Max">分布范围的上界。(大于 0 且小于 1)</param>
        public static void StartDrawing(int N, double Min, double Max)
        {
            Interval2D[] list   = new Interval2D[N];
            Random       random = new Random();

            // 开始绘图
            Form2 drawPad = new Form2();

            drawPad.Show();
            Graphics graphics = drawPad.CreateGraphics();

            // 生成随机二维间隔
            for (int i = 0; i < N; i++)
            {
                double x = random.NextDouble() * (Max - Min) + Min;
                double y = random.NextDouble() * (Max - Min) + Min;
                if (x >= y)
                {
                    double temp = x;
                    x = y;
                    y = temp;
                }
                x *= drawPad.ClientRectangle.Width;
                y *= drawPad.ClientRectangle.Width;
                Interval1D tempx = new Interval1D(x, y);

                x = random.NextDouble() * (Max - Min) + Min;
                y = random.NextDouble() * (Max - Min) + Min;
                if (x >= y)
                {
                    double temp = x;
                    x = y;
                    y = temp;
                }
                x *= drawPad.ClientRectangle.Height;
                y *= drawPad.ClientRectangle.Height;
                Interval1D tempy = new Interval1D(x, y);

                list[i] = new Interval2D(tempx, tempy);
            }

            // 计算相交和包含的数量
            int intersectNum = 0;

            for (int i = 0; i < N; i++)
            {
                for (int j = i + 1; j < N; j++)
                {
                    if (list[i].Intersects(list[j]))
                    {
                        intersectNum++;
                    }
                }
            }

            int containsNum = 0;

            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < N; j++)
                {
                    if (i == j)
                    {
                        continue;
                    }

                    if (list[i].Contains(list[j]))
                    {
                        containsNum++;
                    }
                }
            }

            // 移动原点至左下方,翻转坐标系
            graphics.TranslateTransform(0, drawPad.ClientRectangle.Height);
            graphics.ScaleTransform(1, -1);

            // 绘制所有区间
            foreach (Interval2D n in list)
            {
                n.Draw(graphics);
            }

            // 新建一个窗口,显示计算结果
            MessageBox.Show($"相交的区间数:{intersectNum}, 包含的区间数:{containsNum}");

            // 清理资源
            graphics.Dispose();
        }