C# 如何找到离给定点最近的点(点是(x,y),在不同点的列表中)?

C# 如何找到离给定点最近的点(点是(x,y),在不同点的列表中)?,c#,random,distance,points,C#,Random,Distance,Points,目前我有一个随机点是从随机生成的。我试图检查给定的随机点是否太接近平面中的任何其他现有点,如果它距离所有其他点足够远,它将添加到其他点的列表中。我从一个给定点开始,列表中的前一百个点就是这样生成的。我的问题是,当我将列表上的所有点绘制到屏幕上时,这些点往往比允许的要近得多 public void generateFirstMap() { int count = 0; do { int randXpixels = Ma

目前我有一个随机点是从随机生成的。我试图检查给定的随机点是否太接近平面中的任何其他现有点,如果它距离所有其他点足够远,它将添加到其他点的列表中。我从一个给定点开始,列表中的前一百个点就是这样生成的。我的问题是,当我将列表上的所有点绘制到屏幕上时,这些点往往比允许的要近得多

public void generateFirstMap()
    {
        int count = 0;
        do
        {
            int randXpixels = Main.rand.Next(24, Main.screenWidth - 16); //leave outer 16 pixels of screen empty (planet sprite has diameter of 8 pixels)
            int randYpixels = Main.rand.Next(27, Main.screenHeight - 27);
            Tuple<int, int> coord = Tuple.Create(randXpixels, randYpixels);
            if (distance(closestPoint(coord), coord) < 200)
            {
                continue;
            }
            points.Add(coord); //List<Tuple<int,int>> points;

            count++;
        } while(count < 100);


public Tuple<int, int> closestPoint (Tuple<int, int> p1)
    {
        Tuple<int, int> p2 = Tuple.Create(0, 0);
        bool firstRun = true;
            foreach (Tuple<int, int> point in points)
            {
                if (firstRun)
                {
                    p2 = point;
                    firstRun = false;
                }
                else if (distance(p1, p2) < distance(p1, point))
                {
                    p2 = point;
                }
            }
            return p2;
    }

public double distance(Tuple<int, int> p1, Tuple<int, int> p2)
    {
        Vector2 line = new Vector2((p2.Item1 - p1.Item1), (p2.Item2 - p1.Item2));
        return Math.Abs(line.Length());
    }
public void generateFirstMap()
{
整数计数=0;
做
{
int randXpixels=Main.rand.Next(24,Main.screenWidth-16);//将屏幕外部16个像素留空(星球精灵的直径为8个像素)
int randYpixels=Main.rand.Next(27,Main.screenHeight-27);
Tuple-coord=Tuple.Create(随机像素,随机像素);
if(距离(闭合点(坐标),坐标)<200)
{
继续;
}
点。添加(坐标);//列出点;
计数++;
}而(计数<100);
公共元组闭合点(元组p1)
{
Tuple p2=Tuple.Create(0,0);
bool firstRun=true;
foreach(点中的元组点)
{
如果(首次运行)
{
p2=点;
firstRun=false;
}
否则如果(距离(p1,p2)<距离(p1,点))
{
p2=点;
}
}
返回p2;
}
公共双距离(元组p1、元组p2)
{
Vector2行=新的Vector2((p2.Item1-p1.Item1),(p2.Item2-p1.Item2));
返回Math.Abs(line.Length());
}
编辑:要明确的是,它们之间的距离只是我在那里给出的一个数字(目前),可以是任何>~30的数字

Edit2:将所有元组更改为Vector2并使用了建议的代码,仍然没有更改问题

编辑3:使用for循环遍历所有点(while循环内部)并使用break似乎已经解决了问题。

这应该可以: (需要删除所有元组,并将其替换为Vector2类型,这在一般情况下更有意义。此外,还需要调整命名

public Vector2 GetClosestPoint (Vector2 v1)
{
    return points.OrderByDescending(v2 => GetDistance(v1,v2)).First();
}

像这样的怎么样

public void generateFirstMap()
{
    int count = 0;
    do
    {
        bool addPoint = true;
        int randXpixels = Main.rand.Next(24, Main.screenWidth - 16);
        int randYpixels = Main.rand.Next(27, Main.screenHeight - 27);
        for (int a = 0; a < points.Count; a++)
        {
            int dX = randXpixels - points[a].X;
            int dY = randYpixels - points[a].Y;
            if (dX * dX + dY * dY < 200)
            {
                addPoint = false;
                break;
            }
        }
        if(addPoint)
            points.Add(new Point(randXpixels,randYpixels));

        count++;
    } while (count < 100);
}
public void generateFirstMap()
{
整数计数=0;
做
{
bool addPoint=true;
int randXpixels=Main.rand.Next(24,Main.screenWidth-16);
int randYpixels=Main.rand.Next(27,Main.screenHeight-27);
对于(int a=0;a

只需将Point类更改为元组或您正在使用的任何对象,看起来您希望它相当快,因为它是一个非常慢的算法(我认为是O(N^2)。一个明显的优化就是只计算距离平方,并使用它来比较距离-这不需要平方根运算

然而,你有一个更严重的问题。如果你的操作是正确的,那么你试图在屏幕上放置100个点,使它们之间的距离不超过200像素。这不太可能发生在随机选择的点上,因为它们很可能发生在这样的位置上,即在放置数字之后mply再也没有地方放了

无论如何,这里有一些代码将尝试计算点-但它永远不会终止,因为除非您将屏幕设置得非常大,否则这些点将不适合。尝试使用
Random()
构造函数的不同种子运行它,看看会发生什么

using System;
using System.Collections.Generic;
using System.Drawing;

namespace ConsoleApplication2
{
    class Program
    {
        private static void Main()
        {
            var points = new List<Point>();

            int screenWidth     = 1920;
            int screenHeight    = 1280;
            int numPointsWanted =  100;

            long nearestAllowedSquared = 200*200;

            Random rng = new Random(12345);

            while (points.Count < numPointsWanted)
            {
                int randXpixels = rng.Next(24, screenWidth - 16);
                int randYpixels = rng.Next(27, screenHeight - 27);
                var point = new Point(randXpixels, randYpixels);

                if (distanceToNearestPointSquared(point, points) >= nearestAllowedSquared)
                {
                    points.Add(point);
                    Console.WriteLine(points.Count);
                }
            }
        }

        private static long distanceToNearestPointSquared(Point point, IEnumerable<Point> points)
        {
            long nearestDistanceSquared = long.MaxValue;

            foreach (var p in points)
            {
                int dx = p.X - point.X;
                int dy = p.Y - point.Y;

                long distanceSquared = dx*dx + dy*dy;

                nearestDistanceSquared = Math.Min(nearestDistanceSquared, distanceSquared);
            }

            return nearestDistanceSquared;
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统图;
命名空间控制台应用程序2
{
班级计划
{
私有静态void Main()
{
var points=新列表();
int屏幕宽度=1920;
int屏幕高度=1280;
int numPointsWanted=100;
长近距离允许平方=200*200;
随机rng=新随机(12345);
while(points.Count=最近允许平方)
{
点。添加(点);
控制台写入线(点数计数);
}
}
}
专用静态长距离到最近点平方(点点,IEnumerable点)
{
long nearestDistanceSquared=long.MaxValue;
foreach(以点为单位的var p)
{
int dx=p.X-点X;
int dy=p.Y-点Y;
长距离平方=dx*dx+dy*dy;
nearestDistanceSquared=数学最小值(nearestDistanceSquared,distanceSquared);
}
返回最近距离的平方;
}
}
}

你可以迭代平面上的点,并使用公式计算与你得到的新随机点之间的距离。

为什么你要使用
元组而不是
或你的
向量2
类?距离是什么样的?我不知道
向量2
类…是
行长度()
您认为它是什么,还是它总是返回2?嗯,好的1:对所有点使用向量2,而不是