Три. js вычисляют положение на краю прямоугольника, когда я знаю угол от центра - PullRequest
1 голос
/ 31 января 2020

Я пытаюсь вычислить позицию 2 на иллюстрации ниже.

Я знаю позицию 1 из

  this._end = new THREE.Vector3()
  this._end.copy( this._rectanglePos )
     .sub( this._circlePos ).setLength( 1.1 ).add( this._circlePos )

Где радиус круга равен 2,2

illustration of problem

Я сейчас пытаюсь определить положение на краю прямоугольника вдоль этого пересечения.

Я нашел уравнение написанный в псевдокоде , который я превратил в эту функцию

 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 или как преобразовать эту функцию в нечто полезное.

Ответы [ 2 ]

3 голосов
/ 31 января 2020

Это решение общего назначения, которое не зависит от их относительного положения.

Пример в реальном времени (JSFiddle)

function getIntersection( circle, rectangle, width, height ) {

    // offset is a utility Vector3.
    // initialized outside the function scope.
    offset.copy( circle ).sub( rectangle );

    let ratio = Math.min( 
        width * 0.5 / Math.abs( offset.x ),
        height * 0.5 / Math.abs( offset.y )
    );

    offset.multiplyScalar( ratio ).add( rectangle );

    return offset;

}
0 голосов
/ 31 января 2020

Для этого вам не нужны трансцендентные функции.

Vsb = (Spherecenter - rectanglecenter)

P2 = rectanglecenter + ((vsb * rectangleheight * .5) / vsb.y )

...