Важная информация

User Tag List

Показано с 1 по 10 из 10

Тема: синусы и прочие косинусы

  1. #1
    Guru Аватар для Sayman
    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    3,277
    Спасибо Благодарностей отдано 
    17
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    54 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию синусы и прочие косинусы

    Уважаемые знатоки разных демо и интро эффектов. возник такой вопрос, я бы даже сказал - проблема с которой я тут столкнулся. есть желание накидать для игрушки интру (типа, кряктро), что бы там какие-нибудь спрайтики или просто точки летали описывая какую-то фигуру (высшего пилотажа). понимаю, что надо нагенерить всякие таблички с синусами, косинусами, тангенсами, но я совершенно ничего не знаю о том. как потом пользоваться этими табличками. что они вообще из себя представляют? последовательность координат? или какие-то смещения которые можно прибавлять к координатам на экране? в общем вот - как пользоваться табличками синусов, косинусов при написании каких-то эффектов? Можете подсказать, поучить?
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...
    ---
    Sprinter resurrect:
    Telegram
    Discord
    Repo
    Forum

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    13,560
    Спасибо Благодарностей отдано 
    1,223
    Спасибо Благодарностей получено 
    1,754
    Поблагодарили
    683 сообщений
    Mentioned
    67 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Обычно сперва человек придумывает какой-то эффект, используя в нем синус. А уже потом задается вопросом, как этот синус посчитать на асме, и для этого уже приспосабливает таблицу.

    Попробуй написать какой-то эффект на си или на бейсике, чтобы понять, как они вообще устроены, и зачем там синус)

  4. #3
    Guru Аватар для Sayman
    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    3,277
    Спасибо Благодарностей отдано 
    17
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    54 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Titus, интересный вариант, но и тут всплывает проблема - даже если отработать на сях какой-то эффект, там он отрабатывать будет на честном синусе (т.е. float и double). а на наших машинках этот синус переведён в целочисленное значение (value * 256). и это тоже не ясно. что с этим потом делать уже на спектруме. да и какой эффект придумывать. для начала просто чтобы точками круг описать, чтобы они двигались по кругу или элипсу с периодическим изменением радиуса.
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...
    ---
    Sprinter resurrect:
    Telegram
    Discord
    Repo
    Forum

  5. #4
    Sinclair User Аватар для Eltaron
    Регистрация
    16.01.2005
    Адрес
    Ekaterinburg
    Сообщений
    2,045
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    144
    Спасибо Благодарностей получено 
    463
    Поблагодарили
    326 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sayman Посмотреть сообщение
    Titus, интересный вариант, но и тут всплывает проблема - даже если отработать на сях какой-то эффект, там он отрабатывать будет на честном синусе (т.е. float и double).
    Почему? Как напишешь, так и будет. Вот на скорую руку честный табличный синус на, прости Господи, javascript.
    https://jsfiddle.net/1Lbw0eus/2/

    Поставь R_INCREMENT = 0, будет окружность. Как она рисуется? В школе проходят единичную окружность, где по x синус, а по y - косинус. Вот это практически она и есть, только радиуса R, а не единичная. Задается системой

    x = R * cos(alpha)
    y = R * sin(alpha)

    По сути это параметрическое (по alpha) уравнение кривой. Задаем начальную альфу, вычисляем направление и вдоль него ставим на удалении R точку. Увеличиваем альфу, повторяем. Когда сделаем полный оборот, окружность будет нарисована.

    Если же начать играться с радиусом и менять его на каждом шаге, то будут происходить разные вещи. Если тупо увеличивать или уменьшать, будет спираль. Если же менять периодически (у меня, например, он бегает от 10 до 100 и обратно), то получится что-то вроде фигуры Лиссажу, когда два колебания с разными периодами рисуются по разным осям. А R и alpha - это как раз разные оси, просто в полярной системе координат. Кажется, что у Инфоркома в "Динамической графике" в той части, где про 3д, довольно неплохо это всё изложено было.

    - - - Добавлено - - -

    Сами таблички sin и cos - это просто значения синуса и косинуса для угла alpha * (360 / 256). Ну то есть с шагом 1.4 градуса. Из-за этого между соседними точками такие заметные пробелы и, по уму, их надо линиями соединять.
    Функция счета sin/cos в любом языке принимает не градусы, а радианы, поэтому там через Math.PI всё преобразуется.

    Скрытый текст


    Код:
    <html>
    	<head>
    		<script>
    			var ctx;
    			var sin = [], cos = [];
    			var alpha = 0;
    			var r = 50;
    			
    			var CENTER_X = 200;
    			var CENTER_Y = 200;
    			var R_INCREMENT = 1;
    			
    			function start() {
    				for (var i = 0; i < 256; i++) {
    					var angle_rad = Math.PI * i / 128;
    					sin[i] = Math.sin(angle_rad);
    					cos[i] = Math.cos(angle_rad);
    				}
    
    				var canvas = document.getElementById("canv");
    				ctx = canvas.getContext('2d');
    				setInterval(draw, 10);
    			}
    			
    			function draw() {
    				ctx.fillRect(CENTER_X + sin[alpha] * r, CENTER_Y + cos[alpha] * r, 1, 1);
    				alpha = alpha + 1;
    				
    				if (alpha == 256)
    					alpha = 0;
    				
    				r = r + R_INCREMENT;
    				if (r == 100 || r == 10)
    					R_INCREMENT = -R_INCREMENT;
    			}
    		</script>
    	</head>
      <body onload="start()">
    		<canvas id="canv" width="500px" height="500px" />
    	</body>
    </html>
    [свернуть]
    Последний раз редактировалось Eltaron; 21.01.2020 в 20:07.
    Граф Дракула наш кумир, патамушта он вомпир!
    VKINK 9 : BORDER NOT PI

  6. Эти 2 пользователя(ей) поблагодарили Eltaron за это полезное сообщение:

    Denn (20.01.2020), Sayman (21.01.2020)

  7. #5
    Guru Аватар для Sayman
    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    3,277
    Спасибо Благодарностей отдано 
    17
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    54 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Eltaron Посмотреть сообщение
    Функция счета sin/cos в любом языке принимает не градусы, а радианы, поэтому там через Math.PI всё преобразуется.
    вот этот момент тоже интересен:
    нагрёб вот такую запись на сях, она корректна?:
    Код:
    #define DEG(x)			((PI/128.0f)*x)
    перевод радиан в градусы вроде? или как-то иначе переводить нужно?
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...
    ---
    Sprinter resurrect:
    Telegram
    Discord
    Repo
    Forum

  8. #6
    Veteran Аватар для Bedazzle
    Регистрация
    02.05.2015
    Адрес
    г. Таллин, Эстония
    Сообщений
    1,486
    Спасибо Благодарностей отдано 
    220
    Спасибо Благодарностей получено 
    149
    Поблагодарили
    115 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sayman Посмотреть сообщение
    вот этот момент тоже интересен:
    нагрёб вот такую запись на сях, она корректна?:
    Код:
    #define DEG(x)			((PI/128.0f)*x)
    перевод радиан в градусы вроде? или как-то иначе переводить нужно?
    Я саму формулу не помню, но из уроков в школе намертво засело, что полная окружность - это "два пи радиан".
    Выходит, в приведённой выше формуле должна быть половина от круга, т.е. 360/2=180, а не 128.
    Heavy on the disasm
    Eric and the disasm
    Mask 3: Venom strikes disasm
    Bard's disasm

  9. #7
    Guru Аватар для Sayman
    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    3,277
    Спасибо Благодарностей отдано 
    17
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    54 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Bedazzle Посмотреть сообщение
    Выходит, в приведённой выше формуле должна быть половина от круга, т.е. 360/2=180, а не 128.
    это подгонка под Спектрум, чтобы градусы описывались одним регистром, т.е. не 360гр, а 256гр.
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...
    ---
    Sprinter resurrect:
    Telegram
    Discord
    Repo
    Forum

  10. #8
    Veteran Аватар для Destr
    Регистрация
    26.03.2008
    Адрес
    Питкяранта
    Сообщений
    1,802
    Спасибо Благодарностей отдано 
    249
    Спасибо Благодарностей получено 
    113
    Поблагодарили
    87 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sayman Посмотреть сообщение
    это подгонка под Спектрум, чтобы градусы описывались одним регистром, т.е. не 360гр, а 256гр.
    ЯК СИHУС ЗАБАБАХАТЬ

  11. #9
    Veteran Аватар для Bedazzle
    Регистрация
    02.05.2015
    Адрес
    г. Таллин, Эстония
    Сообщений
    1,486
    Спасибо Благодарностей отдано 
    220
    Спасибо Благодарностей получено 
    149
    Поблагодарили
    115 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sayman Посмотреть сообщение
    это подгонка под Спектрум, чтобы градусы описывались одним регистром, т.е. не 360гр, а 256гр.
    Тогда правильнее это не градусами, а секторами называть, или ещё как.
    Сама идея по оптимизации - мудрая.
    Heavy on the disasm
    Eric and the disasm
    Mask 3: Venom strikes disasm
    Bard's disasm

  12. #10
    Sinclair User Аватар для Eltaron
    Регистрация
    16.01.2005
    Адрес
    Ekaterinburg
    Сообщений
    2,045
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    144
    Спасибо Благодарностей получено 
    463
    Поблагодарили
    326 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Sayman Посмотреть сообщение
    вот этот момент тоже интересен:
    нагрёб вот такую запись на сях, она корректна?:
    Код:
    #define DEG(x)			((PI/128.0f)*x)
    перевод радиан в градусы вроде? или как-то иначе переводить нужно?
    Ну да, если PI определена (а то в стандартном math.h эта константа зовется M_PI), то запись правильная.
    У меня в примере в строке 15 это же самое и происходит.

    Цитата Сообщение от Bedazzle Посмотреть сообщение
    Тогда правильнее это не градусами, а секторами называть, или ещё как.
    Градусы по шкале фон Неймана
    У меня в детстве был калькулятор касио, у которого было три режима - DEG/RAD/GRAD. Так вот градусы были DEG (degree, что по-нашему всё же степень). А GRAD - это были какие-то военные градусы, где прямой угол - 100, а круг - 400. Ну, правда, название GRAD не от градуса было, а от градиана. Метрический градус ещё называется, википедия, правда, утверждает, что они сейчас не используются. Черт ногу сломит, в общем, в этих обозначениях
    Граф Дракула наш кумир, патамушта он вомпир!
    VKINK 9 : BORDER NOT PI

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. МК-90 - глюки и прочие проблемы
    от Arix в разделе Программируемые калькуляторы
    Ответов: 0
    Последнее: 10.10.2019, 21:47

Ваши права

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