149 lines
3.6 KiB
C#
149 lines
3.6 KiB
C#
|
using System;
|
|||
|
using System.Drawing;
|
|||
|
|
|||
|
namespace System.Drawing
|
|||
|
{
|
|||
|
public class Circle
|
|||
|
{
|
|||
|
|
|||
|
public Circle()
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
public Circle(int x, int y, int width, int height)
|
|||
|
{
|
|||
|
this.X = x;
|
|||
|
this.Y = y;
|
|||
|
this.Width = width;
|
|||
|
this.Height = height;
|
|||
|
}
|
|||
|
|
|||
|
public Circle(Rectangle rectangle)
|
|||
|
{
|
|||
|
this.X = rectangle.X;
|
|||
|
this.Y = rectangle.Y;
|
|||
|
this.Width = rectangle.Width;
|
|||
|
this.Height = rectangle.Height;
|
|||
|
}
|
|||
|
|
|||
|
public Circle(Point position, Size size)
|
|||
|
{
|
|||
|
this.X = position.X;
|
|||
|
this.Y = position.Y;
|
|||
|
this.Width = size.Width;
|
|||
|
this.Height = size.Height;
|
|||
|
}
|
|||
|
|
|||
|
public Circle(Size size)
|
|||
|
{
|
|||
|
this.X = 0;
|
|||
|
this.Y = 0;
|
|||
|
this.Width = size.Width;
|
|||
|
this.Height = size.Height;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
public int X { get; set; } = 0;
|
|||
|
|
|||
|
public int Y { get; set; } = 0;
|
|||
|
|
|||
|
public int Width { get; set; } = 0;
|
|||
|
|
|||
|
public int Height { get; set; } = 0;
|
|||
|
|
|||
|
public PointF Origin
|
|||
|
{
|
|||
|
get
|
|||
|
{
|
|||
|
return new PointF()
|
|||
|
{
|
|||
|
X = (this.Width / 2) + this.X,
|
|||
|
Y = (this.Height / 2) + this.Y
|
|||
|
};
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public int MinSideLength => Math.Min(this.Width, this.Height);
|
|||
|
|
|||
|
public static PointF GetPointromOrigin(PointF originPosition, Size size)
|
|||
|
{
|
|||
|
float offsetX = (size.Width / 2);
|
|||
|
float offsetY = (size.Height / 2);
|
|||
|
|
|||
|
PointF rs = new PointF()
|
|||
|
{
|
|||
|
X = originPosition.X,
|
|||
|
Y = originPosition.Y
|
|||
|
};
|
|||
|
|
|||
|
rs.X -= offsetX;
|
|||
|
rs.Y -= offsetY;
|
|||
|
|
|||
|
return rs;
|
|||
|
}
|
|||
|
|
|||
|
public PointF GetPoint(int deg, int distance)
|
|||
|
{
|
|||
|
PointF origin = this.Origin;
|
|||
|
PointF rs = new PointF()
|
|||
|
{
|
|||
|
X = origin.X,
|
|||
|
Y = origin.Y
|
|||
|
};
|
|||
|
|
|||
|
if (deg == 0)
|
|||
|
{
|
|||
|
rs.Y -= distance;
|
|||
|
}
|
|||
|
else if (deg == 90)
|
|||
|
{
|
|||
|
rs.X += distance;
|
|||
|
}
|
|||
|
else if (deg == 180)
|
|||
|
{
|
|||
|
rs.Y += distance;
|
|||
|
}
|
|||
|
else if (deg == 270)
|
|||
|
{
|
|||
|
rs.X -= distance;
|
|||
|
}
|
|||
|
else if ((deg > 0) && (deg < 90))
|
|||
|
{
|
|||
|
rs.X += (float)(distance * Math.Sin(calcToRad(deg)));
|
|||
|
rs.Y -= (float)(distance * Math.Cos(calcToRad(deg)));
|
|||
|
}
|
|||
|
else if ((deg > 90) && (deg < 180))
|
|||
|
{
|
|||
|
rs.X += (float)(distance * Math.Cos(calcToRad(deg - 90)));
|
|||
|
rs.Y += (float)(distance * Math.Sin(calcToRad(deg - 90)));
|
|||
|
}
|
|||
|
else if ((deg > 180) && (deg < 270))
|
|||
|
{
|
|||
|
rs.X -= (float)(distance * Math.Sin(calcToRad(deg - 180)));
|
|||
|
rs.Y += (float)(distance * Math.Cos(calcToRad(deg - 180)));
|
|||
|
}
|
|||
|
else if ((deg > 270) && (deg < 360))
|
|||
|
{
|
|||
|
rs.X -= (float)(distance * Math.Cos(calcToRad(deg - 270)));
|
|||
|
rs.Y -= (float)(distance * Math.Sin(calcToRad(deg - 270)));
|
|||
|
}
|
|||
|
|
|||
|
// adjust position
|
|||
|
rs.X += this.X;
|
|||
|
rs.Y += this.Y;
|
|||
|
|
|||
|
return rs;
|
|||
|
}
|
|||
|
|
|||
|
public void Deflate(int x, int y)
|
|||
|
{
|
|||
|
this.Width -= x;
|
|||
|
this.Height -= y;
|
|||
|
}
|
|||
|
|
|||
|
protected double calcToRad(int deg) => ((Math.PI / 180) * deg);
|
|||
|
|
|||
|
}
|
|||
|
}
|