Files
Shrlalgo.RvKits/WPFDark/Controls/Internals/IHasTransform.cs
ShrlAlgo 4d35cadb56 更新
2025-07-11 09:20:23 +08:00

62 lines
1.8 KiB
C#

using System.Windows;
using System.Windows.Media;
using WPFDark.Internals;
namespace WPFDark.Controls.Internals
{
public interface IHasTransform
{
ScaleTransform ScaleTransform { get; }
TranslateTransform TranslateTransform { get; }
}
public static class HasTransformExtensions
{
public static Point TransformPos(this IHasTransform self, double x, double y)
{
var s = self.ScaleTransform.ScaleX;
return new Point(
(x - self.TranslateTransform.X) / s,
(y - self.TranslateTransform.Y) / s);
}
public static ImmutableRect_double TransformRect(this IHasTransform self, double w, double h)
{
var s = self.ScaleTransform.ScaleX;
return new ImmutableRect_double(
-self.TranslateTransform.X / s,
-self.TranslateTransform.Y / s,
w / s,
h / s);
}
public static ImmutableRect_double TransformRect(this IHasTransform self, in ImmutableRect_double rect)
{
var s = self.ScaleTransform.ScaleX;
return new ImmutableRect_double(
(rect.X - self.TranslateTransform.X) / s,
(rect.Y - self.TranslateTransform.Y) / s,
rect.Width / s,
rect.Height / s);
}
public static void SetTransform(this IHasTransform self, double scale, double centerX, double centerY)
{
var d0 = self.TransformPos(centerX, centerY);
self.ScaleTransform.ScaleX = scale;
self.ScaleTransform.ScaleY = scale;
var d1 = self.TransformPos(centerX, centerY);
var diff = d1 - d0;
self.TranslateTransform.X += diff.X * scale;
self.TranslateTransform.Y += diff.Y * scale;
}
}
}