| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 | using InABox.Core;using netDxf;using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using System.Drawing.Drawing2D;using System.Linq;using System.Numerics;using System.Text;using System.Threading.Tasks;using Vector3 = System.Numerics.Vector3;namespace InABox.Dxf;internal static class Utils{    public static PointF Transform(this Matrix matrix, PointF point)    {        var arr = new[] { point };        matrix.TransformPoints(arr);        return arr[0];    }    public static PointF TransformVector(this Matrix matrix, PointF point)    {        var arr = new[] { point };        matrix.TransformVectors(arr);        return arr[0];    }    public static float GetRotation(this Matrix matrix)    {        var vec = matrix.TransformVector(new PointF(1, 0));        return (float)(Math.Atan2(vec.Y, vec.X) * 180 / Math.PI);    }    public static float GetScale(this Matrix matrix)    {        var vec = matrix.TransformVector(new PointF(1, 0));        return (float)Math.Sqrt(vec.X * vec.X + vec.Y * vec.Y);    }    public static float Mod(float x, float y)    {        return (float)(x - y * Math.Floor(x / y));    }    public static Vector3 ToVec3(this netDxf.Vector3 vec)    {        return new((float)vec.X, (float)vec.Y, (float)vec.Z);    }    public static netDxf.Vector3 ToNetVec3(this Vector3 vec)    {        return new(vec.X, vec.Y, vec.Z);    }    public static Matrix4x4 Translate(this Matrix4x4 matrix, float x, float y, float z)    {        return Matrix4x4.CreateTranslation(x, y, z) * matrix;    }    public static Matrix4x4 Scale(this Matrix4x4 matrix, float x, float y, float z)    {        return Matrix4x4.CreateScale(x, y, z) * matrix;    }    public static Matrix4x4 Rotate(this Matrix4x4 matrix, float x, float y, float z, float angle)    {        var cos = (float)Math.Cos(angle * Math.PI / 180);        var sin = (float)Math.Sin(angle * Math.PI / 180);        var rotMatrix = new Matrix4x4();        rotMatrix.M11 = x * x * (1 - cos) + cos;        rotMatrix.M21 = x * y * (1 - cos) - z * sin;        rotMatrix.M31 = x * z * (1 - cos) + y * sin;        rotMatrix.M12 = y * x * (1 - cos) + z * sin;        rotMatrix.M22 = y * y * (1 - cos) + cos;        rotMatrix.M32 = y * z * (1 - cos) - x * sin;        rotMatrix.M13 = z * x * (1 - cos) - y * sin;        rotMatrix.M23 = z * y * (1 - cos) + x * sin;        rotMatrix.M33 = z * z * (1 - cos) + cos;        rotMatrix.M14 = 0;        rotMatrix.M24 = 0;        rotMatrix.M34 = 0;        rotMatrix.M44 = 1;        rotMatrix.M43 = 0;        rotMatrix.M42 = 0;        rotMatrix.M41 = 0;        return rotMatrix * matrix;    }    public static RectangleF? CombineBounds(IEnumerable<RectangleF?> bounds)    {        var e = bounds.NotNull().GetEnumerator();        if (!e.MoveNext())        {            return null;        }        var bound = e.Current;        while(e.MoveNext())        {            var thisBound = e.Current;            var x = Math.Min(bound.X, thisBound.X);            var y = Math.Min(bound.Y, thisBound.Y);            var right = Math.Max(bound.Right, thisBound.Right);            var bottom = Math.Max(bound.Bottom, thisBound.Bottom);            bound.X = x;            bound.Y = y;            bound.Height = bottom - bound.Y;            bound.Width = right - bound.X;        }        return bound;    }    public static RectangleF? CombineBounds(params RectangleF?[] bounds)    {        return CombineBounds((IEnumerable<RectangleF?>)bounds);    }    public static RectangleF AddPoint(RectangleF rectangle, PointF point)    {        var x = Math.Min(rectangle.X, point.X);        var y = Math.Min(rectangle.Y, point.Y);        var right = Math.Max(rectangle.Right, point.X);        var bottom = Math.Max(rectangle.Bottom, point.Y);        rectangle.X = x;        rectangle.Y = y;        rectangle.Height = bottom - rectangle.Y;        rectangle.Width = right - rectangle.X;        return rectangle;    }    public static RectangleF? RectangleFromPoints(params PointF[] points)    {        if (points.Length == 0) return null;        var rectangle = new RectangleF(points[0].X, points[0].Y, 0, 0);        for(int i = 1; i < points.Length; ++i)        {            var point = points[i];            var x = Math.Min(rectangle.X, point.X);            var y = Math.Min(rectangle.Y, point.Y);            var right = Math.Max(rectangle.Right, point.X);            var bottom = Math.Max(rectangle.Bottom, point.Y);            rectangle.X = x;            rectangle.Y = y;            rectangle.Height = bottom - rectangle.Y;            rectangle.Width = right - rectangle.X;        }        return rectangle;    }}
 |