Рисование контура пересекающихся кругов

У меня есть набор точек, и каждая из них имеет область «влияния» или, по сути, радиус . Я хотел бы иметь возможность нарисовать каждый из этих кругов влияния для всех точек в виде простой круговой линии.

Они будут перекрываться, но я хочу нарисовать внешнюю часть сформированной формы. Я знаю, что это, вероятно, потребует от меня разработки, где они пересекаются, и формирования общей формы для рисования. Проблема в том, что одни точки могут даже не касаться других! Так что мне тоже нужно разобраться с этим.

Я попытался просто проиллюстрировать, что я имею в виду:

enter image description here

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

Я бы сделал это в openGL, поэтому круг, вероятно, будет создан с использованием GL_LINES или чего-то подобного с различными вершинами, образующими кривые, но я действительно просто не знаю, как я буду работать с этим периметром.

Если у кого-нибудь есть совет или кто-нибудь может указать мне, как я могу решить эту проблему, я буду очень признателен!

Это может быть скорее математический вопрос, я не ищу фрагменты кода, а на самом деле, как приступить к работе с этими формами.Я просто не могу думать, как это сделать!

***** Edit: решение, которое я придумал, надеюсь, может помочь кому-то другому!

Я использовал предложенные идеи и решил, что лучше всего будет рисовать с использованием буфера трафарета. Теперь это означает, что я перебираю свои точки 3 раза, но мне нужно тщательно их отсортировать, чтобы в любом случае найти только видимые.

Итак, с точки зрения кода у меня теперь есть следующее:

private void stencilCircleAroundStars()
{
    //Lets try and draw something here using stencil
    glColorMask(false, false, false, false); //Disable colour mask
    glEnable(GL_STENCIL_TEST); // Enable Stencil Buffer For "marking" the outer circle
    glDisable(GL_DEPTH_TEST);// Disable Depth Testing

    for (Object value : stars.values())
    {
        Star star = (Star)value;

        glStencilFunc(GL_ALWAYS, 1, 1); // Always Passes, 1 Bit Plane, 1 As Mask
        glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); // We Set The Stencil Buffer To 1 Where We Draw Any Polygon

        //Draw the large circle
        starOb.location.copy(star.location);
        starOb.setScale(2000);
        starOb.draw();
    }

    for (Object value : stars.values())
    {
        Star star = (Star)value;
        //Now we change the functions and remove a slightly smaller circle from buffer.
        glStencilFunc(GL_ALWAYS, 0, 0); // Always passes, 0 bit plane, 0 as mask;
        glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); // We Set The Stencil Buffer To 0 Where We Draw Any Polygon
        starOb.location.copy(star.location);
        starOb.setScale(1900);
        starOb.draw();
    }

    //Now we enable the colour
    glColorMask(true, true, true, true);
    glStencilFunc(GL_EQUAL, 1, 1); // We Draw Only Where The Stencil Is 1
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // Don't Change The Stencil Buffer

    glColor4f(0.5f, 1.0f, 0.5f, 0.5f);
    for (Object value : stars.values())
    {
        Star star = (Star)value;
        starOb.location.copy(star.location);
        starOb.setScale(2000);
        starOb.draw();
    }

    //Now we are done .. disable
    glDisable(GL_STENCIL_TEST);  
}

Мои точки, по сути, являются объектами, называемыми "звездами" для целей моей программы, а StarOb - это набор четырехугольников, которые я загрузил из файла, которые образуют красивый гладкий круг.

Я отключаю цветовую маску и прохожу один раз, рисуя самый большой круг, который могу, в буфер трафарета и устанавливаю значение 1. Затем я снова повторяю цикл, рисуя меньший масштабированный круг в буфер трафарета, но на этот раз устанавливая значение из 0. Это должно оставить границу вокруг любой звезды, которая не касается других звезд, и эффективно удалит места их перекрытия.

Я, наконец, снова включаю цветовую маску и рисую цветные круги. буфер трафарета предотвращает рендеринг внутренних частей, и я получаю то, что хотел! Затем я отключаю буфер трафарета.

Если вы действительно хотели его увидеть, вот видео, на котором генерируется несколько увеличивающихся точек: Видео, как это работает

Вот версия низкого качества того, как это получилось (фон не рисовался во время тестирования ):

Overlapping circles with centre not drawn due to stencil

10
задан user1118321 23 March 2015 в 00:06
поделиться