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;
- }
- }
|