给定两个矢量AB ,它们形成线段L = AB。 此外,给出视锥体F ,其由左,右,底,顶,近和远平面限定。

如何剪辑L对抗F

也就是说,测试交叉点 L交叉点发生在哪里? (请记住,如果线段与拐角处的两边相交,则可以与截头锥体具有多个交点。)

如果可能的话,请提供一个代码示例(首选C ++或Python)。

===============>>#1 票数:4

我现在不想为此编写代码,但如果我正确理解“视锥”,则以下内容应该有效。

  1. 将线与所有给定的平面相交
  2. 如果你有两个十字路口你就完成了。
  3. 如果只有一个交点计算前平面并相交。
  4. 如果仍然只有一个交点计算背板并相交。

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

===============>>#2 票数:1

首先从视图矩阵中提取平面

然后使用你的点来定义一个矢量,将min / max定义为(0,1),然后迭代平面并将它们与段相交,更新min / max,如果min > max ,则提前退出。

这是一个纯Python函数的例子,没有外部代码。

def clip_segment_v3_plane_n(p1, p2, planes):
    """
    - p1, p2: pair of 3d vectors defining a line segment.
    - planes: a sequence of (4 floats): `(x, y, z, d)`.

    Returns 2 vector triplets (the clipped segment)
    or (None, None) then segment is entirely outside.
    """
    dp = sub_v3v3(p2, p1)

    p1_fac = 0.0
    p2_fac = 1.0

    for p in planes:
        div = dot_v3v3(p, dp)
        if div != 0.0:
            t = -plane_point_side_v3(p, p1)
            if div > 0.0:  # clip p1 lower bounds
                if t >= div:
                    return None, None
                if t > 0.0:
                    fac = (t / div)
                    if fac > p1_fac:
                        p1_fac = fac
                        if p1_fac > p2_fac:
                            return None, None
            elif div < 0.0:  # clip p2 upper bounds
                if t > 0.0:
                    return None, None
                if t > div:
                    fac = (t / div)
                    if fac < p2_fac:
                        p2_fac = fac
                        if p1_fac > p2_fac:
                            return None, None

    p1_clip = add_v3v3(p1, mul_v3_fl(dp, p1_fac))
    p2_clip = add_v3v3(p1, mul_v3_fl(dp, p2_fac))

    return p1_clip, p2_clip


# inline math library
def add_v3v3(v0, v1):
    return (
        v0[0] + v1[0],
        v0[1] + v1[1],
        v0[2] + v1[2],
        )

def sub_v3v3(v0, v1):
    return (
        v0[0] - v1[0],
        v0[1] - v1[1],
        v0[2] - v1[2],
        )

def dot_v3v3(v0, v1):
    return (
        (v0[0] * v1[0]) +
        (v0[1] * v1[1]) +
        (v0[2] * v1[2])
        )

def mul_v3_fl(v0, f):
    return (
        v0[0] * f,
        v0[1] * f,
        v0[2] * f,
        )

def plane_point_side_v3(p, v):
    return dot_v3v3(p, v) + p[3]

===============>>#3 票数:1

除了上面提到的Corporal Touchy之外,您还需要知道如何将线段与平面相交 在该页面的描述中,u表示行的参数化定义中的参数。 首先,使用所描述的两种方法之一计算u。 如果u的值落在0.0到1.0的范围内,则平面会将线段剪切到线段的某个位置。 将你回到你的线方程中可以得到交点发生的点。

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

希望这可以帮助。

  ask by MHOOO translate from so

未解决问题?本站智能推荐:

1回复

如何在SVG中排除剪切路径内部的区域

我想隐藏矩形之外的任何东西。 (这是我成功实现剪辑的)。 但是另一个条件是,“还隐藏黑色大圆圈内的所有东西”。 现在我该如何实现? 在下面的示例中,必须消除“黄色圆圈”。 详情请参阅以下图片 原版的:- 期望的:- 以下是我的Svg代码:-
2回复

如何在Android中的矩形内剪切圆形路径

我已经阅读了20多个问题/答案,但我仍然无法得到我想要的东西。 我想在矩形内切一个圆圈,如下所示: 这是我的代码: 我的背景( setARGB )显示正确,但没有任何内容被剪裁。 我还尝试了除REPLACE以外的不同Op值,强制软件光栅化(因为我读过一些Android版本的c
2回复

如何在Silverlight中创建拉伸剪切矩形

由于Silverlight在控件上没有'ClipToBounds'属性的舒适功能,我必须自己定义剪裁形状。 我想知道是否可以创建一个跟随我的控件大小的剪切矩形。 有什么建议?
3回复

如何在Windows应用商店应用中剪切带圆角的内容

我试图用圆角( <Border/>或<Rectangle/> ,无论什么工作) 剪切一个<Grid/> (内部有交互式内容,而不仅仅是图像)。 我尝试了多种解决方案,但它们都没有与Windows应用商店应用兼容。 没刷子: Wind
3回复

如何在HTML5画布中剪切INSIDE形状?

我已经找到了许多用于剪切弧的外部区域的示例 (例如: 此示例 )。 我似乎无法弄清楚如何在弧形内部进行剪裁。 这是我当前如何剪切外部区域的示例,这实际上与我想要的相反:
1回复

如何在使用CSS属性Contain时防止剪切2个背景?

我想在页面的顶部和页面的底部有一个背景。 使用此CSS可以给我正确的效果,但是可以将某些分辨率的图像裁剪在一起。 有没有办法停止剪辑效果?
1回复

如何在html5 2d画布绘图中合并许多剪切区域

我想绘制一个具有多个剪贴区域的区域。 这是屏幕截图: 我写一个绘图示例: http : //jsfiddle.net/younyzhU/zR9hg/1/ 总面积应为四个green区域+中央的白色矩形。 从基础教程中,我知道绘制剪贴平面就像绘制其他东西一样。 创
1回复

如何在较小的手机中解决我的应用程序出现的剪切问题?

我有一个基本的线性布局,带有显示照片的图像视图,显示文本的textview等...,当我在android 2上测试整个应用程序时,屏幕的任何部分都不会显示。 但是,当我在QVGA仿真器中对其进行测试时,一半的视图不在屏幕上。 现在,我的一些文本被定义为一定的大小。 我从不在任何xml中
1回复

如何在SVG中应用具有多个路径的clipPath而不剪切路径之间的区域?

我有一个由多个路径元素组成的SVG clipPath,我需要将其应用于一组元素。 我只想剪切路径笔划本身下方的区域,而不是剪切路径之间的区域。 (下面的例子不符合我的要求) 基本上,我想完成一些与使用字母获得的功能类似的操作,但是要使用线条/路径。 请帮忙! 编辑: 这
1回复

遮罩/剪切div

如何使div#1(页面标题)通过div#2(mainwrap)“剪切”并查看背景图像? 例: CSS: