#javascript #html #trigonometry #inverse #degrees
#javascript #HTML #тригонометрия #обратное #градусы
Вопрос:
Я создаю калькулятор строго с использованием JavaScript, и я столкнулся с проблемой при создании обратных функций тригонометрического материала. Все работало при использовании радианов, но в градусах я получил неправильные ответы.
Я хотел бы, чтобы это было так просто, как если бы мои преобразования были неправильными, но все остальное, использующее градусы (т. Е. неинверсную тригонометрию), работало отлично. Следующий код представляет собой части калькулятора, которые имеют какое-либо отношение к преобразованию в градусы и элементам тригонометрии.
ФРАГМЕНТ КОДА:
<html>
<head>
<script language="javascript" type="text/javascript">
var degVal = true;
var Deux = false;
function toDegrees(angle, mode){ //This function converts radians to degrees, and vice versa
if (degVal == true){
mode = (Math.PI/180); //for some reason this incorrect conversion formula spits out the correct answers
}
else if (degVal == false){
mode = 1;
}
return angle * mode;
}
function BasicTrig(TrigFunc, TrigInv){
var val1 = toDegrees(parseFloat(document.getElementById("value1").value));
var ansD = document.getElementById("answer");
if (Deux == false){
ansD.value = TrigFunc(val1);
}
else if (Deux == true){
ansD.value = TrigInv(val1); //For some reason, doesn't work in degrees
}
}
function MoreTrig(TrigEq, TrigEqInv){ // This function allows csc, sec, amp; cot to be performed
var val1 = toDegrees(parseFloat(document.getElementById("value1").value));
var ansD = document.getElementById("answer");
if (Deux == false){
ansD.value = 1 / TrigEq(val1);
}
else if (Deux == true){
ansD.value = TrigEqInv(1 / val1); //Also doesn't work in degrees
}
}
function Deuxieme(){ //2nd function (Calculator) button
if (Deux == false){
document.getElementById("LeDeux").style.backgroundColor = "orange";
Deux = true;
document.getElementById("sinbutton").value = "sin⁻¹"; //changes sin to sin⁻¹
document.getElementById("cosbutton").value = "cos⁻¹"; //changes cos to cos⁻¹
document.getElementById("tanbutton").value = "tan⁻¹"; //changes tan to tan⁻¹
document.getElementById("cscbutton").value = "csc⁻¹"; //changes csc to csc⁻¹ csc being cosec for those who are used to that
document.getElementById("secbutton").value = "sec⁻¹"; //changes sec to sec⁻¹
document.getElementById("cotbutton").value = "cot⁻¹"; //changes cot to cot⁻¹
}
else if (Deux == true){
document.getElementById("LeDeux").style.backgroundColor = "";
Deux = false;
document.getElementById("sinbutton").value = "sin";
document.getElementById("cosbutton").value = "cos";
document.getElementById("tanbutton").value = "tan";
document.getElementById("cscbutton").value = "csc";
document.getElementById("secbutton").value = "sec"; document.getElementById("cotbutton").value = "cot";
}
}
function RadDegHighlight(){ //Switches between Radians and Degrees
if (degVal == true){
document.getElementById("drbutton").value = "rad";
degVal = false;
}
else if (degVal == false){
document.getElementById("drbutton").value = "deg";
degVal = true;
}
}
</script>
</head>
<body>
<input type="text" placeholder="x" style="width:48.5%" id="value1"/>
<input type="button" id="LeDeux" style="width:23.5%" value="2nd" onclick="Deuxieme()"/>
<input type="button" id="drbutton" style="width:23.5%" value="deg" onclick="RadDegHighlight()"/>
<input type="button" id="sinbutton" style="width:23.5%" value="sin" onclick="BasicTrig(Math.sin, Math.asin)"/>
<input type="button" id="cosbutton" style="width:23.5%" value="cos" onclick="BasicTrig(Math.cos, Math.acos)"/>
<input type="button" id="tanbutton" style="width:23.5%" value="tan" onclick="BasicTrig(Math.tan, Math.atan)"/>
<input type="button" id="cscbutton" style="width:23.5%" value="csc" onclick="MoreTrig(Math.sin, Math.asin)"/>
<input type="button" id="secbutton" style="width:23.5%" value="sec" onclick="MoreTrig(Math.cos, Math.acos)"/>
<input type="button" id="cotbutton" style="width:23.5%" value="cot" onclick="MoreTrig(Math.tan, Math.atan)"/>
<input type="text" placeholder="Answer" style="width:100%" id="answer"/>
</body>
</html>
Я предполагаю, что проблема где-то в toDegrees
, поскольку все остальное работает в радианах… что касается Math.PI/180
преобразования радианов в градусы, как я уже говорил ранее, оно работает везде, и я даже протестировал его, и это просто запутывает все остальные вычисления и не устраняет текущую проблему.
Я протестировал все остальные вычисления, и они верны. Опять же, все в радианах работает, но обратные функции не работают для градусов, в отличие от обычных функций.
Ответ №1:
Вы преобразуете входные данные обратной тригонометрической функции из радианов в градусы, но, во-первых, это не в радианах. Вам необходимо преобразовать выходные данные при использовании обратной тригнометрии.
Комментарии:
1. Если вы хотите это сделать
toDegrees(Math.asin(val1))
, я уже пробовал это (и даже хотел упомянуть об этом в вопросе, но забыл), все еще не работает. Например,toDegrees(Math.asin(.5)) = 0.009138522593601258
там, где оно должно быть 30, иtoDegrees(Math.acos(.5)) = 0.018277045187202516
там, где оно должно быть 60.2. @Gnago: Ваша
toDegrees
функция не преобразуется в градусы. Напишитеfunction toDegrees(radians) { return radians * 180 / Math.PI; }
и afunction toRadians(degrees) { return degrees * Math.PI / 180; }
.3. Да, это решило проблему, я полностью избежал этого, потому что это работало везде. Ну что ж, спасибо вам за вашу помощь