This is straightforward, the only thing you need to take care for being the different lengths of the rectangle's sides. Here's the code:
/// <summary>Returns a random point on the perimeter of a rectangle</summary>
/// <param name="randomNumberGenerator">Random number generator that will be used</param>
/// <param name="extents">Extents of the rectangle</param>
/// <returns>A random point on the rectangle's perimeter</returns>
public static Vector2 GenerateRandomPointOnPerimeter(
System.Random randomNumberGenerator, Vector2 extents
) {
Vector2 dimensions = extents * 2.0f;
float totalPerimeterLength = dimensions.X * 2.0f + dimensions.Y * 2.0f;
float position = (float)randomNumberGenerator.NextDouble() * totalPerimeterLength;
if(position < dimensions.X)
return new Vector2(extents.X - position, extents.Y);
position -= dimensions.X;
if(position < dimensions.Y)
return new Vector2(extents.X, extents.Y - position);
position -= dimensions.Y;
if(position < dimensions.X)
return new Vector2(extents.X - position, -extents.Y);
position -= dimensions.X;
return new Vector2(-extents.X, extents.Y - position);
}
/// <param name="randomNumberGenerator">Random number generator that will be used</param>
/// <param name="extents">Extents of the rectangle</param>
/// <returns>A random point on the rectangle's perimeter</returns>
public static Vector2 GenerateRandomPointOnPerimeter(
System.Random randomNumberGenerator, Vector2 extents
) {
Vector2 dimensions = extents * 2.0f;
float totalPerimeterLength = dimensions.X * 2.0f + dimensions.Y * 2.0f;
float position = (float)randomNumberGenerator.NextDouble() * totalPerimeterLength;
if(position < dimensions.X)
return new Vector2(extents.X - position, extents.Y);
position -= dimensions.X;
if(position < dimensions.Y)
return new Vector2(extents.X, extents.Y - position);
position -= dimensions.Y;
if(position < dimensions.X)
return new Vector2(extents.X - position, -extents.Y);
position -= dimensions.X;
return new Vector2(-extents.X, extents.Y - position);
}