Проведение линии переменной ширины в openGL (Никакой glLineWidth)

Вы пробовали Bananascript ? Он производит сильно сжатый и полностью нечитаемый код.

9
задан Aaron Maenpaa 20 September 2008 в 02:23
поделиться

5 ответов

Предположите, что Ваши исходные точки (x1, y1)-> (x2, y2). Используйте следующие моменты (x1-width/2, y1), (x1+width/2, y1), (x2-width/2, y2), (x2+width/2, y2), чтобы создать прямоугольник и затем использовать четверки/тримараны для рисования его. Это простой наивный путь. Обратите внимание, что для больших ширин строки Вы станете странными поведение конечной точки. Что Вы действительно хотите сделать, затем некоторые умные параллельные вычисления строки (который не должен быть что плохо), использующий векторную математику. По некоторым причинам точка/векторное произведение и векторная проекция приходят на ум.

1
ответ дан 4 December 2019 в 07:49
поделиться

Можно потянуть два треугольника:

// Draws a line between (x1,y1) - (x2,y2) with a start thickness of t1 and
// end thickness t2.
void DrawLine(float x1, float y1, float x2, float y2, float t1, float t2)
{
    float angle = atan2(y2 - y1, x2 - x1);
    float t2sina1 = t1 / 2 * sin(angle);
    float t2cosa1 = t1 / 2 * cos(angle);
    float t2sina2 = t2 / 2 * sin(angle);
    float t2cosa2 = t2 / 2 * cos(angle);

    glBegin(GL_TRIANGLES);
    glVertex2f(x1 + t2sina1, y1 - t2cosa1);
    glVertex2f(x2 + t2sina2, y2 - t2cosa2);
    glVertex2f(x2 - t2sina2, y2 + t2cosa2);
    glVertex2f(x2 - t2sina2, y2 + t2cosa2);
    glVertex2f(x1 - t2sina1, y1 + t2cosa1);
    glVertex2f(x1 + t2sina1, y1 - t2cosa1);
    glEnd();
}
14
ответ дан 4 December 2019 в 07:49
поделиться

Прямоугольник (т.е. GL_QUAD или два GL_TRIANGLES) походит на Ваш лучший выбор звуками его, не уверенный, что я могу думать о любом другом пути.

0
ответ дан 4 December 2019 в 07:49
поделиться

Хорошо, как насчет этого: (Ozgar)


       A
      / \
     /      \
    . p1        \
   /                \
  /                    D
 B -                 .p2
      -   -    -    C

Итак, AB имеет ширину1, а CD имеет ширину2.

Тогда,

// find line between p1 and p2
Vector p1p2 = p2 - p1 ;

// find a perpendicular
Vector perp = p1p2.perpendicular().normalize()

// Walk from p1 to A
Vector A = p1 + perp*(width1/2)
Vector B = p1 - perp*(width1/2)

Vector C = p2 - perp*(width2/2)
Vector D = p2 - perp*(width2/2)

// wind triangles
Triangle( A, B, D )
Triangle( B, D, C )

Обратите внимание, что с этим алгоритмом потенциально существует проблема CW/CCW намотки - если perp вычисляется как (-y, x) на приведенной выше диаграмме, то это будет CCW намотка, если (y, -x), то это будет CW намотка.

9
ответ дан 4 December 2019 в 07:49
поделиться

Другой способ сделать это, если вы случайно пишете программный растеризатор, - использовать барицентрические координаты на этапе окрашивания пикселей и цветные пиксели , когда одна из барицентрических координат близка к 0 . Чем больше вы сделаете припуск, тем толще будут линии.

1
ответ дан 4 December 2019 в 07:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: