2016-01-20 5 views
1

У меня две части кривой. Известно положение точек (x, y) кривой. Как подключить их и получить позицию соединительной кривой? Вот аналогичный вопрос. similar question Он сказал, чтобы использовать кривые Безье. Но, по моему мнению, обычно фитинговая кривая не проходит через контрольные точки. Поэтому, если я выбираю некоторые точки из двух частей кривой в качестве контрольных точек, результат подгонки может быть следующим образом. Это не моя цель. Может кто-нибудь дать мне совет?Как подключить две части кривой и получить положение точек соединения кривой?

enter image description here

enter image description here

+1

Затем используйте альтернативное предложенное решение, которое является сплайнами :), потому что кривая проходит от точек –

+0

или кривых Катмулла-Рома, которые также проходят через точки и тривиально переписываются в кубическую форму Безье. Этот вопрос в значительной степени буквально то, что они были изобретены для =) –

ответ

0

Как я заметил сплайнов может быть лучшим решением, чем Безье в этом случае. Однако вы также можете использовать более простой. у вас есть 4 балла (красный). Постарайтесь, чтобы соответствовать их в полиномиальное (3-й степени, так как у вас есть только 4), используя следующую формулу:

A x^3 + B x^2 + C x + D = y 

У вас есть 4 Очки (P0,P1,P2,P3):

A x0^3 + B x0^2 + C x0 + D = y0 
A x1^3 + B x1^2 + C x1 + D = y1 
A x2^3 + B x2^2 + C x2 + D = y2 
A x3^3 + B x3^2 + C x3 + D = y3 

Решая эту систему линейных уравнений даст вам значения A,B,C,D.

Чтобы получить часть кривой, которая отсутствует:

for(auto x=P1.x; x<P2.x; ++x){ 
    auto y=A*x*x*x + B*x*x + C*x + D; 
    cv::circle(image,cv::Point(x,y),.......); 
} 
+0

Спасибо за ваш комментарий. Но я думаю, что экспресс-кривая при y = A x^3 + B x^2 + C x + D не очень хороша, потому что форма поворачивается. http://www.mathopenref.com/cubicexplorer.html – kookoo121

+0

Вы показали, что у вас всего 4 балла, поэтому нет другого варианта. У вас есть еще? –

+0

@ Все точки на кривой известны. Мы можем использовать каждую точку. Я только что выбрал четыре из них. – kookoo121

0

Не исключаю, кривые Безье. Вы правы, что кривая часто не пересекает контрольные точки, но конечные точки делают, и вы можете использовать это, чтобы ограничить форму кривой.

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

Bezier

В приведенном выше примере, красные круги являются фиксированными конечными точками кривой, зеленые линии являются расширенные линии, синий круг их точка пересечения (используется в качестве контрольной точки), а также Синяя линия - приблизительная кривая, в которой вы закончите.

Редактировать: Подумав об этом немного больше, вы, вероятно, захотите использовать кубическую кривую и иметь две синие контрольные точки, по одной на каждую зеленую линию. Позиционирование каждого из них L/2 расстояние от конечных точек, где L - прямое расстояние между красными оконечными точками, вероятно, даст хорошие результаты. Проблема с квадратичной кривой состоит в том, что по мере приближения зеленых линий квадратичная кривая будет иметь острый угол вблизи контрольной точки. Параллельно они фактически не пересекаются. Использование кубической кривой даст много линий и не будет иметь проблемы с параллельными касательными. Например, на изображении ниже верхняя кривая использует квадратичную (одну контрольную точку), а нижняя - кубическую (две контрольные точки).

Bezier2

+0

Спасибо за ваш комментарий. Можете ли вы показать мне подробности о том, как получить расширенные линии? – kookoo121

+0

@ kookoo121 Это зависит от того, как определяются ваши исходные строки, но при условии, что они определены параметрически, вы должны иметь возможность выводить касательные векторы в конечных точках, а затем использовать обычное [пересечение линии] (https: // en. wikipedia.org/wiki/Line%E2%80%93line_intersection). Например, если ваши две исходные строки были их собственными кривыми Безье, вектор от последней контрольной точки до конечной точки является касательным вектором. – MooseBoys

+0

Большое спасибо. Я попробую – kookoo121

3

Используйте Катмулла-Rom кривой, которая связана с кривыми Безье и легко конвертировать в Безье форму, с выгодой, которая проходит «через» точки, вместо того, чтобы просто контролируются ими.Для мелких деталей см http://pomax.github.io/bezierinfo/#catmullconv, но мы в основном нужны эти две конечных точек и две точки вне кривой, которые обеспечивают нам правильную касательная два наших на-кривые точки:

enter image description here

p2 и p3 являются «вашими» точками, а p1 и p4 несколько произвольны: нам просто нужно убедиться, что линия параллельна касательной в точке p2 (касательная и ее параллельная линия, указанная синевато-фиолетовым), и аналогично, что линия p2--p4 параллельно касательной при р3 (касательная и ее параллельная линия, обозначенная розоватым). Обычно легкий подход - это просто project points p2 and p3 onto the parallel lines.

Пока мы уверены, что это правда, мы можем сформировать соединительный сегмент как сегмент Catmull-Rom с координатами кривой (p1, p2, p3, p4). Если нет Катмулла-ROM не простейший элемент графического изображения, хотя, мы можем тривиально сделать его в виде кривой Безье, с использованием следующей кубической кривой Безье координаты:

  1. начальную точку: P2
  2. контрольная точка 1: р2 + (р3-р1)/(6 * т)
  3. контрольная точка 2: р3 - (р4-р2)/(6 * т)
  4. конечная точка: р3

t значение здесь является натяжение кривой Катмулла-Рома; чем выше вы это делаете, тем «более жесткое» соединение выглядит (с напряжением по умолчанию в большинстве графических контекстов, которые поддерживают Catmull-Rom, просто 1).

Некоторые примеры значений:

enter image description here

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

+0

Спасибо! Это хорошая идея. – kookoo121

+0

это действительно так, потому что это то, для чего явно разработаны кривые Катмулла-Рома. Просто помните, что вы находитесь в stackoverflow: если какой-либо из ответов полезен, откройте их.И если кто-либо из них ответит на ваш вопрос, отметьте их как правильный ответ, потому что это поможет другим людям, которые найдут этот вопрос через веб-поиск. –

+0

Могу ли я задать еще два вопроса? 1. Зачем нужны начальные/конечные точки p1, p4 на параллельной линии? Могу ли я использовать точки на кривой как начальные/конечные и контрольные точки, потому что я знаю все позиции точек на кривой. 2. Я нашел уравнение 2 здесь http://www.mvps.org/directx/articles/catmull/, но я хочу использовать больше контрольных точек, чтобы сделать его более точным. Можете ли вы показать мне общее уравнение, например, я хочу использовать 10 контрольных точек – kookoo121

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

  • Нет связанных вопросов^_^