C#获取2点之间的所有像素坐标-错误



所以首先,我有几个X1、Y1、X2和Y2坐标。X1/Y1表示起点,X2/Y2表示终点,所以我从这些点画一条线。我需要存储这两个点之间的所有像素/点。我有一个算法,似乎可以做到,但有一些错误。我不知道为什么只有一半会存储在字典里。

代码(点p1=>X1和Y1,点p2=>X2和Y2(:

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, (int)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((int)x, (int)y);
points.Add(p);
error += deltaErr;
while (error >= 0.0f)
{
y++;
points.Add(new Point((int)x, (int)y));
error -= 1.0f;
}
}
if (points.Last() != p2)
{
int index = points.IndexOf(p2);
points.RemoveRange(index + 1, points.Count - index - 1);
}
}
return points;
}

一些解释:在整个过程结束时,我会得到一个点列表,其中包含点之间的所有坐标->这很好。之后,我画了这些点,但正如你在图片上看到的,只有一半被存储了(白线显示了存储的点之间的坐标(。代码中有我没有注意到的东西吗?为什么只储存这些?提前谢谢你!

(黄色圆圈是起点,紫色圆圈是终点(

此处为详细图片

我有个主意。您存储的所有成功点从左上角指向右下角,未存储的所有点从左下角指向右上角。所以问题是在Y坐标方向上。

在第一种情况下,Y坐标从较小的值变为较大的值,因此y++;将使我们更接近终点,最后一点将等于端点,points.Last() != p2返回false。

在第二种情况下,deltaY为负,因此y++将使我们远离端点,而int index = points.IndexOf(p2);返回-1,因为集合中没有端点。所以

points.RemoveRange(index + 1, points.Count - index - 1);
// points.RemoveRange(-1 + 1, points.Count - -1 - 1);
// points.RemoveRange(0, points.Count);

将删除所有点。

您需要使用var deltaYdirection = (int) Math.Sign(deltaY)计算deltaYdirection,并使用y += deltaYdirection;而不是y++;

最新更新