2015-07-09 3 views
2

Учитывая следующий алгоритм:же код возвращает разные результаты

public static void Casteljau(Vector3 p1, Vector3 p2, Vector3 p3 , Vector3 p4, ArrayList L) 
{ 
    float stepping = (float)(0.02); 

    for (float x = 0.0f; x <= 1.0f; x += stepping) 
    { 
     Vector3 ap1 = Vector3.Lerp(p1, p2, x); 
     Vector3 ap2 = Vector3.Lerp(p2, p3, x); 
     Vector3 ap3 = Vector3.Lerp(p3, p4, x); 

     Vector3 bp1 = Vector3.Lerp(ap1, ap2, x); 
     Vector3 bp2 = Vector3.Lerp(ap2, ap3, x); 

     Vector3 p = Vector3.Lerp(bp1, bp2, x); 

     L.Add(p); 
    } 
} 

который получает четыре очка и возвращает список точек, представляющих кривой между ними и той же четыре точкой, переданной этой функцией, я получаю разные результаты в двух разных концах \ клиенты. Одна из расчетных точек имела небольшое отклонение от значения 0.1f между прогонами (его очень небольшая разница, но критическая для моего использования).

Этот алгоритм используется в многопользовательской игре (с использованием Unity3D), и оба конца работают с этим алгоритмом с точно то же самое четыре очка.

Каждое значение Vector является поплавок, язык C#, оба конца работает на том же компьютере (один клиент работает с помощью редактора Unity, еще один является executabe построен из единства), OS в Windows.

Lerp функции- http://docs.unity3d.com/ScriptReference/Vector3.Lerp.html

+0

Вы используете UNet? – user3071284

ответ

0

Если 0,1 точности важна для ваших глаз, работающих с двойниками может быть лучшей идеей, так как каждые Расчитать сделано с поплавками добавляют некоторые неточности. В вашем случае вы находитесь в цикле for, работающем с поплавками, поэтому несколько неточностей могут вызвать большую разницу.

Существует хороший StackOverflow ответ об этом: Floating point inaccuracy examples

Предложение было бы обернуть эти Vector3 в двойной версии Vector3. Что касается разницы между exe и редактором, это объясняется тем, что Exe и редактор не созданы для одной и той же цели. и ресурсы, доступные для них обоих, не являются одинаковыми. Теперь, если на том же ПК вам удастся найти разницу, вы, вероятно, не сможете получить чистый результат с нескольких ПК, которые не находятся на одной и той же архитектуре.