На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Сплайн Безье
    Имеется сегмент сплайна Безье: 2 вершины и 2 управляющие точки.
    При добавлении новой вершины в сегмент (разбивке сегмента на 2), нужно каким-то образом пересчитать положение управляющих точек так, чтобы форма кривой не изменилась.
    Кто-нибудь знает как это делается?
      Точки исходной кривой P0, P1, P2, P3
      если мы режем ее в точке PP с параметром t, то
      P0'=P0
      P3'=PP
      P1'=P0+t*(P1-P0)  (лежит на отрезке P0P1, делит его в отношении t:1-t)
      PX(вспомогательная) - на отрезке P1P2, делит его так же
      P2' - на отрезке P1'PX, делит его так же

      аналогично для второй кривой, только отношение обратное


        Спасибо, MBo.
        Когда новая вершина добавляется примерно посередине сегмента, твои формулы отлично работают.
        Но: если добавить точку достаточно близко к P0, P2' попадает не на отрезок P1'P3',
        а на его продолжение за точку P3'. В результате кривая приобретает излом.

        Или я чего-то не понимаю? :-)
          Писал навскидку, мог наврать. Вот выдержка (FP - к.т. исх. кривой)

           tt := 1 - t;
           t0 := tt * tt * tt;
           t1 := 3 * tt * tt * t;
           t2 := 3 * tt * t * t;
           t3 := t * t * t;
           Curve1.CPt[0] := FP[0];
           xx := Round(FP[0].x * t0 + FP[1].x * t1 + FP[2].x * t2 + FP[3].x * t3);
           yy := Round(FP[0].y * t0 + FP[1].y * t1 + FP[2].y * t2 + FP[3].y * t3);
           Curve1.CPt[3] := Point(xx, yy);
           Curve1.CPt[1] := Point(Round(FP[0].x * tt + FP[1].x * t), Round(FP[0].y * tt + FP[1].y * t));
           xx := Round((FP[1].x * tt + FP[2].x * t));
           yy := Round((FP[1].y * tt + FP[2].y * t));
           Curve1.CPt[2] := Point(Round(Curve1.CPt[1].x * tt + xx * t), Round(Curve1.CPt[1].y * tt + yy * t));
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0.0589 ]   [ 15 queries used ]   [ Generated: 8.10.26, 01:36 GMT ]