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)); }
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); }
/// <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(); }