Skip to content

Instantly share code, notes, and snippets.

@voidproc
Last active March 17, 2023 15:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save voidproc/1c9f3122a590df6114593b6026353202 to your computer and use it in GitHub Desktop.
Save voidproc/1c9f3122a590df6114593b6026353202 to your computer and use it in GitHub Desktop.
# include <Siv3D.hpp> // OpenSiv3D v0.6.6
namespace s3d
{
namespace Periodic
{
/// @brief 矩形波に従って、周期的に [0.0, 1.0] の値を返します。
/// @param periodSec 周期(秒)
/// @param dutyCycle デューティー比、周期内で波形の大きさが 1.0 である時間の割合
/// @param t 経過時間(秒)
/// @return 0.0 または 1.0
[[nodiscard]]
double Pulse0_1(double periodSec, double dutyCycle, double t = Scene::Time()) noexcept;
/// @brief 矩形波に従って、周期的に [0.0, 1.0] の値を返します。
/// @param periodSec 周期(秒)
/// @param dutyCycle デューティー比、周期内で波形の大きさが 1.0 である時間の割合
/// @param t 経過時間(秒)
/// @return 0.0 または 1.0
[[nodiscard]]
double Pulse0_1(const Duration& period, double dutyCycle, double t = Scene::Time()) noexcept;
/// @brief 矩形波に従って、周期的に [-1.0, 1.0] の値を返します。
/// @param periodSec 周期(秒)
/// @param dutyCycle デューティー比、周期内で波形の大きさが 1.0 である時間の割合
/// @param t 経過時間(秒)
/// @return -1.0 または 1.0
[[nodiscard]]
double Pulse1_1(double periodSec, double dutyCycle, double t = Scene::Time()) noexcept;
/// @brief 矩形波に従って、周期的に [-1.0, 1.0] の値を返します。
/// @param periodSec 周期(秒)
/// @param dutyCycle デューティー比、周期内で波形の大きさが 1.0 である時間の割合
/// @param t 経過時間(秒)
/// @return -1.0 または 1.0
[[nodiscard]]
double Pulse1_1(const Duration& period, double dutyCycle, double t = Scene::Time()) noexcept;
}
namespace Periodic
{
double Pulse0_1(double periodSec, double dutyCycle, const double t) noexcept
{
return (std::fmod(t, periodSec) < (periodSec * dutyCycle)) ? 1.0 : 0.0;
}
double Pulse0_1(const Duration& period, double dutyCycle, const double t) noexcept
{
return Pulse0_1(period.count(), dutyCycle, t);
}
double Pulse1_1(const double periodSec, double dutyCycle, const double t) noexcept
{
return (std::fmod(t, periodSec) < (periodSec * dutyCycle)) ? 1.0 : -1.0;
}
double Pulse1_1(const Duration& period, double dutyCycle, const double t) noexcept
{
return Pulse1_1(period.count(), dutyCycle, t);
}
}
}
void Main()
{
Scene::SetBackground(ColorF{ 0.1 });
while (System::Update())
{
constexpr int N = 800;
for (int i : step(N))
{
const double t0 = i / static_cast<double>(N);
const double t1 = (i + 1) / static_cast<double>(N);
Line{
i,
150 - 100 * Periodic::Pulse0_1(0.1s, 0.25, t0),
i + 1,
150 - 100 * Periodic::Pulse0_1(0.1s, 0.25, t1),
}.draw();
Line{
i,
350 - 100 * Periodic::Pulse0_1(0.1s, 0.50, t0),
i + 1,
350 - 100 * Periodic::Pulse0_1(0.1s, 0.50, t1),
}.draw();
Line{
i,
550 - 100 * Periodic::Pulse0_1(0.1s, 0.75, t0),
i + 1,
550 - 100 * Periodic::Pulse0_1(0.1s, 0.75, t1),
}.draw();
}
}
}
@voidproc
Copy link
Author

Result:
20230317-213538-340

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment