zcmfk 发表于 2012-7-27 16:41:50

请教空间四个点如何建模生成球体

请教各位:
   如何不共面的任意空间四个点(已知坐标)如何建模生成过该四点的球体?

雪山飞狐_lzh 发表于 2012-7-27 23:19:05

这个似乎只有计算?
球面上任意三点组成的圆,在此圆心的法线,是必通过球心的
由此选4点中的三点,做两条这样的法线,即可得到球心

chmenf087 发表于 2012-7-27 23:39:10

本帖最后由 chmenf087 于 2012-7-27 23:41 编辑

1. 三点生成一平面plane
2. 取得法向量
3. 三点生成圆
4. 取得圆心坐标
5. 圆心处沿法线向量正反方向生成两条Ray
6. 选取不重复的三点重复1-5
7. 求四条Ray交点(交点即圆心)无交点则四点共面退出
8. 由圆心和其中一点求半径R
9. 建立Sphere
完成

雪山飞狐_lzh 发表于 2012-7-28 10:41:12

            List<Point3d> pts =
                new List<Point3d>
                {
                  new Point3d(0,0,0),
                  new Point3d(3,0,0),
                  new Point3d(0,3,0),
                  new Point3d(0,0,3)
                };

            //获取三点所在圆的法向量
            Func<Point3d,Point3d,Point3d,Line3d> getcn =
                (Point3d p1, Point3d p2, Point3d p3)
                =>
                {
                  var ca = new CircularArc3d(p1, p2, p3);
                  return new Line3d(ca.Center, ca.Normal);
                };

            var l3d1 = getcn(pts, pts, pts);
            var l3d2 = getcn(pts, pts, pts);
            
            if (l3d1.IsParallelTo(l3d2))
            {

            }
            else
            {
                var ipts = l3d1.IntersectWith(l3d2);
                if (ipts.Length == 0)
                {
                  var cen = ipts;
                  var r = (pts - cen).Length;
                  var sphere = new Sphere(r, cen);
                }
            }

long9841 发表于 2012-7-30 13:49:49

任意4点,并不是都一定在球体表面.
也就是说,不一定存在这样的球体.
(x-a)^2+(y-b)^2+(z-c)^2=r^2
坐标带到方程里,有解才行

zcmfk 发表于 2012-7-30 16:33:49

完美解决!
多谢雪山飞狐_lzh 和chmenf087 !
通过两位才认识到NET开发有CircularArc3d、Line3d等强大的类处理功能。
——简单几行代码解决了数值计算中上百行才能完成的数学难题。
谢谢!
页: [1]
查看完整版本: 请教空间四个点如何建模生成球体