C#
…
C# 已知空間三點,求圓心座標
public class PT
{
public double x { get; set; }
public double y { get; set; }
public double z { get; set; }
};
PT FindCenterPoint(PT pd, PT pd2, PT pd3)
{
double a1, b1, c1, d1;
double a2, b2, c2, d2;
double a3, b3, c3, d3;
PT pd_center = new PT();
a1 = (pd.y * pd2.z - pd2.y * pd.z - pd.y * pd3.z + pd3.y * pd.z + pd2.y * pd3.z - pd3.y * pd2.z);
b1 = -(pd.x * pd2.z - pd2.x * pd.z - pd.x * pd3.z + pd3.x * pd.z + pd2.x * pd3.z - pd3.x * pd2.z);
c1 = (pd.x * pd2.y - pd2.x * pd.y - pd.x * pd3.y + pd3.x * pd.y + pd2.x * pd3.y - pd3.x * pd2.y);
d1 = -(pd.x * pd2.y * pd3.z - pd.x * pd3.y * pd2.z - pd2.x * pd.y * pd3.z + pd2.x * pd3.y * pd.z
+ pd3.x * pd.y * pd2.z - pd3.x * pd2.y * pd.z);
a2 = 2 * (pd2.x - pd.x);
b2 = 2 * (pd2.y - pd.y);
c2 = 2 * (pd2.z - pd.z);
d2 = pd.x * pd.x + pd.y * pd.y + pd.z * pd.z - pd2.x * pd2.x - pd2.y * pd2.y - pd2.z * pd2.z;
a3 = 2 * (pd3.x - pd.x);
b3 = 2 * (pd3.y - pd.y);
c3 = 2 * (pd3.z - pd.z);
d3 = pd.x * pd.x + pd.y * pd.y + pd.z * pd.z - pd3.x * pd3.x - pd3.y * pd3.y - pd3.z * pd3.z;
pd_center.y = (a1 * c2 * d3 - a1 * c3 * d2 - a2 * c1 * d3 + a2 * c3 * d1 + a3 * c1 * d2 - a3 * c2 * d1)
/ (a1 * b2 * c3 - a1 * b3 * c2 - a2 * b1 * c3 + a2 * b3 * c1 + a3 * b1 * c2 - a3 * b2 * c1);
pd_center.z = -(a1 * b2 * d3 - a1 * b3 * d2 - a2 * b1 * d3 + a2 * b3 * d1 + a3 * b1 * d2 - a3 * b2 * d1)
/ (a1 * b2 * c3 - a1 * b3 * c2 - a2 * b1 * c3 + a2 * b3 * c1 + a3 * b1 * c2 - a3 * b2 * c1);
pd_center.x = -(b1 * c2 * d3 - b1 * c3 * d2 - b2 * c1 * d3 + b2 * c3 * d1 + b3 * c1 * d2 - b3 * c2 * d1)
/ (a1 * b2 * c3 - a1 * b3 * c2 - a2 * b1 * c3 + a2 * b3 * c1 + a3 * b1 * c2 - a3 * b2 * c1);
return pd_center;
}