- "vectorを回す"
# include <Siv3D.hpp> // OpenSiv3D v0.6.10
# include <cmath>
Vec2 sVec = { 0.0, -1.0 };
const double vLength = 100;
const double PI = 3.14159265359;
/// @brief 角度とラジアンを変換して返します
/// @param _angle 角度を入力
/// @return ラジアンに変換された値
double Degree2Radians(double _angle)
{
return(_angle * (PI / 180.0));
}
/// @brief _angle度だけ_vecを原点中心に回転して返す
/// @param _vec 回転されるベクトル
/// @param _angle 回転角度(度)
/// @return 回転後のベクトル
Vec2 RotateVec(Vec2 _vec, double _angle)
{
double theta = Degree2Radians(_angle); //ラジアン
Vec2 res;
res.x = _vec.x * cos(theta) - _vec.y * sin(theta);
res.y = _vec.x * sin(theta) + _vec.y * cos(theta);
return(res);
}
void Main()
{
// 背景の色を設定する | Set the background color
Scene::SetBackground(ColorF{ 0.6, 0.8, 0.7 });
const Vec2 ORIGIN = { Scene::Width() / 2, Scene::Height() / 2 };
double rotAngle = 0;
while (System::Update())
{
if (MouseL.pressed())
{
rotAngle += Scene::DeltaTime()* (20*(360/60));
}
if (MouseR.pressed())
{
rotAngle -= Scene::DeltaTime() * (20 * (360 / 60));
}
Print << rotAngle;
Vec2 rVec = RotateVec(sVec, rotAngle);
//rVec.normalize();
Line{ ORIGIN, ORIGIN + vLength * rVec }.drawArrow(5, { 20,20 }, Palette::Black);
}
}
# include <Siv3D.hpp> // OpenSiv3D v0.6.10
# include <cmath>
Vec2 sVec = { 0.0, -1.0 };
const double vLength = 100;
const double DIST_FROM_STR = 100;
const double PI = 3.14159265359;
double sRot, mRot, hRot;
/// @brief 角度とラジアンを変換して返します
/// @param _angle 角度を入力
/// @return ラジアンに変換された値
double Degree2Radians(double _angle)
{
return(_angle * (PI / 180.0));
}
/// @brief _angle度だけ_vecを原点中心に回転して返す
/// @param _vec 回転されるベクトル
/// @param _angle 回転角度(度)
/// @return 回転後のベクトル
Vec2 RotateVec(Vec2 _vec, double _angle)
{
double theta = Degree2Radians(_angle); //ラジアン
Vec2 res;
res.x = _vec.x * cos(theta) - _vec.y * sin(theta);
res.y = _vec.x * sin(theta) + _vec.y * cos(theta);
return(res);
}
void DrawClockFace(Vec2 _center)
{
Vec2 fVec;
String faceNo[12] = { U"12",U"1", U"2", U"3", U"4", U"5", U"6", U"7", U"8", U"9", U"10", U"11" };
for (int i = 0; i < 12; i++)
{
fVec = RotateVec(sVec, (double)i * (360 / 12));
Circle{ _center + DIST_FROM_STR * fVec,30 }.draw(Palette::Sandybrown);
FontAsset(U"FFONT")(faceNo[i]).drawAt(_center + DIST_FROM_STR * fVec, Palette::Black);
}
}
void Update()
{
sRot = sRot + Scene::DeltaTime() * (360.0 / 60.0);
mRot = mRot + Scene::DeltaTime() * (360.0 / (60.0*60.0));
hRot = hRot + Scene::DeltaTime() * (360.0 / (60.0*60.0*60.0));
}
void Main()
{
FontAsset::Register(U"FFONT", 30, U"example/font/RocknRoll/RocknRollOne-Regular.ttf");
// 背景の色を設定する | Set the background color
Scene::SetBackground(ColorF{ 0.6, 0.8, 0.7 });
const Vec2 ORIGIN = { Scene::Width() / 2, Scene::Height() / 2 };
double rotAngle = 0;
while (System::Update())
{
//if (MouseL.pressed())
//{
// rotAngle += Scene::DeltaTime() * (20 * (360 / 60));
//}
//if (MouseR.pressed())
//{
// rotAngle -= Scene::DeltaTime() * (20 * (360 / 60));
//}
//Print << rotAngle;
Update();
Vec2 secVec = RotateVec(sVec, sRot);
Vec2 minVec = RotateVec(sVec, mRot);
Vec2 hourVec = RotateVec(sVec, hRot);
//rVec.normalize();
DrawClockFace(ORIGIN);
Line{ ORIGIN, ORIGIN + vLength * secVec }.drawArrow(5, { 5,10 }, Palette::Red);
Line{ ORIGIN, ORIGIN + vLength * minVec }.drawArrow(5, { 5,10 }, Palette::Black);
Line{ ORIGIN, ORIGIN + vLength * hourVec }.drawArrow(5, { 5,10 }, Palette::Black);
}
}