如何检查一个点是否在两个帽是椭圆且具有不同长度轴的圆柱体内?
How to check if a point is inside a cylinder whose two caps are ellipses and have different length axes?
我正在编写一个 3D 应用程序,我需要检查一个点是否在胶囊内。因为一个胶囊可以分为两个半椭球体和一个圆柱体,所以这个问题可以通过对三个分量检查一个点来解决。检查一个点是否在椭圆体内很容易,但我不知道如何处理圆柱体?
因此,问题变为:
在3D中space,有一个圆柱体,其顶部是两个椭圆。两个椭圆的轴平行但长度不同。给定一个点,如何判断它是否在这个圆柱体内?
--------------------附加信息--------------------
这不是普通的胶囊。这个胶囊的两个盖子可以沿着默认坐标系的轴分别缩放。
如果您知道如何检查点是否位于椭球内,那么我认为没有问题。
如果椭圆帽是椭圆体的一半,只需检查
(point is in ellipsoid) or (point is in cylinder)
如果椭圆体帽小于椭圆体的一半,请检查
((point is in ellipsoid) and (point lies at outer side of base plane of cylinder)) or
(point is in cylinder)
进行轴旋转,使圆柱体的主轴成为旋转轴之一(例如 z 轴)。
使用这些变换后的坐标,圆柱体中的一个点必须:
- 在椭圆体的下方或上方,并且
- 超过或位于低椭球体上,并且
- 投影到与圆柱主轴垂直的平面内,必须在平面和圆柱定义的椭球内。
假设您旋转了 'cylinder' 使其以 z 轴为轴,并且顶部的椭圆 (z=h) 为
sqr( x/a1) + sqr( y/b1) = 1
而底部 (z=0) 的椭圆是
sqr( x/a0) + sqr( y/b0) = 1
然后在 z (0<=z<=h) 处椭圆将是
sqr( x/az) + sqr( y/bz) = 1
哪里
az = a0 + (z/h)*(a1-a0)
bz = b0 + (z/h)*(b1-b0)
因此,如果您的测试点是 (x,y,z) 且 0<=z<=h,则它在圆柱体中当且仅当
sqr( x/az) + sqr( y/bz) <= 1
我正在编写一个 3D 应用程序,我需要检查一个点是否在胶囊内。因为一个胶囊可以分为两个半椭球体和一个圆柱体,所以这个问题可以通过对三个分量检查一个点来解决。检查一个点是否在椭圆体内很容易,但我不知道如何处理圆柱体?
因此,问题变为:
在3D中space,有一个圆柱体,其顶部是两个椭圆。两个椭圆的轴平行但长度不同。给定一个点,如何判断它是否在这个圆柱体内?
--------------------附加信息--------------------
这不是普通的胶囊。这个胶囊的两个盖子可以沿着默认坐标系的轴分别缩放。
如果您知道如何检查点是否位于椭球内,那么我认为没有问题。
如果椭圆帽是椭圆体的一半,只需检查
(point is in ellipsoid) or (point is in cylinder)
如果椭圆体帽小于椭圆体的一半,请检查
((point is in ellipsoid) and (point lies at outer side of base plane of cylinder)) or
(point is in cylinder)
进行轴旋转,使圆柱体的主轴成为旋转轴之一(例如 z 轴)。
使用这些变换后的坐标,圆柱体中的一个点必须:
- 在椭圆体的下方或上方,并且
- 超过或位于低椭球体上,并且
- 投影到与圆柱主轴垂直的平面内,必须在平面和圆柱定义的椭球内。
假设您旋转了 'cylinder' 使其以 z 轴为轴,并且顶部的椭圆 (z=h) 为
sqr( x/a1) + sqr( y/b1) = 1
而底部 (z=0) 的椭圆是
sqr( x/a0) + sqr( y/b0) = 1
然后在 z (0<=z<=h) 处椭圆将是
sqr( x/az) + sqr( y/bz) = 1
哪里
az = a0 + (z/h)*(a1-a0)
bz = b0 + (z/h)*(b1-b0)
因此,如果您的测试点是 (x,y,z) 且 0<=z<=h,则它在圆柱体中当且仅当
sqr( x/az) + sqr( y/bz) <= 1