-
можно убрать пару строк и сделать просто BitBlt(canvas.Handle,0, 0, Form1.Width, Form1.Height, Bit.Canvas.Handle, 0, 0, SRCCOPY); без DC
-
По всей видимости ускорить уже не получится - не заставишь же Sin'усы и Cos'инусы считаться быстрее...
Заставишь, заставишь. Самый распространённый метод в софтверной графике - использование заранее просчитанных таблиц. Тебе же синусы-косинусы нужны с некоторой конечной точностью, поэтому и таблица может быть вполне приемлемого размера. Ну и желательно использовать только целые числа (современные процессоры и floating-point считают достаточно быстро, но преобразования из одного в другое занимают много времени).
-
Хм... А можно поподробнее..? Двумерную таблицу-массив? Или одномерную? И как брать значения? Придётся округлять то что "под" синусом должно быть..?
-
> [22] DomiNick (14.02.09 23:10)
Если хватает точности градуса, делаешь таблицу градусов. Не хватает - таблице минут. Не хватает - в секундах. Все расчеты соответсвтенно ведешь либо в градусах, либо в минутах, либо в секундах. Все целочисленное. Работать будет быстро. Точности секунд уж полюбому должно хватить. ;)
-
> Если хватает точности градуса, делаешь таблицу градусов. > > Не хватает - таблице минут. Не хватает - в секундах.
Можно линейную интерполяцию (например) использовать, чтобы не увеличивать объем таблиц.
-
> Можно линейную интерполяцию (например) использовать
Не знаю, что за зверь... Можно поподробнее..? :)
И с примером кода ;)
-
> [25] DomiNick (16.02.09 22:01)
это математика класса 10. гугль знает. и в разделе "ИГры" этот вопрос уже поднимался. не так давно, врядли успело уйти в архив.
-
В FastLIB есть пример рисования плазмы: http://sapersky.narod.ru/files/FastLIBv389i.rar (plasma) Используется таблица на 1024 у.е., чтобы было удобнее "обрезать" значения до нужного диапазона (and $3FF), благодаря цикличности синусов-косинусов такой трюк проходит. По полученным значениям выбираются цвета из палитры, тоже на 1024 цвета (в режиме "Channels" для r,g,b отдельно, так что получается вполне True Color). Палитра формируется пресловутой линейной интерполяцией (FillColors) между 13-ю цветами, чтобы получить гладкие переходы.
-
Sapersky, благодарю... Интересные исходники... :)
Вы сделали меня ещё умнее... Это поможет мне на пути к завоеванию Мира!)
-
А я так ничего и не понял... :(
Вот например есть число и от него нужно вычислить синус (как от радианов)... Как тогда брать синус, например, когда "x=0,0091344521..." из таблицы?? А если нужно от отрицательного числа?? Там же тока целое-положительное число можно в A[i] подставлять...
И ещё... Синус это периодическая функция: " -1,5707963267... < x < 1,5707963267... " и если нужно будет подсчитать синус от "x=55,66756326..." - как тогда?..
-
> Как тогда брать синус, например, когда "x=0,0091344521..." из таблицы??
Ну и зачем тебе такой SIN? Обычно делают таблицу на 360 или 720 элементов. Таблица заполняется в начале работы программы, а потом через функции - обёртки находится нужный, уже просчитанный SIN из таблицы. Посмотри модуль DelphiX - DXClass, правда там таблица на 256.
> " -1,5707963267... < x < 1,5707963267... "
[-1, 1]
-
> [30] Б (23.02.09 08:16) > [-1, 1]
[-PI,PI]
-
> [-PI,PI]
Я знаю, но у меня-то число дано именно в виде "x=0,0091344521...", а иногда выходит за промежуток [-PI,PI] ...
Придётся переводить в градусы чтоль?
> Посмотри модуль DelphiX - DXClass
Это чего такое?.. Чтот не нашёл...(
-
P.S.
Ой... Тока не [-PI,PI] , а [-PI/2, PI/2] ... :)
-
> Это чего такое?.. Чтот не нашёл...(
Что не нашёл? DelphiX? Или приведённый модуль? ;)
> а иногда выходит за промежуток [-PI,PI] ...
COS любого числа, возьми хоть триллиард, никогда не выйдет за рамки промежутка [-1, 1].
-
> Что не нашёл? DelphiX? Или приведённый модуль? ;)
Ни то, ни другое... :( Что это и зачем?.. Я ж просто на TImage рисую...
> COS любого числа, возьми хоть триллиард, никогда не выйдет за рамки промежутка [-1, 1].
Ну... Я вообще-то про SIN спрашивал... Ну не важно:
Во-первых, я там опечатался - настоящий промежуток [-PI/2, PI/2] Известно что: SIN(-PI/2)=-1 SIN(0)=0 SIN(PI/2)=1 А дальше уже периодически...
Но это результат вычисления синуса...
А в самих скобках же может быть число выходящее за промежуток [-PI/2, PI/2] ...
И как же тогда брать из таблицы значения SIN(х), зная только "х" ?? (Которое к томуже указано в радианах и может равняться любому произвольному числу даже не входящему в нужный промежуток)
-
> Что это и зачем?... Там просто лежит пример такой таблицы. > Я вообще-то про SIN спрашивал... А какая вообще разница? Промежуток всё равно у них одинаковый. > Известно что: > SIN(-PI/2)=-1 > SIN(0)=0 > SIN(PI/2)=1 > А дальше уже периодически...
Так я это уж сказал. Короче, смотри здесь. Таблица не ахти (в смысле код), но оптимизацией заниматься никто не запрещал. ;) http://www.delphikingdom.com/asp/answer.asp?IDAnswer=67402
-
> > Что это и зачем?... > Там просто лежит пример такой таблицы
И где это взять..? :)
-
> И где это взять..? :)
Уже ссылка есть и в никаком DelphiX уже шариться не надо.
-
Нифига... На ассемблере нужно писать... Ещё быстрее будет... :)
|