Найти правую и левую 2d точку горизонтального круга в среде 3D Vector - PullRequest
0 голосов
/ 20 мая 2010

Я рисую трехмерную круговую диаграмму, которая рассчитывается в трехмерных векторах, проецируется в двухмерные векторы и затем рисуется на графическом объекте. Я хочу вычислить самую левую и правую точки круга после проецирования в 2d. (Значит, не 0 и 1 Pi!) Ниже приведен метод создания вектора, рисования и проецирования на 2d вектор. Кто-нибудь знает ответ?

public class Vector3d
{

    public var x:Number;
    public var y:Number;
    public var z:Number;
    //the angle that the 3D is viewed in tele or wide angle.
    public static var viewDist:Number = 700;


    function Vector3d(x:Number, y:Number, z:Number){
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public function project2DNew():Vector
    {
        var p:Number = getPerspective();
        return new Vector(p * x, p * y);
    }

    public function getPerspective():Number{
        return viewDist / (this.z + viewDist);
    }
}

1 Ответ

1 голос
/ 20 мая 2010

Похоже, вы разместили свое трехмерное перспективное преобразование. Самое простое, если круг не вращается:

class Circle
{
    public var radius:Number;
    public var position:Vector3d;

    public function Circle(_radius:Number, _position:Vector3d)
    {
        radius = _radius;
        position = _position;
    }
}

var circ:Circle = new Circle(100, new Vector3d(1, 2, 3));
var leftMost:Vector3d = new Vector3d(circ.x - circ.radius, circ.y);
var rightMost:Vector3d = new Vector3d(circ.y + circ.radius, circ.y);

Если вы вращаете окружность вдоль оси y, то точки должны вращаться вокруг одной и той же оси на ту же величину. То есть, если у вас есть матрица преобразования, которая применяется к кругу, просто примените ту же матрицу преобразования к векторам leftMost и rightMost. Взгляните на Matrix3D и его различные методы вращения.

class Circle
{
    public var radius:Number;
    public var position:Vector3d;
    public var transform:Matrix3d;

    public function Circle(_radius:Number, _position:Vector3d)
    {
        radius = _radius;
        position = _position;
    }

    public function getLeftMostProjected():Vector
    {
        var vec:Vector3d = new Vector3d(position.x - radius, position.y, position.z);
        vec = transform.transformVector(vec);
        return vec.project2DNew();
    }

    public function getRightMostProjected():Vector
    {
        var vec:Vector3d = new Vector3d(position.x + radius, position.y, position.z);
        vec = transform.transformVector(vec);
        return vec.project2DNew();
    }
}
...