Допуск, используемый для определения равенства вектора3d и длины вектора3d.C++

Программы на C++. Форум разработчиков
Ответить
Гость
 Допуск, используемый для определения равенства вектора3d и длины вектора3d.

Сообщение Гость »

Я использую допуск=1e-10, чтобы проверить, равны ли два вектора Vector3d, используя следующую функцию is_same:

Код: Выделить всё

bool is_same(const vector3d& x, const vector3d& y) {
var delta = x-y;
return delta.length() < tolerance; // tolerance is 1e-10
}
Но вот возникла ситуация, которую я не могу исправить. У меня есть класс lineSegments,

Код: Выделить всё

struct lineSegments {
vector3d s, e; // s means start point, e means end point
}
Когда я вычисляю пересечение двух линейных сегментов. Я использовал уравнение (e1-s1)*k1+s1 = (e2-s2)*k2+s2, чтобы получить k1 ​​и k2, поэтому точка пересечения равна (e1-s1)*k1+s1 .

Но когда два сегмента строки такие:

Код: Выделить всё

auto l1 = lineSegments{
{639482584.0, 2115435624.0, 0},    // s1
{1658825857.0, 1245760131.0, 0}};  // e1
auto l2 = lineSegments{
{1764535160.0, 1562640819.0, 0},   // s2
{1658825857.0, 1245760131.0, 0}};  // e2
Я получил k1=1.0000000000000011, k2=0.99999999999999989. А затем я использую is_same, чтобы проверить точку пересечения с точкой P{1658825857.0, 1245760131.0, 0}, это не удалось. Поскольку дельта-длина=((e1-s1)*k1+s1-P).length() равна 4,76837158203125E-07, что больше, чем 1e-10.
Как я могу исправить эту ошибку? Или мне следует использовать вектор небольшой длины для изменения моей функции?


Подробнее здесь: https://stackoverflow.com/questions/784 ... f-vector3d
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»