Я собираюсь разработать специальную анимацию с холстом. Я хочу повернуть равнобедренный треугольник по кругу.
Примечание: Я не хочу вращать сам холст. Я хотел бы вычислять 3 точки треугольника в каждом кадре. (!).
let canvas = document.getElementById("canvas")
let ctx = canvas.getContext("2d")
let trianglePositionAngle = 0;
let triangleSizeAngle = 15;
function draw(trianglePositionAngle) {
ctx.fillStyle = "blue"
ctx.fillRect(0, 0, canvas.width, canvas.height)
let radius = 70
ctx.fillStyle = "black"
ctx.beginPath();
ctx.arc(canvas.width / 2, canvas.height / 2, radius, 0, 2 * Math.PI);
ctx.fill();
let triangle = {
x1: canvas.width / 2 + radius * Math.cos((trianglePositionAngle * Math.PI / 180)),
y1: canvas.height / 2 + radius * Math.sin((trianglePositionAngle * Math.PI / 180)),
x2: canvas.width / 2 + radius * Math.cos(((trianglePositionAngle + triangleSizeAngle) * Math.PI / 180)),
y2: canvas.height / 2 + radius * Math.sin(((trianglePositionAngle + triangleSizeAngle) * Math.PI / 180))
}
ctx.fillStyle = "red"
ctx.beginPath()
ctx.moveTo(triangle.x1, triangle.y1);
ctx.lineTo(triangle.x2, triangle.y2);
ctx.lineTo(canvas.width/2, canvas.height/2); // looking for the coordinates of this point
ctx.fill();
}
setInterval(function() {
draw(trianglePositionAngle++)
},100)<canvas id = "canvas" width = "200" height = "200"></canvas>Поскольку я знаю, что противоположные стороны треугольника имеют одинаковую длину, мне нужно вычислить только последнюю точку. Я знаю теоретический путь:
Тем не менее у меня есть проблемы с его внедрением, и я надеюсь, что кто-то мне поможет. Заранее спасибо.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Для вычисления координат третьей точки треугольника следует использовать средний угол между точками 1 и 2. А радиус должен быть увеличен на высоту треугольника. Я дал простое приближение для последнего параметра:
x3: canvas.width / 2 +
radius * (1 + 0.866 * triangleSizeAngle * Math.PI / 180) *
Math.cos(((trianglePositionAngle + triangleSizeAngle / 2) * Math.PI / 180))
y3: canvas.height / 2 +
radius * (1 + 0.866 * triangleSizeAngle * Math.PI / 180) *
Math.sin(((trianglePositionAngle + triangleSizeAngle / 2) * Math.PI / 180))
0.866=Sqrt(3)/2 - отношение высоты к краю равнобедренного треугольника.
При аппроксимации в качестве кромки используется длина дуги (они немного отличаются, но для целей рисования ею можно пренебречь).
Более точное значение
instead of
(1 + 0.866 * triangleSizeAngle * Math.PI / 180)
you can use
(cos(0.5* triangleSizeAngle * Math.PI / 180) +
Sqrt(3)* sin(0.5* triangleSizeAngle * Math.PI / 180))
Я добавил некоторые пояснения. Я надеялся, что очевидно, что координата Y использует те же параметры, но sin вместо cos.
Также добавлено точное значение для увеличения радиуса
Извините, но я не совсем понимаю ваш ответ. Откуда взялось 0.866 и где y3? Почему в конце стоит запятая? И зачем мне
approximation, если я могу рассчитать точное значение? Хм?:)