Skip to content

Instantly share code, notes, and snippets.

@sthairno
Created June 11, 2022 08:03
Show Gist options
  • Save sthairno/021b1e71cefafd62721baeba913b1745 to your computer and use it in GitHub Desktop.
Save sthairno/021b1e71cefafd62721baeba913b1745 to your computer and use it in GitHub Desktop.
角度を指定するUI
#include <Siv3D.hpp> // OpenSiv3D v0.6.4
void DrawAngleText(const Font& font, const Circle& circle, double angle, ColorF color)
{
const auto degText = font(U"{:.1f}"_fmt(ToDegrees(angle)));
degText.region(Arg::topCenter = circle.center + Vec2{ 0, circle.r + 2 }).draw(ColorF(Scene::GetBackground(), 0.8));
degText.draw(Arg::topCenter = circle.center + Vec2{ 0, circle.r + 2 }, color);
}
void Main()
{
Scene::SetBackground(ColorF(0.9));
double angleA = 0;
double angleB = 0;
int dragState = 0;
Font regular(20, Typeface::Regular);
Font bold(20, Typeface::Bold);
while (System::Update())
{
if (not MouseL.pressed())
{
dragState = 0;
}
if (dragState)
{
Vec2 diff = Cursor::PosF() - Scene::CenterF();
if (diff.length() > 8)
{
double angle = std::atan2(-diff.y, diff.x);
switch (dragState)
{
case 1:
angleA = angle;
break;
case 2:
angleB = angle;
break;
}
}
}
{
Transformer2D t(Mat3x2::Translate(Scene::CenterF()), TransformCursor::Yes);
Vec2 posA = Vec2{ std::cos(angleA), -std::sin(angleA) } * 200;
Vec2 posB = Vec2{ std::cos(angleB), -std::sin(angleB) } * 300;
const Circle circleA(posA, 20);
const Circle circleB(posB, 20);
Line(-340, 0, 340, 0).draw(2, Palette::Lightgray);
bold(U"+").draw(Arg::bottomCenter = Vec2{ 330, 1 }, Palette::Gray);
bold(U"-").draw(Arg::topCenter = Vec2{ 330, -1 }, Palette::Gray);
Line(0, 0, posB).draw(4, Palette::Darkred);
circleB
.draw(Palette::White)
.drawFrame(dragState == 2 ? 4 : 2, Palette::Darkred);
bold(U"B").drawAt(posB, Palette::Darkred);
DrawAngleText(regular, circleB, angleB, Palette::Darkred);
Line(0, 0, posA).draw(4, Palette::Darkblue);
circleA
.draw(Palette::White)
.drawFrame(dragState == 1 ? 4 : 2, Palette::Darkblue);
bold(U"A").drawAt(posA, Palette::Darkblue);
DrawAngleText(regular, circleA, angleA, Palette::Darkblue);
Circle(0, 0, 8).draw(Scene::GetBackground());
if (MouseL.down())
{
if (circleA.mouseOver())
{
dragState = 1;
}
if (circleB.mouseOver())
{
dragState = 2;
}
}
}
ClearPrint();
Print << U"A → B: " << ToDegrees(angleB - angleA);
Print << U"A → B + 2π: " << ToDegrees(angleB + Math::TwoPi - angleA);
Print << U"A → B - 2π: " << ToDegrees(angleB - Math::TwoPi - angleA);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment