Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.03.2012, 11:02
Djay вне форума Посмотреть профиль Отправить личное сообщение для Djay Найти все сообщения от Djay
  № 1  
Ответить с цитированием
Djay

Регистрация: Feb 2012
Сообщений: 11
По умолчанию Округление при сложении/вычитании дробных чисел

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

Код 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 как???

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

Старый 30.03.2012, 11:14
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 2  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Загугли as3 твип. У DisplayObject x и y кратны 1/20 в общем. Если критично, чтоб оно точнее считало, то завести отдельно числа, к которым прибавлять скорость и потом уже x и y к ним приравнивать.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 30.03.2012, 11:15
Silicium вне форума Посмотреть профиль Отправить личное сообщение для Silicium Найти все сообщения от Silicium
  № 3  
Ответить с цитированием
Silicium
 
Аватар для Silicium

Регистрация: Sep 2010
Адрес: Ростов-на-Дону
Сообщений: 369
Объявить две переменные типа Number для хранения значений координат (можно и Point в принципе), изменять их, а после присваивать координатам экранного объекта.

Старый 30.03.2012, 11:19
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 4  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Цитата:
70 + 1.986 = 71.95 как???
Координаты визуальных объектов имеют точность 0.05 пикселя. Связано это с тем, что координаты хранятся в целых значениях единицы измерения твипс (twips), который равен 1/20 пикселя. Отсюда и округления.
Поэтому, если вы хотите иметь более точные значения. То координаты вы должны хранить в специальных переменных и проводить все манипуляции с ними, а уже потом присваивать их значении координатам объекта.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 30.03.2012, 11:57
strangedk вне форума Посмотреть профиль Отправить личное сообщение для strangedk Найти все сообщения от strangedk
  № 5  
Ответить с цитированием
strangedk
 
Аватар для strangedk

Регистрация: Oct 2010
Адрес: Харьков
Сообщений: 616
Записей в блоге: 1
Отправить сообщение для strangedk с помощью ICQ Отправить сообщение для strangedk с помощью Skype™
Я зачастую оперирую координатами в типе int, и перед присваиванием использую конструкцию вида

Код AS3:
mc.x = int(newX);
У меня еще не было подобных задач, но я помню что-то о том, что нужно располагать объекты не в 0px или 1px, а в 0.5px.

Напомните, если ясно о чем я.
__________________
adobe AS3 manual

Старый 30.03.2012, 12:47
Djay вне форума Посмотреть профиль Отправить личное сообщение для Djay Найти все сообщения от Djay
  № 6  
Ответить с цитированием
Djay

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

Старый 30.03.2012, 13:38
Yahen вне форума Посмотреть профиль Отправить личное сообщение для Yahen Посетить домашнюю страницу Yahen Найти все сообщения от Yahen
  № 7  
Ответить с цитированием
Yahen

Регистрация: Jan 2012
Сообщений: 35
Цитата:
Сообщение от strangedk Посмотреть сообщение
Я зачастую оперирую координатами в типе int, и перед присваиванием использую конструкцию вида

Код AS3:
mc.x = int(newX);
У меня еще не было подобных задач, но я помню что-то о том, что нужно располагать объекты не в 0px или 1px, а в 0.5px.

Напомните, если ясно о чем я.
Да. Да +0.5 к вычислениям Это в as3 регулярно.
__________________
----
Когда мне странно, то я заполняю книжку записей

Создать новую тему Ответ Часовой пояс GMT +4, время: 23:55.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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