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); } }
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)); }