Как избежать самопересечения при применении обводки к кривой?

11

В моем коде есть несколько объектов Spline2D, каждый из которых имеет метод Position, Velocity и Acceleration, который возвращает вектор указанного количества в определенный момент времени. Я использовал эти векторы для построения геометрии для создания градиентных штрихов для кривых, но у меня проблемы с самопересечением на крутых кривых. Как пример, вот одна кривая, где у меня это происходит:

Каркас: http://twitpic.com/2zplw1/full
Заполнено: http://twitpic.com/2zpmnt/full

Как вы можете видеть, на втором изгибе внутренняя часть пересекает себя, что вызывает этот уродливый артефакт. Есть ли хороший алгоритм / метод для обводки кривых, не вызывая такого самопересечения?

РЕДАКТИРОВАТЬ : более крайние примеры, а также макет того, что я хотел бы достичь:

Каркас: http://twitpic.com/2ztwzi/full
Заполнено: http://twitpic.com/2ztwkt/full
Идеальный результат (Макет): http://twitpic.com/2ztxa8/full

ThatsGobbles
источник
Ух ты, я даже не осознавал смысл названия, когда писал его. :)
ThatsGobbles

Ответы:

3

Если вы визуализируете их с помощью графического процессора и любого современного трехмерного API (например, OpenGL / D3D), мне кажется, что вы можете избавиться от этого с помощью глубинного тестирования. Если вы назначите свои внешние вершины z = FAR, а ваши внутренние вершины - z = NEAR, тестирование глубины должно предотвратить показ перекрытия. С OpenGL:


  // don't forget to clear depth buffer to 1.0f at beginning of frame.
  glClearDepth(1.0f);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  // enable depth testing.
  glEnable(GL_DEPTH_TEST);
  glDepthFunc(GL_LEQUAL);

// draw the Spline2D for each segment in spline for each vert in segment if (vert is an outer vert), set vert.z = 1.0, otherwise set vert.z=0.0

Будьте бдительны: это не сработает, если вам нужны полупрозрачные штрихи.

jpaver
источник
1
Отличный ответ, именно то, о чем я думал, однако, вы ошибаетесь в том, что он не работает для полупрозрачных штрихов, если вы разрешаете писать zbuffer за один проход, а затем делать цвет во втором.
Ричард Fabian
Спасибо, мои штрихи действительно непрозрачны, так что это сработало очень просто и чудесно!
ThatsGobbles
1

«Исправление» будет зависеть от того, как вы хотите, чтобы результирующий вывод был похож. Проблема на самом деле не была достаточно хорошо определена: как это должно выглядеть?

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

Вы хотите, чтобы это сложилось? Перекрываются с краем? Потяните, пока он не перекрывается?

Ричард Фабиан
источник
Хорошая мысль, я сегодня подберу кривую с более резким поворотом и "идеальную" кривую в Illustrator или Inkscape.
ThatsGobbles
Оригинальное сообщение отредактировал!
ThatsGobbles