# Using trigonometry for draggable frame on a circle/orbit

As a student I never really listen on most subjects including math, after watching a Youtube video about trigonometry I realized I can actually use this to create a color wheel or make a planet orbit around a sun without using the built in Line Forces. I’m not implying that school is useless.

Orbit
``````local TweenService = game:GetService("TweenService")

local Earth = workspace.Earth
local Moon = Earth.Moon

local function WaitForTween(Tween: Tween)
if Tween.PlaybackState == Enum.PlaybackState.Playing then
Tween.Completed:Wait()
end
end

local function UpdatePosition(Part, Position: Vector3, Seconds: number)
local Tween = TweenService:Create(Part, TweenInfo.new(Seconds, Enum.EasingStyle.Linear), {
CFrame = CFrame.new(Position)
})

Tween:Play()
WaitForTween(Tween)
end

-- EARTH
local Hypotenuse = 20 -- Distance
local Origin = workspace.Sun.Position

while true do
for Degrees = 1, 360 do
local Opposite = Hypotenuse * math.sin(Radians)

UpdatePosition(Earth, Vector3.new(Adjacent, 0, Opposite) + Origin, 0.2)
end
end
end)

-- Moon
local Hypotenuse = 3

while true do
for Degrees = 1, 360 do
local Opposite = Hypotenuse * math.sin(Radians)
local Origin = Earth.Position

UpdatePosition(Moon, Vector3.new(Adjacent, 0, Opposite) + Origin, 0)
end
end
end)
``````

Of curse the Line Force would be better since it’s already available without doing any calculations yourself.

The other one is limit the frame on a circle:
``````local TweenService = game:GetService("TweenService")

local MainFrame = script.Parent
local Pin = MainFrame.Pin

local SIZE = 500
local ORIGIN = (MainFrame.AbsolutePosition + Vector2.new(SIZE / 2, SIZE / 2))

local Player = game:GetService("Players").LocalPlayer
local Mouse = Player:GetMouse()

local TWEEN_INFO = TweenInfo.new(0)
local Connection

type HSV = ({ ["H"]: number, ["S"]: number, ["V"]: number })

local Baseplat = workspace.Baseplate

local function UpdatePinPosition(Position: Vector2)
TweenService:Create(Pin, TWEEN_INFO, {
Position = UDim2.new(0.5, Position.X, 0.5, Position.Y)
}):Play()
end

local function HSV(Hue: number, Saturation: number, Value: number): HSV
return {
H = Hue,
V = Value,
S = Saturation
}
end

local function ColorWheel(ColorValue: HSV)
Baseplat.Color = Color3.fromHSV(ColorValue.H, ColorValue.S, ColorValue.V)
end

MainFrame.MouseButton1Down:Connect(function()
UpdatePinPosition(Vector2.new(Mouse.X, Mouse.Y) - ORIGIN)
local HalfSize = SIZE / 2

Connection = Mouse.Move:Connect(function()
local Offset = Vector2.new(Mouse.X, Mouse.Y) - ORIGIN
local Hypotenuse = math.clamp(Offset.Magnitude, 0, HalfSize)

local Opposite = Hypotenuse * math.sin(Radian)

ColorWheel(HSV((math.pi - Radian) / (math.pi * 2), Hypotenuse / HalfSize, 1))
end)
end)

MainFrame.MouseButton2Click:Connect(function()
UpdatePinPosition(Vector2.new(0, 0))
end)

MainFrame.MouseButton1Up:Connect(function()
if typeof(Connection) == "RBXScriptConnection" then
Connection:Disconnect()
end
end)

Mouse.Button1Up:Connect(function()
if typeof(Connection) == "RBXScriptConnection" then
Connection:Disconnect()
end
end)
``````

2 Likes

Anypoint on a circle can be represented by (x0 + sin(x), y0 + cos(x))

1 Like