public class MinCircle
{
public static void circle_center(Vector2 p0, Vector2 p1, ref Vector2 cp)
{
cp.x = (p0.x + p1.x) / 2;
cp.y = (p0.y + p1.y) / 2;
}
public static void circle_center(Vector2 p0, Vector2 p1, Vector2 p2, ref Vector2 cp)
{
double a1 = p1.x - p0.x, b1 = p1.y - p0.y, c1 = (a1 * a1 + b1 * b1) / 2;
double a2 = p2.x - p0.x, b2 = p2.y - p0.y, c2 = (a2 * a2 + b2 * b2) / 2;
double d = (a1 * b2 - a2 * b1);
cp.x = (float)(p0.x + (c1 * b2 - c2 * b1) / d);
cp.y = (float)(p0.y + (a1 * c2 - a2 * c1) / d);
}
public static double radius;
public static Vector2 center;
public static bool point_in(Vector2 p)
{
return Vector2.Distance(p, center) <= radius;
}
public static void min_circle_cover(List<Vector2> a, int n)
{
radius = 0;
center = a[0];
for (int i = 1; i < n; i++)
if (!point_in(a[i]))
{
center = a[i];
radius = 0;
for (int j = 0; j < i; j++)
if (!point_in(a[j]))
{
circle_center(a[i], a[j], ref center);
radius = Vector2.Distance(a[j], center);
for (int k = 0; k < j; k++) if (!point_in(a[k]))
{
circle_center(a[i], a[j], a[k], ref center);
radius = Vector2.Distance(a[k], center);
}
}
}
}
}
使用
MinCircle.min_circle_cover(_points, _points.Count);
DrawCircle(new Vector3(MinCircir.center.x, MinCircir.center.y, transform.position.z), (float)MinCircir.radius);
6万+

被折叠的 条评论
为什么被折叠?



