public class RandomPoint
{
public static Vector3 GetRandomPointInRectangle(Vector3 axis,Vector2 size,Vector3 center = new Vector3())
{
Vector3[] orthogonalVectors = new[] { Vector3.right, Vector3.up, Vector3.forward };
Vector3 axis1 = Vector3.zero;
foreach (var orthogonal in orthogonalVectors)
{
axis1 = Vector3.Cross(axis, orthogonal).normalized;
if (axis1.magnitude > 0)
{
break;
}
}
Vector3 axis2 = Vector3.Cross(axis1, axis).normalized;
float randomX = Random.Range(-size.x / 2f, size.x / 2f);
float randomY = Random.Range(-size.y / 2f, size.y / 2f);
Vector3 randomPoint = center + axis1 * randomX + axis2 * randomY;
return randomPoint;
}
public static Vector3 GetRandomPointOnCircle(Vector3 axis, float radius, Vector3 center = new Vector3())
{
var dir = GetRandomVerticalVector(axis);
var dis = Random.Range(0, radius);
return dir * dis + center;
}
public static Vector3 GetRandomPointOnRing(Vector3 axis, float inRadius, float outRadius,
Vector3 center = new Vector3())
{
var dir = GetRandomVerticalVector(axis);
var dis = Random.Range(inRadius, outRadius);
return dir * dis + center;
}
private static Vector3 GetRandomVerticalVector(Vector3 inputVector)
{
Vector3 randomVector = GetRandomNonParallelVector(inputVector);
Vector3 perpendicularVector = Vector3.Cross(inputVector, randomVector);
return perpendicularVector.normalized;
}
private static Vector3 GetRandomNonParallelVector(Vector3 inputAxis)
{
Vector3 randomVector;
do
{
randomVector = Random.onUnitSphere;
} while (Mathf.Abs(Vector3.Dot(randomVector, inputAxis.normalized)) > 0.99f);
return randomVector;
}
}