Код или формула для пересечения двух парабол в любом вращении

Поскольку процесс входа в систему занимает умеренное количество кода, рассмотрите возможность помещения его в свою собственную автономную функцию, которая возвращает Promise. Сделайте то же самое для добавления пользователя, и затем вы можете использовать одиночный .catch в конце, если есть ошибка, возвращая все Обещания, чтобы они были правильно соединены воедино, избегая обещания анти-шаблон обратного вызова:

FirebaseHelper.getDataFromDB("users", profileSort.email )
  .then(({ exists }) => (
    exists
    ? updateData()
    : addUser()
  ))
  .then((profileSort) => {
    done(null, profileSort);
  })
  .catch((err) => {
    done(err);
  });

  function updateData() {
  return FirebaseHelper.updateDataInDb("authentication", profileSort.email, TokenToStore)
  //User signs in, check if we have tokens for meetup, eventbrite
    .then(() => {
      return FirebaseHelper.getDataFromDB("authenticat", profileSort.email);
    })
    .then(response => {
    //if yes, store them in session
    if (response.exists) {
      req.session.contextToken = response.data();
      if (req.session.contextToken.meetupAccessToken) {
        profileSort.meetup = true;
        profileSort.eventbrite = true;
      }
      //Replace the token with currret store token
      req.session.contextToken = {...req.session.contextToken, ...TokenToStore}
    }
    return profileSort;
  });
}
function addUser() {
  //adding user and storing authentication information
  return FirebaseHelper.setDataToDb("users", profileSort.email, profileSort)
    .then(() => {
      return FirebaseHelper.setDataToDb("authentication", profileSort.email, TokenToStore)
  })
    .then(() => profileSort);
  return done(null, profileSort)
}

Было бы даже лучше, если бы содержащая функция возвращала Promise, а не принимала обратный вызов done - с обещаниями работать намного лучше, чем с обратными вызовами, в конце концов:

function doStuff() {
  return FirebaseHelper.getDataFromDB("users", profileSort.email )
    .then(({ exists }) => (
      exists
      ? updateData()
      : addUser()
    ));
  // ...

Тогда вместо

doStuff((err, profileSort) => {
  // ...

вы можете сделать

doStuff()
  .then((profileSort) => {
    // handle success
  })
  .catch((err) => {
    // handle errors
  })

, используя async / await вместо .then s может сделать код еще короче, хотя не знаю, поддерживает ли это ваша среда.

5
задан Knyphe 23 September 2010 в 18:21
поделиться

1 ответ

Я сначала определил бы уравнение для параболической дуги в 2D без вращений:

  x(t) = ax² + bx + c
  y(t) = t;

Можно теперь применить вращение путем создания матрицы вращения:

  s = sin(angle)
  c = cos(angle)

  matrix = | c -s |
           | s  c |

Примените ту матрицу, и Вы получите повернутое параметрическое уравнение:

x' (t) = x(t) * c - s*t;
y' (t) = x(t) * s + c*t;

Это даст Вам два уравнения (для X и Y) Ваших параболических дуг.

Сделайте это для обеих из Ваших повернутых дуг и вычтите их. Это дает Вам уравнение как это:

  xa'(t) = rotated equation of arc1 in x
  ya'(t) = rotated equation of arc1 in y.
  xb'(t) = rotated equation of arc2 in x
  yb'(t) = rotated equation of arc2 in y.
  t1 = parametric value of arc1
  t2 = parametric value of arc2

  0 = xa'(t1) - xb'(t2)
  0 = ya'(t1) - yb'(t2)

Каждый из них уравнение является просто многочленом порядка 2. Их легко решить.

Для нахождения точек пересечения, Вы решаете вышеупомянутое уравнение (например, найдите корни).

Вы доберетесь два, поддерживает каждую ось. Любой корень, который равен на X и Y, является точкой пересечения между кривыми.

Получение положения легко теперь: Просто включите корень в свое параметрическое уравнение, и можно непосредственно получить X и Y.

6
ответ дан 14 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: