Проведите линию между двумя точками на консоли

Как я могу нарисовать линию на консоли, если у меня есть двумерный массив символов. Функция, которую я хочу написать, выглядит примерно так:

Это моя первая попытка, но выглядит она совершенно неправильно

public static void line(char[][] mPixels, int startRow, int startColumn, int endRow, int endColumn) 
{
    double dY = endRow - startRow;
    double dX = endColumn - startColumn;
    double slope = dX / dY;
    slope = Math.abs(slope);

    if(slope >= 1)
    {
        double progress = -(dY / dX);
        for(int i=startColumn; i<=endColumn; i++)
        {
            double j = startRow - (int) ((i-startColumn) * progress);
            int yLoc = (int) (Math.round( j * 100.0 ) / 100.0);

            mPixels[i][yLoc] = '*'; 
        }
    }

// print array  
}

1 ответ

Решение

Используйте DDA или Bresenham,...

То, что у вас есть, выглядит как DDA, но вы неправильно обрабатываете уклоны. Вы должны разделить на ось большее количество пикселей и использовать его как ось управления так:


если |dx|>|dy| затем for проходит через x = x0 -> x1 а также y=y0+((x-x0)*dy/dx)
если |dx|<|dy| затем for проходит через y = y0 -> y1 а также x=x0+((y-y0)*dx/dy)
если они равны, используйте любой из вышеперечисленных.
если dx==0 а также dy==0 нарисовать только точку и нет for настоящее

Не забудьте обработать, если главная ось поднимается или опускается (может быть x++,y++ или же x--,y--) также можно сделать на целых числах только без деления или умножения, но это уже другая история

Другие вопросы по тегам