C# 生成无重复且不在一组现有坐标C之间的随机坐标

C# 生成无重复且不在一组现有坐标C之间的随机坐标,c#,random,coordinates,C#,Random,Coordinates,我需要生成一组唯一的坐标A1,B1和A2,B2,它们的值在0和1之间。此唯一坐标集不能位于sql查询返回的现有坐标集[x1]、[y1]和[x2]、[y2]之间。如何使用C编写一个脚本,生成的坐标1不在查询返回的值之间,2不等于查询返回的值 这里的逻辑基本上用于在页面上绘制一组框。我需要绘制具有唯一坐标的新框,但这些新框不能重叠,也不能位于现有框内。非常感谢您的帮助 这大约适用于99.99%左右的人群 void GenerateTest() { float x1,

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


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

这大约适用于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();
    }

假设存在一个随机的,为方便起见命名为随机发生器,你可以

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

这是一个比特读物:非常非常笨拙,实际上我有点尴尬,但它应该工作,并生成所有可能的随机矩形。。。最终。

您是否尝试过使用>=并且框的大小都相同,还是随机的?框的大小是随机的,只要它不与现有框重叠。我使用了比Chow更多的SQL解决了这一问题。我集成了我的查询:从instanceid=n和X1的表中选择不同的X1、Y1、X2、Y2=0和Y1=0和X2=1和Y2=1我已经有类似的东西了,我想我遇到的问题是参数化while语句,并将SQL datareader结果转换为C。X1、Y1、X2、Y2都是查询返回的列名。i、 e.如果X1={2,4,6}Y1={1,3,5}X2={3,5,8},Y2={2,4,6}。我的x1_兰德和x2_兰德不能在{2,3}U{4,5}U{6,8}之间,我的y1_兰德和y2_兰德不能在{1,2}U{3,4}U{5,6}之间,你可以使用任意数量的东西。如果您已经在使用SQLDataReader,最简单的方法可能是设置字典。在这里,这将更加详细