如何使用JavaScript和此坐标格式生成多维数据集?

Cip*_*ian 3 javascript computational-geometry

鉴于此代码:

{
( 256 64 16 ) ( 256 64 0 ) ( 256 0 16 ) mmetal1_2 0 0 0 1 1
( 0 0 0 ) ( 0 64 0 ) ( 0 0 16 ) mmetal1_2 0 0 0 1 1
( 64 256 16 ) ( 0 256 16 ) ( 64 256 0 ) mmetal1_2 0 0 0 1 1
( 0 0 0 ) ( 0 0 16 ) ( 64 0 0 ) mmetal1_2 0 0 0 1 1
( 64 64 0 ) ( 64 0 0 ) ( 0 64 0 ) mmetal1_2 0 0 0 1 1
( 0 0 -64 ) ( 64 0 -64 ) ( 0 64 -64 ) mmetal1_2 0 0 0 1 1
}
Run Code Online (Sandbox Code Playgroud)

如何使用JavaScript(或任何其他库)和上面的坐标生成多维数据集?上面的代码应解释如下:

在此处显示的示例中,此画笔是一个6边长方体.其第一面的平面由3个点(256 64 16)(256 64 0)(256 0 16)定义.提供的其他信息是面部使用的纹理."mmetal1_2"是纹理的名称,单个平面可能只有一个纹理."0 0 0 1 1"是纹理的显示方式,分别是"X偏移","Y偏移","旋转","X标度"和"Y标度".

平面点(p1)(p2)(p3)解释如下.必须安排平面点,使得矢量(p3-p1)和(p2-p1)的叉积不为空,即三个点必须是线性无关的.然后,归一化的叉积表示平面的法向量.其中(p-p1)*normal <= 0(其中*是点积)成立的每个点p被认为是在由该平面限定的半空间中.每隔一点被认为不在半空间内.

注意#1:如有必要,可以使用CSS.

注意#2:我实际需要的是概念和数学函数.我可以使用JavaScript循环提取坐标,但我不知道如何最初接近这个.我只需要朝着正确的方向轻推.

注意#3:我只需要前三组值,而不是纹理和偏移量.

以下是此坐标系的规范:https: //quakewiki.org/wiki/Quake_Map_Format

Pet*_* O. 5

这些点(p1)(p2)(p3)根据位于平面上的三角形定义平面.这些点的排列使得平面的法线(矢量(p3-p1)和(p2-p1)的标准化"交叉积")指向外.我们可以用平面方程定义平面Ax+Bx+Cx+D=0如下:

   (A, B, C) = N = normalize(cross(p3-p1,p2-p1))
   D = -dot(p1,N)
Run Code Online (Sandbox Code Playgroud)

这些平面的交叉形成凸多面体.找到这个多面体涉及找到平面交叉点的顶点作为其中一个步骤.您提到的wiki文章链接到期刊文章,解释了生成这些顶点的一种方法.

您提到的格式使用其半空间表示(或h表示h-rep)描述凸多面体(凸多面体).由于给定的一组平面可以描述许多凸多面体,因此您更有可能想要将凸多面体的最小半空间表示转换为其最小顶点表示(或v-representationv-rep).这里,最小表示是其顶点与至少三个平面相交但描述与所有半空间相交的实体的表示.然后,您需要生成最小顶点表示的凸包.


由于问题要求更多细节,我将添加它:

生成多面体的网格涉及以下步骤.

  1. 对于每组平面点(p1)(p2)(p3),找到平面方程的系数,如上所述.
  2. 找到与三个或更多个平面相交的点集.这是通过检查每组三个平面是否在一个点上相交来完成的.结果通常比最终多面体中的顶点多得多,所以现在我们需要剔除它们.
  3. 对于每个点,检查该点是否在所有平面内.更具体地,如果D+dot(P,N) <= 0D和N是如上给出的平面参数,则点在平面内,并且P是所讨论的点.只保留所有平面内的点.
  4. 消除重复点.重复通常表示超过三个平面在同一点相交.
  5. 最后一步是生成点的凸包.像QuickHull这样的算法在这里很有用.结果将是凸多面体,每个面都是凸多边形.如果需要,可以使用相对简单的程序对多面体的每个面进行三角测量.

我编写了实现此方法的代码.