Я пытаюсь вычислить позицию 2 на иллюстрации ниже.
Я знаю позицию 1 из
this._end = new THREE.Vector3()
this._end.copy( this._rectanglePos )
.sub( this._circlePos ).setLength( 1.1 ).add( this._circlePos )
Где радиус круга равен 2,2
Я сейчас пытаюсь определить положение на краю прямоугольника вдоль этого пересечения.
Я нашел уравнение написанный в псевдокоде , который я превратил в эту функцию
function positionAtEdge(phi, width, height){
let c = Math.cos(phi)
let s = Math.sin(phi)
let x = width/2
let y = height/2
if (width * Math.abs(s) < height * Math.abs(c)){
x -= Math.sign(c) * width / 2
y -= Math.tan(phi) * x
}
else{
y -= Math.sign(s) * height / 2
x -= cot(phi) * y
}
return {x, y, z: 0}
function cot(aValue){
return 1/Math.tan(aValue);
}
}
И этот вид работает для верхней части прямоугольника, но начинает генерировать сумасшедшие значения после 90 градусов. У Math не было функции coTan, поэтому я немного подумал, что они имели в виду эту функцию кроватки.
Кто-нибудь знает более простой способ найти эту позицию 2 или как преобразовать эту функцию в нечто полезное.