|
@@ -5,8 +5,12 @@ using System.Collections.Generic;
|
|
|
using System.Drawing;
|
|
|
using System.Drawing.Drawing2D;
|
|
|
using System.Linq;
|
|
|
+using System.Numerics;
|
|
|
using System.Text;
|
|
|
using System.Threading.Tasks;
|
|
|
+using Vector2 = System.Numerics.Vector2;
|
|
|
+using Vector3 = System.Numerics.Vector3;
|
|
|
+using Vector4 = System.Numerics.Vector4;
|
|
|
|
|
|
namespace InABox.Dxf;
|
|
|
|
|
@@ -16,35 +20,90 @@ internal class DrawData
|
|
|
|
|
|
public Graphics Graphics { get; set; }
|
|
|
|
|
|
- private Stack<Matrix> MatrixStack = new();
|
|
|
+ private Stack<Matrix4x4> MatrixStack = new();
|
|
|
+
|
|
|
+ private Matrix4x4 Transform = Matrix4x4.Identity;
|
|
|
+
|
|
|
+ public DrawData()
|
|
|
+ {
|
|
|
+ }
|
|
|
|
|
|
public void PushTransform()
|
|
|
{
|
|
|
- MatrixStack.Push(Graphics.Transform);
|
|
|
+ MatrixStack.Push(Transform);
|
|
|
+ }
|
|
|
+
|
|
|
+ private Matrix ProjectMatrix(Matrix4x4 matrix)
|
|
|
+ {
|
|
|
+ var elMatrix = new Matrix3x2();
|
|
|
+ elMatrix.M11 = (float)matrix.M11;
|
|
|
+ elMatrix.M12 = (float)matrix.M12;
|
|
|
+ elMatrix.M21 = (float)matrix.M21;
|
|
|
+ elMatrix.M22 = (float)matrix.M22;
|
|
|
+ elMatrix.M31 = (float)matrix.M41;
|
|
|
+ elMatrix.M32 = (float)matrix.M42;
|
|
|
+ var newMatrix = new Matrix();
|
|
|
+ newMatrix.MatrixElements = elMatrix;
|
|
|
+ return newMatrix;
|
|
|
}
|
|
|
|
|
|
public void PopTransform()
|
|
|
{
|
|
|
- Graphics.Transform = MatrixStack.Pop();
|
|
|
+ Transform = MatrixStack.Pop();
|
|
|
+ Graphics.Transform = ProjectMatrix(Transform);
|
|
|
}
|
|
|
|
|
|
+ public Matrix4x4 ArbitraryAxisMatrix(Vector3 zAxis)
|
|
|
+ {
|
|
|
+ if (zAxis.Equals(Vector3.UnitZ))
|
|
|
+ {
|
|
|
+ return Matrix4x4.Identity;
|
|
|
+ }
|
|
|
+
|
|
|
+ var unitY = Vector3.UnitY;
|
|
|
+ var unitZ = Vector3.UnitZ;
|
|
|
+ var v = ((!(Math.Abs(zAxis.X) < 1.0 / 64.0) || !(Math.Abs(zAxis.Y) < 1.0 / 64.0)) ? Vector3.Cross(unitZ, zAxis) : Vector3.Cross(unitY, zAxis));
|
|
|
+ v = Vector3.Normalize(v);
|
|
|
+ var vector = Vector3.Cross(zAxis, v);
|
|
|
+ vector = Vector3.Normalize(vector);
|
|
|
+ return new Matrix4x4(v.X, vector.X, zAxis.X, 0, v.Y, vector.Y, zAxis.Y, 0, v.Z, vector.Z, zAxis.Z, 0, 0, 0, 0, 1);
|
|
|
+ }
|
|
|
+ public void ArbitraryAxis(netDxf.Vector3 zAxis)
|
|
|
+ {
|
|
|
+ Transform = ArbitraryAxisMatrix(new((float)zAxis.X, (float)zAxis.Y, (float)zAxis.Z)) * Transform;
|
|
|
+ Graphics.Transform = ProjectMatrix(Transform);
|
|
|
+ }
|
|
|
+ public void ArbitraryAxis(Vector3 zAxis)
|
|
|
+ {
|
|
|
+ Transform = ArbitraryAxisMatrix(zAxis) * Transform;
|
|
|
+ Graphics.Transform = ProjectMatrix(Transform);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void Translate(float x, float y)
|
|
|
+ {
|
|
|
+ Transform = Transform.Translate(x, y, 0);
|
|
|
+ Graphics.Transform = ProjectMatrix(Transform);
|
|
|
+ }
|
|
|
public void Translate(PointF point)
|
|
|
{
|
|
|
- Graphics.TranslateTransform(point.X, point.Y);
|
|
|
+ Transform = Transform.Translate(point.X, point.Y, 0);
|
|
|
+ Graphics.Transform = ProjectMatrix(Transform);
|
|
|
}
|
|
|
|
|
|
public void Rotate(float angle)
|
|
|
{
|
|
|
- Graphics.RotateTransform(angle);
|
|
|
+ Transform = Transform.Rotate(0, 0, 1, angle);
|
|
|
+ Graphics.Transform = ProjectMatrix(Transform);
|
|
|
}
|
|
|
|
|
|
public void Scale(float scale)
|
|
|
{
|
|
|
- Graphics.ScaleTransform(scale, scale);
|
|
|
+ Scale(scale, scale);
|
|
|
}
|
|
|
public void Scale(float scaleX, float scaleY)
|
|
|
{
|
|
|
- Graphics.ScaleTransform(scaleX, scaleY);
|
|
|
+ Transform = Transform.Scale(scaleX, scaleY, 1);
|
|
|
+ Graphics.Transform = ProjectMatrix(Transform);
|
|
|
}
|
|
|
|
|
|
public float ConvertThickness(float thickness)
|
|
@@ -54,20 +113,26 @@ internal class DrawData
|
|
|
|
|
|
public PointF TransformVec(PointF vec)
|
|
|
{
|
|
|
- return Graphics.Transform.TransformVector(vec);
|
|
|
+ var nVec = Vector4.Transform(new Vector4(vec.X, vec.Y, 0, 1), Transform);
|
|
|
+ return new(nVec.X, nVec.Y);
|
|
|
+ }
|
|
|
+ public Vector2 TransformVec(Vector2 vec)
|
|
|
+ {
|
|
|
+ var nVec = Vector4.Transform(new Vector4(vec.X, vec.Y, 0, 1), Transform);
|
|
|
+ return new(nVec.X, nVec.Y);
|
|
|
}
|
|
|
|
|
|
public float ScaleFactor()
|
|
|
{
|
|
|
- return ((System.Numerics.Vector2)TransformVec(new(1, 0))).Length();
|
|
|
+ return (TransformVec(new Vector2(1, 0))).Length();
|
|
|
}
|
|
|
|
|
|
- public static PointF ConvertPoint(Vector2 vec)
|
|
|
+ public static PointF ConvertPoint(netDxf.Vector2 vec)
|
|
|
{
|
|
|
return new PointF((float)vec.X, (float)vec.Y);
|
|
|
}
|
|
|
|
|
|
- public static PointF ConvertPoint(Vector3 vec)
|
|
|
+ public static PointF ConvertPoint(netDxf.Vector3 vec)
|
|
|
{
|
|
|
return new PointF((float)vec.X, (float)vec.Y);
|
|
|
}
|