C#写法
using System;
public class GeometryCalculator
{
public static void Main()
{
// 已知值
int X0 = 120, Y0 = 100; // 圆心坐标
int r = 30; // 圆的半径
int X1 = 50, Y1 = 60; // 圆外点坐标
// 计算圆上最近的点坐标
var nearestPoint = FindNearestPointOnCircle(X0, Y0, r, X1, Y1);
// 输出结果
Console.WriteLine($"The nearest point on the circle is at ({nearestPoint.X}, {nearestPoint.Y})");
}
public static (int X, int Y) FindNearestPointOnCircle(int X0, int Y0, int r, int X1, int Y1)
{
// 计算斜率 m 和截距 b
double m = (Y1 - Y0) / (X1 - X0);
double b = Y0 - m * X0;
// 圆心到直线的距离公式
double distance = Math.Abs(m * X0 - Y0 + b) / Math.Sqrt(m * m + 1);
// 计算圆上点到圆心的投影点的坐标
double Xp = X0 + distance * (X1 - X0) / Math.Sqrt((m * m + 1));
double Yp = Y0 + distance * (Y1 - Y0) / Math.Sqrt((m * m + 1));
// 计算圆上点到圆心投影点的向量与圆半径的单位向量
double unitVectorX = (Xp - X0) / r;
double unitVectorY = (Yp - Y0) / r;
// 计算圆上的点
int X = (int)Math.Round(X0 + unitVectorX * r);
int Y = (int)Math.Round(Y0 + unitVectorY * r);
return (X, Y);
}
}