@@ -339,5 +339,41 @@ static bool Contains(List<float> list, float v)
339
339
return false ;
340
340
}
341
341
}
342
+
343
+ public static Rect RotateRectAsNormalized ( Rect rect , float rot )
344
+ {
345
+ var rad = - rot * Mathf . Deg2Rad ;
346
+ var cos = Mathf . Cos ( rad ) ;
347
+ var sin = Mathf . Sin ( rad ) ;
348
+ var dir = new Vector2 ( cos , sin ) ;
349
+ var center = rect . center ;
350
+
351
+ if ( Mathf . Abs ( dir . x ) < 0.0001f )
352
+ {
353
+ rect . width = rect . height ;
354
+ }
355
+ else if ( Mathf . Abs ( dir . y ) < 0.0001f )
356
+ {
357
+ rect . height = rect . width ;
358
+ }
359
+ else
360
+ {
361
+ var d0 = GetPointToLineDistance ( new Vector2 ( rect . xMin , rect . yMax ) , center , dir , out var p0 ) ;
362
+ var d1 = GetPointToLineDistance ( new Vector2 ( rect . xMin , rect . yMin ) , center , dir , out var p1 ) ;
363
+ var closest = d0 < d1 ? p0 : p1 ;
364
+ rect . width = rect . height = Vector2 . Distance ( center , closest ) * 2 ;
365
+ }
366
+
367
+ rect . center = new Vector2 ( Vector2 . Dot ( center , dir ) , 0 ) ;
368
+ return rect ;
369
+ }
370
+
371
+ private static float GetPointToLineDistance ( Vector2 point , Vector2 origin , Vector2 dir , out Vector2 closest )
372
+ {
373
+ var dirNormalized = dir . normalized ;
374
+ var time = Vector2 . Dot ( point - origin , dirNormalized ) ;
375
+ closest = origin + time * dirNormalized ;
376
+ return Vector2 . Distance ( point , closest ) ;
377
+ }
342
378
}
343
379
}
0 commit comments