示例#1
0
    public static bool PositionIsInFan(Vector3d basePosi, long radius, int angle, FixedQuaternion baseQuaternion, Vector3d posi)
    {
#if UNITY_EDITOR
        var p1_sin  = FixedMath.Trig.Sin(FixedMath.One.Div(180).Mul(FixedMath.Pi).Mul(angle / 2));
        var p1_cos  = FixedMath.Trig.Cos(FixedMath.One.Div(180).Mul(FixedMath.Pi).Mul(angle / 2));
        var p1      = new Vector3d(p1_sin.Mul(radius), 0, p1_cos.Mul(radius));
        var worldP1 = baseQuaternion * p1 + basePosi;

        var p2_sin  = FixedMath.Trig.Sin(FixedMath.One.Div(180).Mul(FixedMath.Pi).Mul(-angle / 2));
        var p2_cos  = FixedMath.Trig.Cos(FixedMath.One.Div(180).Mul(FixedMath.Pi).Mul(-angle / 2));
        var p2      = new Vector3d(p2_sin.Mul(radius), 0, p2_cos.Mul(radius));
        var worldP2 = baseQuaternion * p2 + basePosi;
        Debug.DrawLine(basePosi.ToVector3(), worldP1.ToVector3(), Color.red, 3);
        Debug.DrawLine(basePosi.ToVector3(), worldP2.ToVector3(), Color.red, 3);
#endif
        var radiusSqr = radius.Mul(radius);
        var relativeP = posi - basePosi;
        if (radiusSqr > relativeP.sqrMagnitude)
        {
            var rotateRelativeP = FixedQuaternion.Inverse(baseQuaternion) * relativeP;
            var cos             = Vector3d.Dot(rotateRelativeP.Normalize(), new Vector3d(0, 0, FixedMath.One));
            var realCos         = FixedMath.Trig.Cos(FixedMath.One.Div(180).Mul(FixedMath.Pi).Mul(angle / 2));
            if (relativeP.z > 0)
            {
                if (angle > 180)
                {
                    return(true);
                }
                return(realCos < cos);
            }
            else
            {
                if (angle < 180)
                {
                    return(false);
                }
                else
                {
                    return(realCos > cos);
                }
            }
        }
        else
        {
            return(false);
        }
    }
示例#2
0
    public static bool PositionIsInRect(FixedRect rect, Vector3d basePosition, FixedQuaternion baseQuaternion, Vector3d posi)
    {
#if UNITY_EDITOR
        Vector3d leftDown  = baseQuaternion * (new Vector3d(rect.center) + new Vector3d(-rect.width / 2, 0, -rect.height / 2)) + basePosition;
        Vector3d rightDown = baseQuaternion * (new Vector3d(rect.center) + new Vector3d(rect.width / 2, 0, -rect.height / 2)) + basePosition;
        Vector3d leftUp    = baseQuaternion * (new Vector3d(rect.center) + new Vector3d(-rect.width / 2, 0, rect.height / 2)) + basePosition;
        Vector3d rightUp   = baseQuaternion * (new Vector3d(rect.center) + new Vector3d(rect.width / 2, 0, rect.height / 2)) + basePosition;

        Debug.DrawLine(leftDown.ToVector3(), leftUp.ToVector3(), Color.green, 1);
        Debug.DrawLine(leftUp.ToVector3(), rightUp.ToVector3(), Color.green, 1);
        Debug.DrawLine(rightUp.ToVector3(), rightDown.ToVector3(), Color.green, 1);
        Debug.DrawLine(rightDown.ToVector3(), leftDown.ToVector3(), Color.green, 1);
#endif
        var relativeP       = posi - basePosition;
        var rotateRelativeP = FixedQuaternion.Inverse(baseQuaternion) * relativeP;
        return(rect.ContainsPoint(rotateRelativeP));
    }