如何获得两个Point对象之间的所有点?

时间:2013-04-16 04:22:14

标签: c# .net

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

Point start = new Point(1, 9);

和我的第二个:

Point end = new Point(4, 9);

我希望获得开始和结束之间的所有要点。所以例如我想要一个数组中的2,9和3,9。 .NET是否内置了这个内容?

4 个答案:

答案 0 :(得分:7)

没有为此功能构建,因为点之间没有点。 Mathematicaly在两点之间有一条线。在计算机图形学方面,线路可以是抗锯齿的,因此不能四舍五入到完整的整数。

如果您正在寻找一种在中间创建所有整数的快速方法,我猜Bresenhams-Line-Algorithm将是您的选择。但这不是构建到.NET中的,你必须自己编写代码(或者采用Matthew Watson的实现):

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

甚至还有更快的算法,但我会选择Bresenham。

答案 1 :(得分:6)

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

My Line课程:

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点的Point数组。希望有所帮助!

答案 2 :(得分:1)

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

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

fnFindCellRowIndexes.js

答案 3 :(得分:0)

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