Vector 在三维空间中绘制圆形线段

Vector 在三维空间中绘制圆形线段,vector,3d,geometry,Vector,3d,Geometry,我正在尝试在3D中绘制一个圆形段(cs)。给定的数据是cs和原点的起点和终点 我的想法是首先将圆转换为单位圆(忽略Z坐标)并计算起点和终点的角度。现在,我可以使用下面的循环生成点列表,其中包含三维空间中虚拟平面上圆段的数据。最后一步是围绕起点和终点之间的点旋转点 问题是,我的循环返回一个坐标和半径合理的圆段,但它在起点和终点切割直线 我的代码: Visual3D lines; Vector3D start = new Vector3D(2, 2, 0); //2, 2, 0 Vector3D e

我正在尝试在3D中绘制一个圆形段(cs)。给定的数据是cs和原点的起点和终点

我的想法是首先将圆转换为单位圆(忽略Z坐标)并计算起点和终点的角度。现在,我可以使用下面的循环生成点列表,其中包含三维空间中虚拟平面上圆段的数据。最后一步是围绕起点和终点之间的点旋转点

问题是,我的循环返回一个坐标和半径合理的圆段,但它在起点和终点切割直线

我的代码:

Visual3D lines;
Vector3D start = new Vector3D(2, 2, 0); //2, 2, 0
Vector3D end = new Vector3D(4, 4, 2); //4, 4, 2
Vector3D up = new Vector3D(0, 1, 0);
Vector3D middle = pkm.ToVector3D(); //pkm.ToVector3D()
double r = Math.Sqrt(Math.Pow(start.X - middle.X, 2) + Math.Pow(start.Y - middle.Y, 2) + Math.Pow(start.Z - middle.Z, 2)); //Implement Check mechanism for possible points
List<Point3D> points = new List<Point3D>();

//calc
Vector3D idealStart = start - middle; 
Vector3D idealEnd = end - middle;
idealStart.Z = 0;
idealEnd.Z = 0;
idealStart.Normalize();
idealEnd.Normalize();

double delta = Math.Acos((Vector3D.DotProduct(up, idealStart)) / (up.Length * idealStart.Length));
double phi = Math.Acos((Vector3D.DotProduct(up, idealEnd)) / (up.Length * idealEnd.Length));

for (double i = phi; i <= delta; i += 0.01)
{
    points.Add(new Point3D(Math.Sin(i) * r + middle.X, Math.Cos(i) * r + middle.Y, middle.Z));
}



Vector3D half = (end - start) / 2;
middle = middle - start - half; //switch start with end
middle.Normalize();

lines = meschi.GetLinie(points, 2, Colors.Wheat); //Transforms the type of data
lines = meschi.ModelDrehenUmPunkt(lines, ((end + start) / 2).ToPoint3D(), middle, -Vector3D.AngleBetween(end - start, start)); // Final Rotation
Visual3D线;
Vector3D开始=新的Vector3D(2,2,0)//2, 2, 0
Vector3D结束=新的Vector3D(4,4,2)//4, 4, 2
Vector3D向上=新的Vector3D(0,1,0);
Vector3D middle=pkm.ToVector3D()//pkm.ToVector3D()
double r=Math.Sqrt(Math.Pow(start.X-middle.X,2)+Math.Pow(start.Y-middle.Y,2)+Math.Pow(start.Z-middle.Z,2))//对可能的点实施检查机制
列表点=新列表();
//计算
Vector3D idealStart=开始-中间;
Vector3D idealEnd=末端-中间;
idealStart.Z=0;
理想值Z=0;
idealStart.Normalize();
idealEnd.Normalize();
double delta=Math.Acos((Vector3D.DotProduct(up,idealStart))/(up.Length*idealStart.Length));
double phi=Math.Acos((Vector3D.DotProduct(up,idealEnd))/(up.Length*idealEnd.Length));
对于(双i=φ;i