Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 2D-программирование

2D-программирование Вопросы, касающиеся двумерного программирования

Ответ
 
Опции темы
Старый 25.05.2011, 10:06   #1
Vadimich
Нуждающийся
 
Аватар для Vadimich
 
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений
(для 3 пользователей)
Уменьшения числа

Привет всем! Хочу узнать, какой самый быстрый и наиболее оптимизированный способ свести случайное значение на 0...
оно может быть как положительным, так и отрицательным

к примеру я бы сделал что-то вроде этого:

a# = Rnd (-10,10); задаем случайное значение
s# = .1; шаг уменьшения

;в цикл

If a>0 Then

If a>s Then
a = a - s
Else
a = 0
EndIf

Else If a<0

If a<(-s) Then
a = a + s
Else
a = 0
EndIf

EndIf

насколько это оптимальный вариант, когда производительность критична?
еще был самый простой вариант - делить... это вообще одна строчка.. но мне как-то советовали избегать вычеслений
с длинными числами с плавающей точкой. Помогите, пожалуйста
(Offline)
 
Ответить с цитированием
Старый 25.05.2011, 11:04   #2
Dzirt
Элита
 
Аватар для Dzirt
 
Регистрация: 16.01.2008
Сообщений: 1,800
Написано 958 полезных сообщений
(для 3,833 пользователей)
Ответ: Уменьшения числа

Измеряй сколько времени требуется для твоего способа и для других(в том числе и з плавающей точкой), результаты потом сравниш.
Это хорошая практика оптимизации для всех вычеслений.
(Offline)
 
Ответить с цитированием
Старый 25.05.2011, 11:06   #3
LLI.T.A.L.K.E.R.
Мастер
 
Аватар для LLI.T.A.L.K.E.R.
 
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений
(для 504 пользователей)
Ответ: Уменьшения числа

If a>0 Then

If a>s Then
По крайней мере If a>s Then мне кажется лишним.

Если что, ещё советовали:
Не делить /10, а умножать на *0.1
но в итоге выходит что-то, вроде : 0+E1223

Добавлено:
тогда наоборот If a>0 Then лишне
(Offline)
 
Ответить с цитированием
Старый 25.05.2011, 11:10   #4
Vadimich
Нуждающийся
 
Аватар для Vadimich
 
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: Уменьшения числа

думаю, что без If a>s число станет меньшим чем ноль (например, если S будет не ровным) и уже начнет обрабатываться условием If a<0... т.е. будет постоянно смещаться то више нуля, то ниже
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
LLI.T.A.L.K.E.R. (25.05.2011)
Старый 25.05.2011, 11:47   #5
LLI.T.A.L.K.E.R.
Мастер
 
Аватар для LLI.T.A.L.K.E.R.
 
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений
(для 504 пользователей)
Ответ: Уменьшения числа

Посмотрел новый блитз-хелп (а какой он сейчас версии?)
что-то новенькое Sgn (number)

a#=Int(Sgn(a#))*(Abs(a#)-s#))
Int() может быть не нужен.. просто Note: non-integer values return the sign to 7 signigicant figures. (e.g. -1.000000)

Измеряй сколько времени требуется для твоего способа и для других(в том числе и з плавающей точкой), результаты потом сравниш.
(Offline)
 
Ответить с цитированием
Старый 25.05.2011, 11:53   #6
Черный крыс
 
Сообщений: n/a
Ответ: Уменьшения числа

А вот так ?

Local a:Int = Rand(-100, 100)
Local s:Int = -1
 
a = (Abs(a) + s) * Sgn(a)
Это код на БМаксе.
Abs(x) - возвращает модуль числа.
Sgn(x) - возвращает знак числа.

Я оперирую с челыми числами, так как для процессора это гораздо быстрее...

Уже опередили! )))
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
LLI.T.A.L.K.E.R. (25.05.2011)
Старый 25.05.2011, 12:01   #7
Черный крыс
 
