@@ -59,42 +59,24 @@ export const rgbToCssColor = (color: RGB | RGBA, alpha: number = 1): string => {
5959
6060// ---- Gradient Transformation ----
6161export const gradientAngle = ( fill : GradientPaint ) : number => {
62- // Thanks Gleb and Liam for helping!
63- const decomposed = decomposeRelativeTransform (
64- fill . gradientTransform [ 0 ] ,
65- fill . gradientTransform [ 1 ] ,
66- ) ;
67-
68- return ( decomposed . rotation * 180 ) / Math . PI ;
69- } ;
70-
71- // Calculate gradient angle for CSS (different coordinate system)
72- export const cssGradientAngle = ( angle : number ) : number => {
73- // Normalize angle: if negative, add 360 to make it positive.
74- return angle < 0 ? angle + 360 : angle ;
62+ const [ start , end ] = fill . gradientHandlePositions ;
63+ return calculateAngle ( start , end ) ;
7564} ;
7665
77- // Calculate gradient coordinates for a matrix transform
78- export const getGradientTransformCoordinates = (
79- gradientTransform : number [ ] [ ] ,
80- ) : { centerX : string ; centerY : string ; radiusX : string ; radiusY : string } => {
81- const a = gradientTransform [ 0 ] [ 0 ] ;
82- const b = gradientTransform [ 0 ] [ 1 ] ;
83- const c = gradientTransform [ 1 ] [ 0 ] ;
84- const d = gradientTransform [ 1 ] [ 1 ] ;
85- const e = gradientTransform [ 0 ] [ 2 ] ;
86- const f = gradientTransform [ 1 ] [ 2 ] ;
87-
88- const scaleX = Math . sqrt ( a ** 2 + b ** 2 ) ;
89- const scaleY = Math . sqrt ( c ** 2 + d ** 2 ) ;
90-
91- const centerX = ( ( e * scaleX * 100 ) / ( 1 - scaleX ) ) . toFixed ( 2 ) ;
92- const centerY = ( ( ( 1 - f ) * scaleY * 100 ) / ( 1 - scaleY ) ) . toFixed ( 2 ) ;
93-
94- const radiusX = ( scaleX * 100 ) . toFixed ( 2 ) ;
95- const radiusY = ( scaleY * 100 ) . toFixed ( 2 ) ;
96-
97- return { centerX, centerY, radiusX, radiusY } ;
66+ /**
67+ * Calculate the angle between two points in degrees
68+ * @param start Starting point {x, y} in normalized coordinates (0-1)
69+ * @param end Ending point {x, y} in normalized coordinates (0-1)
70+ * @returns Angle in degrees (0-360)
71+ */
72+ export const calculateAngle = (
73+ start : { x : number ; y : number } ,
74+ end : { x : number ; y : number } ,
75+ ) : number => {
76+ const dx = end . x - start . x ;
77+ const dy = end . y - start . y ;
78+ let angle = Math . atan2 ( dy , dx ) * ( 180 / Math . PI ) ;
79+ return ( angle + 360 ) % 360 ; // Normalize to 0-360 degrees
9880} ;
9981
10082// from https://math.stackexchange.com/a/2888105
0 commit comments