Просмотр полной версии : синусы и прочие косинусы
Уважаемые знатоки разных демо и интро эффектов. возник такой вопрос, я бы даже сказал - проблема с которой я тут столкнулся. есть желание накидать для игрушки интру (типа, кряктро), что бы там какие-нибудь спрайтики или просто точки летали описывая какую-то фигуру (высшего пилотажа). понимаю, что надо нагенерить всякие таблички с синусами, косинусами, тангенсами, но я совершенно ничего не знаю о том. как потом пользоваться этими табличками. что они вообще из себя представляют? последовательность координат? или какие-то смещения которые можно прибавлять к координатам на экране? в общем вот - как пользоваться табличками синусов, косинусов при написании каких-то эффектов? Можете подсказать, поучить?
Обычно сперва человек придумывает какой-то эффект, используя в нем синус. А уже потом задается вопросом, как этот синус посчитать на асме, и для этого уже приспосабливает таблицу.
Попробуй написать какой-то эффект на си или на бейсике, чтобы понять, как они вообще устроены, и зачем там синус)
Titus, интересный вариант, но и тут всплывает проблема - даже если отработать на сях какой-то эффект, там он отрабатывать будет на честном синусе (т.е. float и double). а на наших машинках этот синус переведён в целочисленное значение (value * 256). и это тоже не ясно. что с этим потом делать уже на спектруме. да и какой эффект придумывать. для начала просто чтобы точками круг описать, чтобы они двигались по кругу или элипсу с периодическим изменением радиуса.
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>
Функция счета sin/cos в любом языке принимает не градусы, а радианы, поэтому там через Math.PI всё преобразуется.
вот этот момент тоже интересен:
нагрёб вот такую запись на сях, она корректна?:
#define DEG(x) ((PI/128.0f)*x)
перевод радиан в градусы вроде? или как-то иначе переводить нужно?
Bedazzle
21.01.2020, 07:46
вот этот момент тоже интересен:
нагрёб вот такую запись на сях, она корректна?:
#define DEG(x) ((PI/128.0f)*x)
перевод радиан в градусы вроде? или как-то иначе переводить нужно?
Я саму формулу не помню, но из уроков в школе намертво засело, что полная окружность - это "два пи радиан".
Выходит, в приведённой выше формуле должна быть половина от круга, т.е. 360/2=180, а не 128.
Выходит, в приведённой выше формуле должна быть половина от круга, т.е. 360/2=180, а не 128.
это подгонка под Спектрум, чтобы градусы описывались одним регистром, т.е. не 360гр, а 256гр.
это подгонка под Спектрум, чтобы градусы описывались одним регистром, т.е. не 360гр, а 256гр.
ЯК СИHУС ЗАБАБАХАТЬ (http://zxpress.ru/article.php?id=5525)
Bedazzle
21.01.2020, 11:55
это подгонка под Спектрум, чтобы градусы описывались одним регистром, т.е. не 360гр, а 256гр.
Тогда правильнее это не градусами, а секторами называть, или ещё как. :)
Сама идея по оптимизации - мудрая.
вот этот момент тоже интересен:
нагрёб вот такую запись на сях, она корректна?:
#define DEG(x) ((PI/128.0f)*x)
перевод радиан в градусы вроде? или как-то иначе переводить нужно?
Ну да, если PI определена (а то в стандартном math.h эта константа зовется M_PI), то запись правильная.
У меня в примере в строке 15 это же самое и происходит.
Тогда правильнее это не градусами, а секторами называть, или ещё как. :)
Градусы по шкале фон Неймана :)
У меня в детстве был калькулятор касио, у которого было три режима - DEG/RAD/GRAD. Так вот градусы были DEG (degree, что по-нашему всё же степень). А GRAD - это были какие-то военные градусы, где прямой угол - 100, а круг - 400. Ну, правда, название GRAD не от градуса было, а от градиана. Метрический градус ещё называется, википедия, правда, утверждает, что они сейчас не используются. Черт ногу сломит, в общем, в этих обозначениях :)
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot