鱼C论坛

 找回密码
 立即注册
查看: 429|回复: 2

[已解决]关于切片软件的问题

[复制链接]
发表于 2023-9-23 16:36:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
   for i, z in enumerate(z_levels):
        # 创建画布
        canvas = np.zeros((512, 512), dtype=np.uint8)

        # 遍历三角面片并进行切片
        for triangle in mesh_data.vectors:
            above = np.any(triangle[:, 2] > z)
            below = np.any(triangle[:, 2] < z + layer_height)

            if above and below:
                indices = np.where((triangle[:, 2] > z) != (triangle[:, 2] < z + layer_height))[0]

                if len(indices) >= 2:
                    tri_vertices = triangle[indices][:, :2]
                    tri_vertices = (tri_vertices * scale_factor).astype(int)  # 使用缩放因子而不是固定的100

                    # 绘制轮廓
                    cv2.drawContours(canvas, [tri_vertices], -1, 255, thickness=cv2.FILLED)

        # 保存缩略图
        slices.append(canvas)

    return slices

只有above和below同时满足才能执行if语句 也就是顶点必然在当前层 这样的话(triangle[:, 2] > z) != (triangle[:, 2] < z + layer_height)不应该一定为false吗
最佳答案
2023-9-23 16:36:24
在这段代码中,如果一个三角面片同时存在于当前层的上面和下面,那么它就会被切成两部分。在这种情况下, (triangle[:, 2] > z) != (triangle[:, 2] < z + layer_height) 的值将为 True 。因此, if len(indices) >= 2  条件成立,该三角面片将被切成两部分,并且只有其中一部分将被绘制。

如果一个三角面片完全包含在当前层中,则  above  和  below  都将为  True ,但  (triangle[:, 2] > z) != (triangle[:, 2] < z + layer_height)  的值将为  False ,因为三角面片的所有顶点都在当前层中。在这种情况下,该三角面片将不会被切成两部分,并且不会被绘制。

因此, (triangle[:, 2] > z) != (triangle[:, 2] < z + layer_height) 的值不一定为  False ,它取决于当前三角面片的位置关系。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-23 16:36:24 | 显示全部楼层    本楼为最佳答案   
在这段代码中,如果一个三角面片同时存在于当前层的上面和下面,那么它就会被切成两部分。在这种情况下, (triangle[:, 2] > z) != (triangle[:, 2] < z + layer_height) 的值将为 True 。因此, if len(indices) >= 2  条件成立,该三角面片将被切成两部分,并且只有其中一部分将被绘制。

如果一个三角面片完全包含在当前层中,则  above  和  below  都将为  True ,但  (triangle[:, 2] > z) != (triangle[:, 2] < z + layer_height)  的值将为  False ,因为三角面片的所有顶点都在当前层中。在这种情况下,该三角面片将不会被切成两部分,并且不会被绘制。

因此, (triangle[:, 2] > z) != (triangle[:, 2] < z + layer_height) 的值不一定为  False ,它取决于当前三角面片的位置关系。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-23 16:36:29 | 显示全部楼层
在这段代码中,(triangle[:, 2] > z) != (triangle[:, 2] < z + layer_height) 这个表达式的含义是检查当前三角形是否跨越了当前层的高度范围 (z, z + layer_height) 。其中,(triangle[:, 2] > z)(triangle[:, 2] < z + layer_height) 分别表示三角形每个顶点是否在当前层以下或以上。

如果三角形的所有顶点都在当前层以下或以上,则 (triangle[:, 2] > z)(triangle[:, 2] < z + layer_height) 的结果相同,差异为 False。在这种情况下,上述表达式的结果也将为 False,因此没有任何轮廓被绘制。

如果三角形跨越了当前层的高度范围,则 (triangle[:, 2] > z)(triangle[:, 2] < z + layer_height) 的结果不同。在这种情况下,上述表达式的结果为一个布尔型数组,指示哪些顶点位于当前层的高度范围内。如果至少有两个顶点位于该范围内,那么该三角形将被划分为两个以上部分,需要在该层添加轮廓。

因此,对于 if len(indices) >= 2: 这一行代码,它的含义是检查当前三角形是否与当前层的高度范围有交集,并且该三角形至少被切分为两个以上部分,才会在当前层添加轮廓。

希望这能够帮助您理解代码的工作原理。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 14:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表