/// <summary>
/// 获取垂直法线的平面的一条线,P2
/// </summary>
/// <param name="v0">顶点</param>
/// <param name="p0">内部第一个点,与顶点连接起来认为是法线</param>
/// <param name="p1">与Z轴垂直的线</param>
/// <param name="angle">线间夹角</param>
/// <returns></returns>
public double[] GetP3(double[] v0,double[] p0,double[] p1, double angle)
{
//c = a×b = (a.y*b.z-b.y*a.z , b.x*a.z-a.x*b.z , a.x*b.y-b.x*a.y)
double[] p2 = new double[3];
double V = Math.Sqrt((v0[0] - p0[0]) * (v0[0] - p0[0]) + (v0[1] - p0[1]) * (v0[1] - p0[1]) + (v0[2] - p0[2]) * (v0[2] - p0[2]));
double R = Math.Sqrt((p1[0] - p0[0]) * (p1[0] - p0[0]) + (p1[1] - p0[1]) * (p1[1] - p0[1]) + (p1[2] - p0[2]) * (p1[2] - p0[2]) );
double h = R * R * Math.Sin(angle) / V;
p2[1] = p0[1] + (p1[1] - p0[1]) * Math.Cos(angle) + Math.Sin(angle) * ((p1[0]-p0[0])*(v0[2]-p0[2])-(p1[2]-p0[2])*(v0[0]-p0[0])) / V;
p2[0] = p0[0] + ((p1[0] - p0[0])*(p2[1]-p0[1])-R*R*Math.Sin(angle)*(v0[2]-p0[2])/V)/(p1[1]-p0[1]);
p2[2] = p0[2] + (((R*R*Math.Sin(angle)*(v0[0]-p0[0]))/V)+(p2[1]-p0[1])*(p1[2]-p0[2]))/ (p1[1] - p0[1]);
return p2;
}