生成没有重复的随机坐标,而不是在一组现有坐标C#之间生成

时间:2012-08-31 18:30:35

标签: c# random coordinates

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

为方便起见,假设存在一个名为随机函数的随机函数,你可以做...

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

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