JSFiddle - React, Tailwind, and code Playground
HTML
<p> x <input id="x" value=100 />
<p> y <input id="y" value=100 />
<p> angle <input id="angle" value=180 />
<p> <button id="go" >Go</button>
<pre></pre>
<p>Target: <span id="target"></span></p>
<ul id="angles">
</ul>
JavaScript
function objFromForm(){
return {
angle: $('#angle').val(),
shipType: {turnSpeed:8},
mode: { dest: {x:0, y:0}},
x:$('#x').val(), y:$('#y').val()
};
}
obj = objFromForm();
function step(obj)
{
obj.angle %= 360;
// Calculate angle to target point
var targetAngle = (Math.atan2(obj.mode.dest.y - obj.y, obj.mode.dest.x - obj.x) * (180 / Math.PI))+90;
targetAngle = (targetAngle+360)%360;
$('#target').text(targetAngle);
if(obj.angle != targetAngle)
{
// Get the difference between the current angle and the target angle
var netAngle = (obj.angle - targetAngle + 360)%360 ;
var delta = Math.min(Math.abs(netAngle-360), netAngle, obj.shipType.turnSpeed);
var sign = (netAngle-180) >= 0 ? 1 : -1;
$('#angles').append("<li>"+obj.angle+" (net: " + netAngle + ", delta: "+ delta +", sign:"+ sign+" )</li>");
// Turn in the closest direction to the target
obj.angle += sign*delta+360;
obj.angle %= 360;
setTimeout(function(){step(obj);}, 100);
}
else
{
$('#angles').append("<li> Done: "+obj.angle+"</li>");
}
}
step(obj);
$('pre').text(JSON.stringify(objFromForm()));
$('#go').click(function(){$('#angles').html(''); step(objFromForm());});