如何得到两个点对象之间的所有点

本文关键字:对象 之间 两个 何得 | 更新日期: 2023-09-27 18:09:15

假设我有我的第一个Point结构体:

Point start = new Point(1, 9);

和我的第二个:

Point end = new Point(4, 9);

我想要得到起始点和结束点之间的所有点。举个例子,我想要一个数组中的(2,9)和(3,9).NET有什么内置的东西吗?

如何得到两个点对象之间的所有点

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

My Line class:

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;
    }
}


用法:

var line = new Line(new Point(10, 15), new Point(297, 316));
var points = line.getPoints(20);

将返回一个由20个点组成的点数组,在两个端点(包括端点)之间均匀间隔。希望这对你有帮助!

没有内置函数,因为点之间没有点。数学上两点之间有一条线。在计算机图形学方面,行可以被反锯齿化,这样就不会四舍五入到完整的整数。

如果你正在寻找一种快速的方法来创建所有整数之间,我想布雷斯纳姆线算法将是你的选择。但这不是内置在。net中,你必须自己编写代码(或采用Matthew Watson的实现):

http://en.wikipedia.org/wiki/Bresenham 's_line_algorithm

还有更快的算法,但我还是选择Bresenham。

我知道自从你第一次问这个问题已经很长时间了,但是我最近在寻找类似的东西,发现了这个wiki (https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm),其中包含伪代码。

因此,我已经用伪代码实现了一个函数来执行此计算并将点添加到List中。

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;
}

您可以使用下面的代码获得两点之间。用户只需要定义两点之间有多少个点。这里我定义为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;
}