File: PointF.cs
Web Access
Project: src\src\Graphics\src\Graphics\Graphics.csproj (Microsoft.Maui.Graphics)
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.Numerics;
 
namespace Microsoft.Maui.Graphics
{
	[DebuggerDisplay("X={X}, Y={Y}")]
	[TypeConverter(typeof(Converters.PointFTypeConverter))]
	public partial struct PointF
	{
		public float X { get; set; }
 
		public float Y { get; set; }
 
		public static readonly PointF Zero = new PointF();
 
		public override string ToString()
		{
			return $"{{X={X.ToString(CultureInfo.InvariantCulture)} Y={Y.ToString(CultureInfo.InvariantCulture)}}}";
		}
 
		public PointF(float x, float y) : this()
		{
			X = x;
			Y = y;
		}
 
		public PointF(SizeF sz) : this()
		{
			X = sz.Width;
			Y = sz.Height;
		}
 
		public PointF(Vector2 v)
		{
			X = v.X;
			Y = v.Y;
		}
 
		public override bool Equals(object o)
		{
			if (!(o is PointF))
				return false;
 
			return this == (PointF)o;
		}
 
		public bool Equals(object o, float epsilon)
		{
			if (!(o is PointF))
				return false;
 
			var compareTo = (PointF)o;
			return Math.Abs(compareTo.X - X) < epsilon && Math.Abs(compareTo.Y - Y) < epsilon;
		}
 
		public override int GetHashCode()
		{
			return X.GetHashCode() ^ (Y.GetHashCode() * 397);
		}
 
		public PointF Offset(float dx, float dy)
		{
			PointF p = this;
			p.X += dx;
			p.Y += dy;
			return p;
		}
 
		public PointF TransformBy(in Matrix3x2 transform)
		{
			return Vector2.Transform((Vector2)this, transform);
		}
 
		public PointF Round()
		{
			return new PointF(MathF.Round(X), MathF.Round(Y));
		}
 
		public bool IsEmpty => X == 0 && Y == 0;
 
		public static explicit operator SizeF(PointF pt)
		{
			return new SizeF(pt.X, pt.Y);
		}
 
		public static PointF operator +(PointF pt, SizeF sz)
		{
			return new PointF(pt.X + sz.Width, pt.Y + sz.Height);
		}
 
		public static SizeF operator -(PointF ptA, PointF ptB)
		{
			return new SizeF(ptA.X - ptB.X, ptA.Y - ptB.Y);
		}
 
		public static PointF operator -(PointF pt, SizeF sz)
		{
			return new PointF(pt.X - sz.Width, pt.Y - sz.Height);
		}
 
		public static bool operator ==(PointF ptA, PointF ptB)
		{
			return ptA.X == ptB.X && ptA.Y == ptB.Y;
		}
 
		public static bool operator !=(PointF ptA, PointF ptB)
		{
			return ptA.X != ptB.X || ptA.Y != ptB.Y;
		}
 
		public float Distance(PointF other)
		{
			return MathF.Sqrt(MathF.Pow(X - other.X, 2) + MathF.Pow(Y - other.Y, 2));
		}
 
		public void Deconstruct(out float x, out float y)
		{
			x = X;
			y = Y;
		}
		public static implicit operator Point(PointF p) => new Point(p.X, p.Y);
 
		public static implicit operator PointF(Vector2 v) => new PointF(v);
 
		public static explicit operator Vector2(PointF p) => new Vector2(p.X, p.Y);
 
		public static bool TryParse(string value, out PointF pointF)
		{
			if (!string.IsNullOrEmpty(value))
			{
				string[] xy = value.Split(',');
				if (xy.Length == 2 && float.TryParse(xy[0], NumberStyles.Number, CultureInfo.InvariantCulture, out var x)
					&& float.TryParse(xy[1], NumberStyles.Number, CultureInfo.InvariantCulture, out var y))
				{
					pointF = new PointF(x, y);
					return true;
				}
			}
 
			pointF = default;
			return false;
		}
	}
}