2015-02-05 6 views
0

Я много искал в googled, но все алгоритмы, которые я нашел, использовали уравнения для нахождения контрольных точек. Я подумал, что есть более простое решение для этого и нашел некоторую реализацию в исходном коде ExtJS: http://docs-devel.sencha.com/extjs/4.1.2/source/Draw.html#Ext-draw-Draw-method-getAnchors. Он использует углы между ближайшими точками линии для обнаружения контрольных точек и некоторых хаков.Алгоритм поиска контрольных точек кубического безье (подробности реализации)

Может ли кто-нибудь определить, какой алгоритм для поиска контрольных точек это? Я застрял в манипуляции с ПИ и углами. Может быть, есть более подробное и более чистое объяснение или общая идея для этого способа решения проблемы?

ответ

2

Это Catmull-Rom штука: код пытается найти соответствующую касательную через точку X, исходя из местоположения точек X-1 и X + 1, так что касательная параллельна линии (X-1) - (X + 1), а затем спрятаться с контрольными точками, которые дают, чтобы убедиться, что «входящие» и «исходящие» касательные дают эстетически привлекательную кривую.

enter image description here

  1. имеют точки
  2. считать, тангенс, равный (р-1) - (р + 1)
  3. , что в целом выглядит ужасно
  4. масштаба
  5. контрольных точек мало для лучшей подгонки

Как вы делаете шаг 4 технически уже не Catmull-Rom, потому что настоящие сплайны Catmull-Rom останавливаются после касания t. Обычный подход, если вам нужен шаг 4, - это масштабирование точек в зависимости от прогнозируемого расстояния: если вы проецируете точку X на линию (X-1) - (X + 1), она редко будет в точности в середине линии, но на некотором расстоянии v% от точки X-1 и расстояния (100-v)% от точки X + 1, поэтому вы соответствующим образом меняете найденную касательную.

+0

Можете ли вы описать, какие части кода соответствуют этапам алгоритма? Я все еще не могу описать, как часть 4 работает в коде Sencha. –

+0

Ищите «Последняя корректировка, убедитесь, что контрольная точка привязки не проходит вертикально мимо» в файле, который вы связали –

+0

Я читал статьи о Catmull-Rom, но не нашел объяснений, подобных вашим. Все формулы таковы: 0,5f * ((2 * p1) + (p2 - p0) * t + (2 * p0 - 5 * p1 + 4 * p2 - p3) * t * t + (3 * p1 -p0 - 3 * p2 + p3) * t * t * t); } Может быть, в коде Sencha используется не другая версия алгоритма? –

Смежные вопросы