【问题标题】:Generating Random Coordinates With No Duplicates And Not between a Set of Existing Coordinates C#在一组现有坐标之间生成没有重复的随机坐标 C#
【发布时间】:2012-08-26 14:14:17
【问题描述】:

我需要生成一组唯一坐标 (A1, B1) 和 (A2, B2),它们的值介于 0 和 1 之间。这组唯一坐标不能位于现有坐标集 ([x1], [y1]) 和 ([x2], [y2]) 由 sql 查询返回。如何使用 C# 编写一个脚本,该脚本生成的坐标是 1) 不在查询返回的值之间且 2) 不等于查询返回的值?

这里的逻辑基本上是用来在一个页面上绘制一组框。我需要绘制具有唯一坐标的新框,但这些新框不能重叠或位于现有框内。非常感谢任何帮助!

【问题讨论】:

  • 你试过使用>=<=吗?
  • 这些盒子的大小是一样的,还是随机的?
  • 框的大小是随机的,只要它不与现有框重叠
  • 我用比 C# 更多的 SQL 解决了这个问题

标签: c# random coordinates


【解决方案1】:

这适用于大约 99.99% 左右......

    void GenerateTest()
    {
        float x1, y1;
        float x2, y2;
         // fill x1,y1,x2,y2

        var r = new Random();
        Func<float> next = () => (float)r.NextDouble();

        var NotMatchingRect = RectangleF.FromLTRB(x1,y1,x2,y2);
        var Coordinates = Enumerable.Range(0, 1000).Select(i => new PointF(next(), next())).Where(p => !NotMatchingRect.Contains(p)).Distinct().Take(2).ToArray();
        if (Coordinates.Length != 2)
            throw new IndexOutOfRangeException();
    }

【讨论】:

  • 如何整合我的查询:从 instanceid=n 和 X1 !=0 和 Y1 !=0 和 X2 !=1 和 Y2 !=1 的表中选择不同的 X1、Y1、X2、Y2
【解决方案2】:

为方便起见,假设存在 Random,命名为 randomizer,您可以这样做...

do
{
A1 = randomizer.NextDouble();
B1 = randomizer.NextDouble();
} while(!((A1>=X1&&A1<=X2&&B1>=Y1&&B1<=Y2)||(A1>=X2&&A1<=X1&&B1>=Y2&&B1<=Y1)) //not inside other rectangle

do
{
A2 = randomizer.NextDouble();
B2 = randomizer.NextDouble();
}
while(!((A1==A2&&B1==B2)||  //not equal to other random coordinate
(A2>=X1&&A2<=X2&&B2>=Y1&&B2<=Y2)||
(A2>=X2&&A2<=X1&&B2>=Y2&&B2<=Y1)|| //not inside other rectangle
(A1<=X1&&A2>=X2&&B1<=Y1&&B2>=Y2)||
(A1<=X2&&A2>=X1&&B1<=Y2&&B2>=Y1)||
(A2<=X1&&A1>=X2&&B2<=Y1&&B1>=Y2)||
(A2<=X2&&A1>=X1&&B2<=Y2&&B1>=Y1)||)) //not containing other rectangle

它有点(阅读:非常非常)笨拙(实际上我有点尴尬),但它应该可以工作,并生成所有可能的随机矩形......最终。

【讨论】:

  • 我已经有了类似的东西,我想我遇到问题的部分是参数化 while 语句并将 SQL 数据读取器结果转换为 C#。 X1、Y1、X2、Y2 都是查询返回的列名。即如果 X1={2, 4, 6} Y1={1, 3, 5} X2={3, 5, 8},Y2={2, 4, 6}。我的 x1_rand 和 x2_rand 不能介于 {2, 3}U{4, 5}U{6, 8} 之间,我的 y1_rand 和 y2_rand 不能介于 {1,2}U{3,4}U{5, 6}
  • 好吧,你可以使用任意数量的东西。如果您已经在使用 SQLDataReader,最简单的方法可能是设置字典。在这里,这更详细stackoverflow.com/a/1504989/1623719
猜你喜欢
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 2016-01-08
相关资源
最近更新 更多