我正在尝试在图像顶部绘制一个仿射矩形(带有旋转和倾斜(,但不知道如何计算顶点。我没有数学或矩阵运算的背景。
我的仿射类定义如下:
public class AffineRectangle
{
public double X { get; set; }
public double Y { get; set; }
public double Width { get; set; }
public double Height { get; set; }
public double Rotation { get; set; }
public double Skew { get; set; }
}
我计划使用 ImageSharp 库使用类似于以下内容的代码绘制多边形:
using (Image<Rgba32> image = new Image<Rgba32>(800, 800))
{
image.Mutate(x => x.DrawPolygon(
Rgba32.Red,
10,
new SixLabors.Primitives.PointF[] {
new Vector2(10, 10),
new Vector2(550, 50),
etc...
}));
image.Save("test.bmp");
}
编辑:这是我正在编写的dotnet核心Web服务。
线性变换的任意组合都可以组合成单个矩阵并一次应用。在 System.Windows.Media 命名空间中,有一些类可用于为您进行数学运算。您需要对 PresentationCore.dll 的引用,如果您正在编写 WPF 应用程序,您可能已经拥有该引用。
例:
using System.Windows.Media;
var myPoint = new Point(10, 10);
var transforms = new TransformGroup();
transforms.Children.Add(new RotateTransform(90));
transforms.Children.Add(new SkewTransform(0, 30));
var transformedPoint = transforms.Transform(myPoint);
编辑:对于面向.NET Core的项目,您可以引用System.Drawing.Common包来实现类似的功能。示例代码如下:
using System.Drawing;
using System.Drawing.Drawing2D;
var myPoint = new PointF(10, 10);
var transform = new Matrix();
transform.Rotate(90.0f);
transform.Shear(5, 0);
var transformed = new PointF[] { myPoint };
transform.TransformPoints(transformed);
Current API (beta6( 将是这样的。
using (var image = new Image<Rgba32>(800, 800))
{
var builder = new AffineTransformBuilder()
.AppendSkewDegrees(10F, 5F)
.AppendRotationDegrees(45F);
var rectangle = new Rectangle(0, 0, 150, 150);
var polygon = new RectangularPolygon(rectangle);
Matrix3x2 matrix = builder.BuildMatrix(rectangle);
image.Mutate(x => x.Draw(
Rgba32.Red,
10,
polygon.Transform(matrix)));
image.Save("test.bmp");
}