Nano Hash - криптовалюты, майнинг, программирование

Экстраполировать разделенную кубическую безье на 1,1

Мне нужна помощь с решением, представленным здесь.

Создать простую функцию со скидкой 40%

Мне нужно изменить его так, чтобы возвращенные левые и правые экстраполировались на 1,1 после разделения. Это потому, что если я не экстраполирую, я не могу использовать возвращенный разделенный кубический Безье в качестве перехода css.

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

Код, используемый для получения этого пути Майка, таков:

var result = split({
    z: .5,
    x: [0, 0.42, 0.58, 1],
    y: [0, 0, 1, 1]
});
alert(result.toSource());

Ответы:


1

первая половина - это легкость, которая является кубической-безье (.42,0,1,1) и графически http://cubic-bezier.com/#.42,0,1,1

Пожалуйста, проверьте это предположение. (исходные конечные точки кривых — 0,0 и 1,1 в css функция синхронизации) Первая половина кривой Безье [0,0, .42,0, .58,1, 1,1] не должна быть [0,0 .42,0, 1,1 , 1,1] Конечные точки правильные (после масштабирования до 1,1), но вы потеряли там непрерывность.

Значения, возвращаемые алгоритмом Майка, верны.

Попробуйте эту визуализацию, чтобы понять, почему ваше предположение может быть неверным.

Алгоритм, который вы используете для разделения, является хорошо известным алгоритмом, называемым алгоритмом де Кастельжо. Этот метод можно геометрически выразить очень просто. Посмотрите анимированные визуализации того, как возможно такое разделение в произвольной точке https://en.wikipedia.org/wiki/B%C3%A9zier_curve.

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

06.05.2014
  • забавно, что на самом деле это был не алгоритм де Кастельжо — код, который я предоставил, был основан на прямых формулах, возникающих при решении расщепления с использованием матричных представлений, а не на итеративном подходе де Кастельжо. Конечно, результат будет тот же, но количество шагов разное =) 08.05.2014
  • На самом деле в оригинальной статье де Кастельжо он написал это в расширенной форме (courbes et surface `a pˆoles). Он точно не советовал циклы или какие-либо итерации! : P То же самое, конечно, можно получить, написав базис Бернштейна в матричной форме. 08.05.2014
  • Мне нужно получить эту бумагу = P (также, SO использует современный html, буквы с акцентом должны работать нормально =) 08.05.2014
  • Бумага, к сожалению, в виде неопубликованных заметок. Я не уверен, что мы можем найти его в Интернете. Вы можете найти сканы соответствующих частей оригинала, включая расширенную форму куба и вывод рекуррентного соотношения, из статей Фаруки или Фарина по этому вопросу. Интересно, что де Кастельжо не установил явной связи с базисом Бернштейна. Хотя его идеи для оценки кривых были более общими, для более низких степеней он просто записал рекуррентные соотношения как есть. (насчет акцентов, скопировал из pdf, может быть поэтому :)). 09.05.2014
  • Спасибо @Mike'Pomax'Kamermans и hkrish за помощь. Я снова работаю над этим и сообщу, что у меня получилось :) Особенно спасибо hkrish за эту визуализацию, она потрясающая !! 13.10.2014
  • Супер, спасибо @hkrish, я только что изучил вашу визуализацию, и вы получили ее, удвоив баллы, визуализация просто потрясающая!!! Я принял ваш ответ сейчас, большое спасибо! 13.10.2014
  • Вопрос, пожалуйста, как вы масштабировали правильную функцию? Для левого мы удвоили все значения, а вот для второго не уверен. Вы прошли отсюда [0.5, 0.5, 0.645, 0.75, 0.79, 1, 1, 1] в [0, 0, 0.29, 0.5, 0.58, 1, 1, 1]. 13.10.2014
  • Большое спасибо @hkrish. Я понял, как это экстраполировать, его нормализацию координат :) понял это отсюда: math.stackexchange.com/questions/971454/ Я создал модифицированную версию функции разделения Майка, чтобы она соответствовала единице квадрат :) Плохой пост ниже 15.10.2014

  • 2

    Я создал модифицированную версию функции разбиения Майка, чтобы она соответствовала единичному квадрату :) Она использует указатели hkrish для нормализации координат.

    Просто установите для параметра fitUnitCell значение true. :)

    function splitCubicBezier(options) {
      var z = options.z,
          cz = z-1,
          z2 = z*z,
          cz2 = cz*cz,
          z3 = z2*z,
          cz3 = cz2*cz,
          x = options.x,
          y = options.y;
    
      var left = [
        x[0],
        y[0],
        z*x[1] - cz*x[0], 
        z*y[1] - cz*y[0], 
        z2*x[2] - 2*z*cz*x[1] + cz2*x[0],
        z2*y[2] - 2*z*cz*y[1] + cz2*y[0],
        z3*x[3] - 3*z2*cz*x[2] + 3*z*cz2*x[1] - cz3*x[0],
        z3*y[3] - 3*z2*cz*y[2] + 3*z*cz2*y[1] - cz3*y[0]];
    
      var right = [
        z3*x[3] - 3*z2*cz*x[2] + 3*z*cz2*x[1] - cz3*x[0],
        z3*y[3] - 3*z2*cz*y[2] + 3*z*cz2*y[1] - cz3*y[0],
                        z2*x[3] - 2*z*cz*x[2] + cz2*x[1],
                        z2*y[3] - 2*z*cz*y[2] + cz2*y[1],
                                        z*x[3] - cz*x[2], 
                                        z*y[3] - cz*y[2], 
                                                    x[3],
                                                    y[3]];
    
      if (options.fitUnitSquare) {
        return {
          left: left.map(function(el, i) {
            if (i % 2 == 0) {
              //return el * (1 / left[6])
              var Xmin = left[0];
              var Xmax = left[6]; //should be 1
              var Sx = 1 / (Xmax - Xmin);
              return (el - Xmin) * Sx;
            } else {
              //return el * (1 / left[7])
              var Ymin = left[1];
              var Ymax = left[7]; //should be 1
              var Sy = 1 / (Ymax - Ymin);
              return (el - Ymin) * Sy;
            }
          }),
          right: right.map(function(el, i) {
            if (i % 2 == 0) {
              //xval
              var Xmin = right[0]; //should be 0
              var Xmax = right[6];
              var Sx = 1 / (Xmax - Xmin);
              return (el - Xmin) * Sx;
            } else {
              //yval
              var Ymin = right[1]; //should be 0
              var Ymax = right[7];
              var Sy = 1 / (Ymax - Ymin);
              return (el - Ymin) * Sy;
            }
          })
        }
      } else {
       return { left: left, right: right};
      }
    }
    
    var easeInOut = {
      xs: [0, .42, .58, 1],
      ys: [0,   0,   1, 1]
    };
    
    
    var splitRes = splitCubicBezier({
      z: .5,
      x: easeInOut.xs,
      y: easeInOut.ys,
      fitUnitSquare: false
    });
    
    alert(splitRes.toSource())
    
    15.10.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..