Существует 4 случая, которые необходимо учитывать: наклон> 1, наклон между 0 и 1, наклон между -1 и 0 и наклон менее -1.
Вы кодировали для наклона> 1. Если у вас есть наклон <-1, вы можете определить это заранее, вычислить <code>increment, чтобы быть +1 или -1, и изменить x++
на x += increment
.
Для случаев, когда наклон составляет от -1 до 1, вы можете иметь один и тот же цикл, только с заменой x и y.
РЕДАКТИРОВАТЬ: Похоже, что вы пытаетесь заполнить треугольник путем сканирования, конвертируя две ноги одновременно. Это особый случай, который вы можете использовать, но общий способ сканирования для преобразования выпуклого многоугольника (например, треугольника) состоит в том, чтобы поместить все точки в список, а затем для каждой линии сканирования нарисовать линию между столбцами min и max. Вот некоторый псевдокод для алгоритма:
// create a list of points that is the union of all segments
var points = ScanConvert(x1, y1, x2, y2)
.Union(ScanConvert(x2, y2, x3, y3))
.Union(ScanConvert(x1, y1, x3, y3));
// group the points by scan line, finding the leftmost and rightmost point on each line
var scanlines = from p in points
group p by p.Y into scanline
select new { y = scanline.Key,
x1 = scanline.Min(p => p.X),
x2 = scanline.Max(p => p.X) }
// iterate over the scan lines, drawing each segment
foreach (var scanline in scanlines)
DrawLine(x1, y, x2, y);