Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 如何在平截头体上剪裁线段?_Math_Clipping - Fatal编程技术网

Math 如何在平截头体上剪裁线段?

Math 如何在平截头体上剪裁线段?,math,clipping,Math,Clipping,给定构成线段L=A-B的两个向量A和B。 此外,给定一个视锥体F,该视锥体由其左、右、下、上、近和远平面定义 如何将L与F进行剪辑 也就是说,测试一个交叉点,该交叉点发生在L的什么位置? (请记住,如果线段在一个角处与两条边相交,则线段与平截头体的交点可以多于一个。) 如果可能,请提供一个代码示例(最好是C++或Python)。我现在不想为此编写代码,但如果我正确理解“frustum”,以下应该可以 将该线与所有给定平面相交 如果你有两个十字路口,你就完成了 如果只有一个交点,则计算前平面并相交

给定构成线段L=A-B的两个向量AB。 此外,给定一个视锥体F,该视锥体由其左、右、下、上、近和远平面定义

如何将LF进行剪辑

也就是说,测试一个交叉点,该交叉点发生在L的什么位置? (请记住,如果线段在一个角处与两条边相交,则线段与平截头体的交点可以多于一个。)


如果可能,请提供一个代码示例(最好是C++或Python)。

我现在不想为此编写代码,但如果我正确理解“frustum”,以下应该可以

  • 将该线与所有给定平面相交
  • 如果你有两个十字路口,你就完成了
  • 如果只有一个交点,则计算前平面并相交
  • 如果仍然只有一个交点,请计算后平面并相交

  • 但我可能完全误解了。在这种情况下,请详细说明:)

    再加上特西下士上面所说的,你需要。在该页的说明中,u表示行的参数定义中的参数。首先,使用描述的两种方法之一计算u。如果u的值在0.0到1.0的范围内,则平面将在线段的某个位置剪裁该线。把u插回到直线方程中,就得到了交点的位置

    另一种方法是找到每个点到平面的距离。如果一个点的距离为正,另一个点的距离为负,则它们位于平面的两侧。然后知道哪一点在平截头体之外(基于平面法线点的方向)。使用这种方法,通过基于有向距离的比率进行线性插值,可以更快地找到交点。例如,如果一个点的距离为+12,另一个点的距离为-12,则您知道该平面将线段切成两半,并且您的u参数为0.5

    希望这有帮助。

    首先

    然后使用点将向量和最小/最大值定义为(0,1),然后在平面上迭代并与线段相交,更新最小/最大值,如果
    min>max
    ,则提前退出

    下面是一个纯Python函数的示例,没有外部DEP

    def clip_段_v3_平面(p1、p2、平面):
    """
    -p1,p2:定义线段的一对3d向量。
    -平面:由(4个浮点数)组成的序列:`(x,y,z,d)`。
    返回2个向量三元组(剪裁段)
    或者(无,无),则段完全位于外部。
    """
    dp=sub_v3v3(p2,p1)
    p1_fac=0.0
    p2_fac=1.0
    对于平面中的p:
    div=dot_v3v3(p,dp)
    如果div!=0.0:
    t=-平面、点、边、v3(p、p1)
    如果div>0.0:#剪裁p1下限
    如果t>=div:
    返回None,None
    如果t>0.0:
    fac=(t/div)
    如果fac>p1\U fac:
    p1_fac=fac
    如果p1_fac>p2_fac:
    返回None,None
    elif div<0.0:#clip p2上界
    如果t>0.0:
    返回None,None
    如果t>div:
    fac=(t/div)
    如果facp2_fac:
    返回None,None
    p1_clip=添加_v3v3(p1,mul_v3_fl(dp,p1_fac))
    p2_clip=添加_v3v3(p1,mul_v3_fl(dp,p2_fac))
    返回p1_剪辑,p2_剪辑
    #内联数学库
    def add_v3v3(v0,v1):
    返回(
    v0[0]+v1[0],
    v0[1]+v1[1],
    v0[2]+v1[2],
    )
    def sub_v3v3(v0,v1):
    返回(
    v0[0]-v1[0],
    v0[1]-v1[1],
    v0[2]-v1[2],
    )
    def dot_v3v3(v0,v1):
    返回(
    (v0[0]*v1[0])+
    (v0[1]*v1[1])+
    (v0[2]*v1[2])
    )
    def mul_v3_fl(v0,f):
    返回(
    v0[0]*f,
    v0[1]*f,
    v0[2]*f,
    )
    def平面\点\侧\ v3(p,v):
    返回点v3v3(p,v)+p[3]
    
    我是遗漏了什么,还是你能让L与所有平面相交?到底什么是平截头体?:)啊,我看到它有前后两个平面,但这些都是隐含的。我们为什么要做这个孩子的家庭作业?它已经标记了家庭作业,如果你不喜欢的话,投票否决它。我看不出我认为淫秽的东西有什么道理。实际上,我想要的是线段不在视锥体的外面。如果我有两个交点,我必须移动A和B来匹配相交的边界。唉,我不知道这是怎么回事。