From 490f48221fed47c6426d4b48ea21aa8609d3bf25 Mon Sep 17 00:00:00 2001 From: kriastans Date: Sun, 23 Jun 2024 14:24:23 +0800 Subject: [PATCH] =?UTF-8?q?[update]=20=E9=80=B2=E4=B8=80=E6=AD=A5=E5=AE=8C?= =?UTF-8?q?=E5=96=84Vector.cs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InkCanvasForClassX/Libraries/Vector.cs | 170 +++++++++++++++++++++++-- 1 file changed, 160 insertions(+), 10 deletions(-) diff --git a/InkCanvasForClassX/Libraries/Vector.cs b/InkCanvasForClassX/Libraries/Vector.cs index 497093f..c2dc41b 100644 --- a/InkCanvasForClassX/Libraries/Vector.cs +++ b/InkCanvasForClassX/Libraries/Vector.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace InkCanvasForClassX.Libraries { @@ -14,7 +10,7 @@ namespace InkCanvasForClassX.Libraries private double _x = 0; private double _y = 0; - public Vector(double x, double y) { + public Vector(double x = 0, double y = 0) { _x = x; _y = y; } @@ -32,9 +28,10 @@ namespace InkCanvasForClassX.Libraries /// /// 將該向量改變為其相反向量 /// - public void Negate() { + public Vector Negate() { _x = -_x; _y = -_y; + return this; } /// @@ -69,10 +66,11 @@ namespace InkCanvasForClassX.Libraries /// /// 將該向量和另一個向量相加 /// - public void Add(Vector vec) + public Vector Add(Vector vec) { _x = _x + vec.X; _y = _y + vec.Y; + return this; } /// @@ -86,10 +84,11 @@ namespace InkCanvasForClassX.Libraries /// /// 將該向量減去另一個向量 /// - public void Subtract(Vector vec) + public Vector Subtract(Vector vec) { _x = _x - vec.X; _y = _y - vec.Y; + return this; } /// @@ -103,10 +102,11 @@ namespace InkCanvasForClassX.Libraries /// /// 將該向量除以一個數值 /// - public void DivideBy(double n) + public Vector DivideBy(double n) { _x = _x / n; _y = _y / n; + return this; } /// @@ -120,10 +120,11 @@ namespace InkCanvasForClassX.Libraries /// /// 將該向量乘以一個數值 /// - public void Multiply(double n) + public Vector Multiply(double n) { _x = _x * n; _y = _y * n; + return this; } /// @@ -133,5 +134,154 @@ namespace InkCanvasForClassX.Libraries { return new Vector(vec.X * n, vec.Y * n); } + + /// + /// 將該向量垂直旋轉 + /// + public Vector PerpendicularRotation() { + var _t = _x; + _x = _y; + _y = - _t; + return this; + } + + /// + /// 提供Vector,返回垂直旋轉後的Vector + /// + public static Vector PerpendicularRotationVector(Vector vec) + { + return new Vector(vec.Y, - vec.X); + } + + /// + /// 將該向量點乘另一個向量 + /// + public Vector Dot(Vector vec) + { + _x = _x * vec.X; + _y = _y * vec.Y; + return this; + } + + /// + /// 提供兩個Vector,返回兩個Vector點乘後的Vector + /// + public static Vector DotVectors(Vector vec1, Vector vec2) + { + return new Vector(vec1.X * vec2.X, vec1.Y * vec2.Y); + } + + /// + /// 判斷該向量和另外一個向量是否相等 + /// + public bool IsEqual(Vector vec) + { + return Math.Abs(_x - vec.X) < 0.01 && Math.Abs(_y - vec.Y) < 0.01; + } + + /// + /// 獲取該向量和另一個向量的平方距離 + /// + public double DistLengthSquared(Vector vec) { + var subVec = Vector.SubtractVectors(this, vec); + return subVec.LengthSquared; + } + + /// + /// 獲取一個向量和另一個向量的平方距離 + /// + public double DistLengthSquaredVectors(Vector vec1, Vector vec2) + { + var subVec = Vector.SubtractVectors(vec1, vec2); + return subVec.LengthSquared; + } + + /// + /// 獲取該向量和另一個向量的距離 + /// + public double DistLength(Vector vec) { + return Vector.Hypot(this._y - vec.Y, this._x - vec.X); + } + + /// + /// 獲取一個向量和另一個向量的距離 + /// + public double DistLengthVectors(Vector vec1, Vector vec2) + { + return Vector.Hypot(vec1.Y - vec2.Y, vec1.X - vec2.X); + } + + /// + /// 將該向量修改為其中間向量 + /// + public Vector Med(Vector vec) { + var addVec = new Vector(_x, _y).Add(vec); + addVec.Multiply(0.5); + _x = addVec.X; + _y = addVec.Y; + return this; + } + + /// + /// 獲取一個向量和另一個向量的中間向量 + /// + public static Vector MedVectors(Vector vec1, Vector vec2) { + var addVec = Vector.AddVectors(vec1, vec2); + return addVec.Multiply(0.5); + } + + /// + /// 將該向量圍繞另一個向量旋轉r弧度 + /// + public Vector Rotate(Vector vec, double r) { + var sin = Math.Sin(r); + var cos = Math.Cos(r); + + var px = _x - vec.X; + var py = _y - vec.Y; + + var nx = px * cos - py * sin; + var ny = px * sin + py * cos; + + _x = nx + vec.X; + _y = ny + vec.Y; + return this; + } + + /// + /// 將一個向量圍繞另一個向量旋轉r弧度 + /// + public static Vector RotateVectors(Vector vec1, Vector vec2, double r) + { + var sin = Math.Sin(r); + var cos = Math.Cos(r); + + var px = vec1.X - vec2.X; + var py = vec1.Y - vec2.Y; + + var nx = px * cos - py * sin; + var ny = px * sin + py * cos; + + return new Vector(nx + vec2.X, ny + vec2.Y); + } + + /// + /// 將該向量與另一個向量插值,TODO + /// + public Vector Interpolate(Vector vec) { + throw new NotImplementedException(); + return this; + } + + /// + /// 將一個向量與另一個向量插值,TODO + /// + public static Vector InterpolateVectors(Vector vec1, Vector vec2) + { + throw new NotImplementedException(); + return new Vector(); + } + + // TODO: pjr(); } }