Сообщений: n/a
Ответ: Уменьшения числа

Или так :

Local a:Float = Rand(-100.0, 100.0)
Local s:Float = 0.9
 
a:*s
С каждым шагом, переменная а будет уменьшатся на 10% ( подходит когда нужно движение с плавным замедлением )
 
Ответить с цитированием
Старый 25.05.2011, 12:44   #8
Dream
быдло
 
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений
(для 1,489 пользователей)
Ответ: Уменьшения числа

умножение на дробное число никогда не приведёт к резельтату 0 (если конечно одно из чисел уже не является нулем) самый простой -
function Test(start#,step#)
doExite=(star = 0) (или как там сравнить, забыл уже)

while (doExit)
if(start#>0)
start=start-step;
if(start<=0)
doExite=1
endif

else
start=start+step
if(start>=0)
doExite=1;
endif
endif

do

endfunction
Sgn (number) - всегда вроде было
(Offline)
 
Ответить с цитированием
Старый 25.05.2011, 13:05   #9
LLI.T.A.L.K.E.R.
Мастер
 
Аватар для LLI.T.A.L.K.E.R.
 
Регистрация: 24.06.2009
Адрес: Набережные Челны
Сообщений: 930
Написано 292 полезных сообщений
(для 504 пользователей)
Ответ: Уменьшения числа

Sgn (number) - всегда вроде было
ой, да
проверил свой 1.88
есть! просто не по алфавиту сортированы - не читаемо.
(Offline)
 
Ответить с цитированием
Старый 25.05.2011, 13:38   #10
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Уменьшения числа

юзай lerp
http://en.wikipedia.org/wiki/Lerp_(computing)

a+c*(b-a)

где c = процент (0 до 1) перехода из a в b

----
с длинными числами с плавающей точкой.
в блице длина всех дробных числе должна быть одинакова (в байтах, т.е. они же все флоаты).
твоя куча if сожрёт больше времени чем пара операций с дробными числами
а вообще это экономия на спчиках
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
baton4ik (26.05.2011), Dream (25.05.2011)
Старый 25.05.2011, 13:45   #11
Dream
быдло
 
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений
(для 1,489 пользователей)
Ответ: Уменьшения числа

ТРЕБУЮ БЕНЧМАРК! 4 if против линейной интерполяции
(Offline)
 
Ответить с цитированием
Старый 25.05.2011, 13:56   #12
Vadimich
Нуждающийся
 
Аватар для Vadimich
 
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: Уменьшения числа

мне это нужно было для гашения полученного импульса..
допустим, если полученный импульс i# = 1, делитель d# = 2 то это будет
i = i/d... но у меня ещё есть одна переменная - TimeScale#, которая обычно равна 1 (отвечает за замедление времени)
как внедрить её в i = i/d, чтобы если она меньше единицы (например, t# = .5) гашение импульса через деление происходило медленнее?
(Offline)
 
Ответить с цитированием
Старый 25.05.2011, 14:06   #13
Dream
быдло
 
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений
(для 1,489 пользователей)
Ответ: Уменьшения числа

умнложить делитель на время
только нужно немного переделать если ты хочешь чтобы по такому принципу работал - i=i/(1+d#*t#)
(Offline)
 
Ответить с цитированием
Старый 25.05.2011, 14:25   #14
Vadimich
Нуждающийся
 
Аватар для Vadimich
 
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: Уменьшения числа

разве тогда, исходя из предложенного примера это не будет вот так?
i = i/(d*t)
1 = 1/(2*.5) = 1
извините, я в математике не очень.. поэтому могу ошибаться
(Offline)
 
Ответить с цитированием
Старый 25.05.2011, 14:26   #15
Vadimich
Нуждающийся
 
Аватар для Vadimich
 
Регистрация: 26.08.2010
Сообщений: 54
Написано 3 полезных сообщений
(для 3 пользователей)
Ответ: Уменьшения числа

сорри.. опоздал со своим примером )
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com