Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Округление при сложении/вычитании дробных чисел (http://www.flasher.ru/forum/showthread.php?t=177358)

Djay 30.03.2012 11:02

Округление при сложении/вычитании дробных чисел
 
С добрым утром! Есть задача перемещать объекты по кривой траектории слева направо и справа налево, меняя их скорость в зависимости от угла наклона. Столкнулся с проблемой при сложении и вычитании дробного числа. Код такой:

Код AS1/AS2:

var angle:Number = getAngle(object.x, object.direction);
var speed:Number = object.speed * Math.cos(angle / 180 * Math.PI);
object.x += object.direction ? -speed : speed;
 
trace("---");
trace(speed);
trace(object.x);

Результат при сложении исходное значение object.x = 70:

---
1.986476715483886
71.95
---
1.98779389282904
73.9
---
1.9902263669020062
75.85

Результат при вычитании object.x = 1410:

---
1.969615506024416
1408
---
1.9771634389942234
1406
---
1.9836407030825234
1404

Как видно во втором случае вычитаемое он округляет в большую сторону, а в первом:
70 + 1.986 = 71.95 как???

Подскажите, пожалуйста, в чем дело и как с этим бороться?

-De- 30.03.2012 11:14

Загугли as3 твип. У DisplayObject x и y кратны 1/20 в общем. Если критично, чтоб оно точнее считало, то завести отдельно числа, к которым прибавлять скорость и потом уже x и y к ним приравнивать.

Silicium 30.03.2012 11:15

Объявить две переменные типа Number для хранения значений координат (можно и Point в принципе), изменять их, а после присваивать координатам экранного объекта.

iNils 30.03.2012 11:19

Цитата:

70 + 1.986 = 71.95 как???
Координаты визуальных объектов имеют точность 0.05 пикселя. Связано это с тем, что координаты хранятся в целых значениях единицы измерения твипс (twips), который равен 1/20 пикселя. Отсюда и округления.
Поэтому, если вы хотите иметь более точные значения. То координаты вы должны хранить в специальных переменных и проводить все манипуляции с ними, а уже потом присваивать их значении координатам объекта.

strangedk 30.03.2012 11:57

Я зачастую оперирую координатами в типе int, и перед присваиванием использую конструкцию вида

Код AS3:

mc.x = int(newX);

У меня еще не было подобных задач, но я помню что-то о том, что нужно располагать объекты не в 0px или 1px, а в 0.5px.

Напомните, если ясно о чем я.

Djay 30.03.2012 12:47

Да, я не знал про эту особенность. Спасибо огромное за подсказку! Такая степень точности нужна из-за малых углов наклона криволинейной траектории, в интервале ~ [-10, + 10] градусов. Объект должен двигаться с постоянной скоростью, и, соответственно, при подъеме и спуске постоянная x-составляющая скорости должна падать на величину наклона. При прохождении пути на большом количестве итераций погрешность от сотых долей вырастает в десятки пикселей, что уже критично.

Yahen 30.03.2012 13:38

Цитата:

Сообщение от strangedk (Сообщение 1071970)
Я зачастую оперирую координатами в типе int, и перед присваиванием использую конструкцию вида

Код AS3:

mc.x = int(newX);

У меня еще не было подобных задач, но я помню что-то о том, что нужно располагать объекты не в 0px или 1px, а в 0.5px.

Напомните, если ясно о чем я.

Да. Да +0.5 к вычислениям Это в as3 регулярно.


Часовой пояс GMT +4, время: 19:09.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.