Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取两个点对象之间的所有点?_C#_.net - Fatal编程技术网

C# 如何获取两个点对象之间的所有点?

C# 如何获取两个点对象之间的所有点?,c#,.net,C#,.net,假设我有我的第一个点结构: Point start = new Point(1, 9); 第二点: Point end = new Point(4, 9); 我想得到起点和终点之间的所有分数。例如,我想要数组中的2,9和3,9。NET是否为此内置了一些功能?由于点之间没有点,因此没有用于此功能的内置函数。从数学上讲,两点之间有一条直线。在计算机图形学方面,线条可以消除锯齿,因此不会四舍五入到整数 如果您正在寻找一种快速的方法来创建中间的所有整数,我想Bresenhams直线算法将是您的选择。

假设我有我的第一个点结构:

Point start = new Point(1, 9);
第二点:

Point end = new Point(4, 9);

我想得到起点和终点之间的所有分数。例如,我想要数组中的2,9和3,9。NET是否为此内置了一些功能?

由于点之间没有点,因此没有用于此功能的内置函数。从数学上讲,两点之间有一条直线。在计算机图形学方面,线条可以消除锯齿,因此不会四舍五入到整数

如果您正在寻找一种快速的方法来创建中间的所有整数,我想Bresenhams直线算法将是您的选择。但这不是内置到.NET中的,您必须自己编写(或以Matthew Watson的实现为例):


甚至还有更快速的算法可以实现,但我会选择Bresenham。

这就是我最终要做的。正如@Cody Gray在他的评论中提到的,一条直线上有无限多个点。因此,您需要指定要检索的点的数量

我的行类:

public class Line {
    public Point p1, p2;

    public Line(Point p1, Point p2) {
        this.p1 = p1;
        this.p2 = p2;
    }

    public Point[] getPoints(int quantity) {
        var points = new Point[quantity];
        int ydiff = p2.Y - p1.Y, xdiff = p2.X - p1.X;
        double slope = (double)(p2.Y - p1.Y) / (p2.X - p1.X);
        double x, y;

        --quantity;

        for (double i = 0; i < quantity; i++) {
            y = slope == 0 ? 0 : ydiff * (i / quantity);
            x = slope == 0 ? xdiff * (i / quantity) : y / slope;
            points[(int)i] = new Point((int)Math.Round(x) + p1.X, (int)Math.Round(y) + p1.Y);
        }

        points[quantity] = p2;
        return points;
    }
}

这将返回在两个端点(包括端点)之间均匀分布的20个点的点阵列。希望有帮助

我知道自从你第一次问这个问题以来已经有很长时间了,但我最近在寻找类似的东西,发现了这个wiki(),其中包含伪代码

所以我用伪代码实现了一个函数来执行这个计算,并将点添加到列表中

public List<Point> GetPoints(Point p1, Point p2)
{
    List<Point> points = new List<Point>();

    // no slope (vertical line)
    if (p1.X == p2.X)
    {
        for (double y = p1.Y; y <= p2.Y; y++)
        {
            Point p = new Point(p1.X, y);
            points.Add(p);
        }
    }
    else
    {
        // swap p1 and p2 if p2.X < p1.X
        if (p2.X < p1.X)
        {
            Point temp = p1;
            p1 = p2;
            p2 = temp;
        }

        double deltaX = p2.X - p1.X;
        double deltaY = p2.Y - p1.Y;
        double error = -1.0f;
        double deltaErr = Math.Abs(deltaY / deltaX);

        double y = p1.Y;
        for (double x = p1.X; x <= p2.X; x++)
        {
            Point p = new Point(x, y);
            points.Add(p);
            Debug.WriteLine("Added Point: " + p.X.ToString() + "," + p.Y.ToString());

            error += deltaErr;
            Debug.WriteLine("Error is now: " + error.ToString());

            while (error >= 0.0f)
            {
                Debug.WriteLine("   Moving Y to " + y.ToString());
                y++;
                points.Add(new Point(x, y));
                error -= 1.0f;
            }
        }

        if (points.Last() != p2)
        {
            int index = points.IndexOf(p2);
            points.RemoveRange(index + 1, points.Count - index - 1);
        }
    }

    return points;
}
公共列表获取点(点p1、点p2)
{
列表点=新列表();
//无坡度(垂直线)
如果(p1.X==p2.X)
{

对于(double y=p1.y;y,您可以使用下面的代码获得点之间的距离。用户只需定义两点之间的距离。这里我定义为10点

PointF pStart = new PointF(10, 10);
PointF pEnd = new PointF(100, 100);

PointF[] betPoints = new PointF[10];
for (int i = 1; i <= 10; i++)
{
    betPoints[i].X = (Math.Abs(pStart.X - pEnd.X) / 10) * i + pEnd.X;
    betPoints[i].Y = (Math.Abs(pStart.Y - pEnd.Y) / 10) * i + pEnd.Y;
}
PointF pStart=新的PointF(10,10);
PointF pEnd=新的PointF(100100);
PointF[]betPoints=新的PointF[10];

对于(int i=1;i任意两点之间有无限多个点。你想要全部点吗?@SethBattin WinForms也使用整数点,但WPF使用双精度点。我们可能可以从上下文中了解意图,但这是一个需要确定的有效点。定义“中间点”的含义。你想要所有点都位于最短路径上吗at仅在to点之间使用整数坐标?@BirajZalavadia绝对!
PointF pStart = new PointF(10, 10);
PointF pEnd = new PointF(100, 100);

PointF[] betPoints = new PointF[10];
for (int i = 1; i <= 10; i++)
{
    betPoints[i].X = (Math.Abs(pStart.X - pEnd.X) / 10) * i + pEnd.X;
    betPoints[i].Y = (Math.Abs(pStart.Y - pEnd.Y) / 10) * i + pEnd.Y;
}