может ли библиотека CImg рисовать толстые линии - PullRequest
5 голосов
/ 15 апреля 2011

Я пользовался библиотекой CImg и был доволен тем, насколько легко интегрировать и использовать.Однако теперь я хочу нарисовать толстые линии (то есть толщиной более одного пикселя).Из документации API функции draw_line ( здесь ) неясно, как это можно сделать.Вторая версия функции (чуть ниже первой в документации) даже принимает текстуру в качестве входных данных, но опять же без ширины.Кажется странным, что такая всеобъемлющая библиотека не имела бы этой функции.Возможно, это должно быть сделано с помощью какого-то преобразования?Я знаю, что мог бы сделать это, используя многоугольник (то есть прямоугольник, в котором я вычислял бы углы многоугольника, используя нормаль к линии), но я боюсь, что это будет значительно медленнее.

Ответы [ 2 ]

4 голосов
/ 15 апреля 2011

По-видимому, это невозможно "из коробки", но создание собственной подпрограммы, которая несколько раз вызывает подпрограмму draw_line () для CImg, со сдвигом на один или два пикселя, должно дать вам результат, который вы хочу, без особого труда.

2 голосов
/ 04 июня 2018

Эту функцию можно использовать для рисования толстых линий в виде многоугольников.

void draw_line(cimg_library::CImg<uint8_t>& image,
    const int x1, const int y1,
    const int x2, const int y2,
    const uint8_t* const color,
    const unsigned int line_width)
{
    if (x1 == x2 && y1 == y2) {
        return;
    }
    // Convert line (p1, p2) to polygon (pa, pb, pc, pd)
    const double x_diff = std::abs(x1 - x2);
    const double y_diff = std::abs(y1 - y2);
    const double w_diff = line_width / 2.0;

    const int x_adj = y_diff * w_diff / std::sqrt(std::pow(x_diff, 2) + std::pow(y_diff, 2));
    const int y_adj = x_diff * w_diff / std::sqrt(std::pow(x_diff, 2) + std::pow(y_diff, 2));

    // Points are listed in clockwise order, starting from top-left
    cimg_library::CImg<int> points(4, 2);
    points(0, 0) = x1 - x_adj;
    points(0, 1) = y1 + y_adj;
    points(1, 0) = x1 + x_adj;
    points(1, 1) = y1 - y_adj;
    points(2, 0) = x2 + x_adj;
    points(2, 1) = y2 - y_adj;
    points(3, 0) = x2 - x_adj;
    points(3, 1) = y2 + y_adj;

    image.draw_polygon(points, color);
}

Тесты с line_width 20 и 3 цветами.Первый раз использует эту функцию, второй раз рисует одну линию шириной 1 пиксель, используя image.draw_line().

  • 1000,1000 - 2000,2000: 216 мкс / 123 мкс
  • 2000От 2000 до 8000 400: 588 мкс / 151 мкс
  • 3000, 1000 до 3020 000: 21 мкс / 5 мкс
...