Итак, во-первых, у меня есть несколько координат X1, Y1, X2 и Y2. X1 / Y1 представляет начальные точки, X2 / Y2 - конечные точки, поэтому я рисую линию из них. Мне нужно хранить все пиксели / точки между этими 2 точками. У меня есть алгоритм, который, кажется, делает это, но есть некоторые ошибки. Я понятия не имею, почему только половина из них будет храниться в словаре.
Код (точка 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;
}
Некоторое объяснение: в конце всей этой процедуры я получу список точек со всеми координатами между точками -> что хорошо. После этого я рисую эти точки, но, как вы можете видеть на картинке, только половина из них была сохранена (белые линии показывают сохраненные координаты между точками). Есть ли что-то, чего я не заметил в коде? Почему хранятся только те? Заранее спасибо!
(желтые круги - это отправные точки, а фиолетовые - это конечные точки)
Подробное описание здесь