INTERSECT Y EXCEPT

本文介绍SQL中的EXCEPT和INTERSECT操作符的使用方法,并通过实例展示了如何利用这两个操作符来筛选出特定的数据记录。

 

intersect y except are both working on same table and multiple tables

 

 

EXCEPT 从左查询中返回右查询没有找到的所有非重复值。

INTERSECT 返回 INTERSECT 操作数左右两边的两个查询都返回的所有非重复值。

以下是将使用 EXCEPT 或 INTERSECT 的两个查询的结果集组合起来的基本规则:

·   所有查询中的列数和列的顺序必须相同。

·   数据类型必须兼容。 

 

Examples:

 

CREATE TABLE projectPerson

(

personId VARCHAR(10),

projectId VARCHAR(10),

PRIMARY KEY (personId, projectId)

)

go

INSERT INTO projectPerson VALUES ('joeb','projBig')

INSERT INTO projectPerson VALUES ('joeb','projLittle')

INSERT INTO projectPerson VALUES ('fredf','projBig')

INSERT INTO projectPerson VALUES ('homerr','projLittle')

INSERT INTO projectPerson VALUES ('stevegr','projBig')

INSERT INTO projectPerson VALUES ('stevegr','projLittle')

go

我们要找出负责projBig,但不负责projLittle的那些人员,我们可以用下面的sql语句:

SELECT personId

FROM projectPerson

WHERE projectId = 'projLittle'

EXCEPT

SELECT personId

FROM projectPerson

WHERE projectId = 'projBig'

我们要找出既负责projBig,又负责projLittle的那些人员,我们可以用下面的sql语句:

SELECT personId

FROM projectPerson

WHERE projectId = 'projBig'

INTERSECT

SELECT personId

FROM projectPerson

WHERE projectId = 'projLittle'

 

 
 

转载于:https://www.cnblogs.com/forint/p/4040971.html

import trimesh import numpy as np from packaging import version # 尝试导入pyntcloud,如果体素化需要回退到该方法 try: from pyntcloud import PyntCloud import pandas as pd PYNTC_AVAILABLE = True except ImportError: PYNTC_AVAILABLE = False def check_self_intersection(mesh, sample_faces): """封装自交检测逻辑""" trimesh_v = version.parse(trimesh.__version__) self_intersect_info = "" is_selfintersecting = False try: if trimesh_v >= version.parse("3.17.0"): intersecting_faces = trimesh.repair.check_self_intersections(mesh) is_selfintersecting = len(intersecting_faces) > 0 self_intersect_info = f"自交面数: {len(intersecting_faces)}" else: if len(mesh.faces) == 0: is_selfintersecting = False else: sample_size = min(sample_faces, len(mesh.faces)) faces = np.random.choice(len(mesh.faces), sample_size, replace=False) intersections = trimesh.intersections.mesh_other( mesh, mesh, faces_a=faces.tolist()) is_selfintersecting = len(intersections) > 0 self_intersect_info = f"抽样检测: {len(intersections)}处相交" print(f"🔄 自交检测: {'⚠️' if is_selfintersecting else '✅'} {self_intersect_info}") except Exception as e: print(f"⚠️ 自交检测异常: {str(e)}") return is_selfintersecting def calculate_mesh_volume(mesh_path, sample_faces=500, voxel_pitch=None): """优化后的网格体积计算函数,支持参数配置""" try: mesh = trimesh.load(mesh_path, force='mesh') except Exception as e: print(f"❌ 网格加载失败: {str(e)}") return None # 初始化打印网格基本信息 print(f"🔍 网格基本信息 - 顶点数: {len(mesh.vertices)}, 面数: {len(mesh.faces)}") # 阶段1: 基础检测 is_watertight = mesh.is_watertight print(f"🔧 闭合性检测: {'✅' if is_watertight else '❌'}") # 法线一致性修复 if not mesh.is_winding_consistent: print("🔄 检测到法线方向不一致,尝试修复...") try: mesh.fix_normals() if mesh.is_winding_consistent: print("✅ 法线修复成功") else: print("❌ 法线修复失败,体积计算可能不准确") except Exception as e: print(f"⚠️ 法线修复异常: {str(e)}") # 自交检测 is_selfintersecting = check_self_intersection(mesh, sample_faces) # 阶段2: 直接计算条件判断 if is_watertight and not is_selfintersecting: try: volume = mesh.volume print(f"🎯 直接体积计算: {volume:.4f} 立方单位") return volume except Exception as e: print(f"⚠️ 直接计算异常: {str(e)}") # 阶段3: 自动修复尝试 if not is_watertight: print("🛠️ 尝试自动修复闭合性...") try: # 使用更积极的修复参数 trimesh.repair.fill_holes(mesh, max_hole_area=100) # 检查是否修复成功 if mesh.is_watertight: print("✅ 修复成功,重新检查网格状态...") # 重新检测法线 if not mesh.is_winding_consistent: mesh.fix_normals() # 重新检测自交 is_selfintersecting = check_self_intersection(mesh, sample_faces) if not is_selfintersecting: try: volume = mesh.volume print(f"🎯 修复后直接体积计算: {volume:.4f} 立方单位") return volume except Exception as e: print(f"⚠️ 修复后直接计算异常: {str(e)}") else: print("❌ 修复后网格存在自交,无法准确计算体积") else: print("❌ 修复后仍未闭合") except Exception as e: print(f"⚠️ 修复失败: {str(e)}") # 阶段4: 体素化估算 print("📦 开始体素化估算...") try: # 优先使用trimesh内置方法 if hasattr(trimesh.voxel, 'creation'): bounds = mesh.bounds diagonal = np.linalg.norm(bounds[1] - bounds[0]) pitch = voxel_pitch or max(diagonal / 100, 1e-5) print(f"🔧 体素化参数 - 精度: {pitch:.4f}") voxel = trimesh.voxel.creation.voxelize(mesh, pitch) vol = voxel.volume print(f"✅ Trimesh体素化成功: {vol:.4f}") return vol elif PYNTC_AVAILABLE: # 回退到pyntcloud方法 points = trimesh.sample.sample_surface(mesh, 500000)[0] cloud = PyntCloud(pd.DataFrame(points, columns=['x', 'y', 'z'])) # 动态计算体素参数 bounds = mesh.bounds size = bounds[1] - bounds[0] if voxel_pitch is not None: pitch = voxel_pitch else: diagonal = np.linalg.norm(size) pitch = diagonal / 100 n_x = max(1, int(size[0] / pitch)) n_y = max(1, int(size[1] / pitch)) n_z = max(1, int(size[2] / pitch)) print(f"🔧 PyntCloud体素化参数 - n_x: {n_x}, n_y: {n_y}, n_z: {n_z}") voxelgrid = cloud.add_structure("voxelgrid", n_x=n_x, n_y=n_y, n_z=n_z) vox_size = voxelgrid.voxel_x * voxelgrid.voxel_y * voxelgrid.voxel_z vol = vox_size * len(voxelgrid.voxel_n) print(f"✅ PyntCloud体素化成功: {vol:.4f}") return vol else: print("❌ 无可用体素化方法") return None except Exception as e: print(f"⚠️ 体素化失败: {str(e)}") return None if __name__ == "__main__": volume = calculate_mesh_volume("wj/c2.ply", sample_faces=500, voxel_pitch=0.095) if volume is not None: print(f"📏 最终体积: {volume:.4f}") else: print("❌ 计算失败") 优化测量-体积: 测量网格体积. 被测网格需要是闭合的,且没有自交情况,否则测量结果有误差
05-29
要判断点到原点的连线是否穿过底面圆心为`(0, 200, 0)`、半径为 7 且高为无限的圆柱体,可以通过计算连线上的点到圆柱体中心轴(即过点`(0, 200, 0)`且平行于 z 轴的直线)的距离,若存在距离小于等于 7 的点,则连线穿过圆柱体。 以下是实现该功能的 Python 代码: ```python import numpy as np def line_intersects_cylinder(pt, center_y=200, radius=7): """ 判断点到原点的连线是否穿过圆柱体 :param pt: 点的坐标,[x, y, z] :param center_y: 圆柱体中心轴在 y 轴上的坐标 :param radius: 圆柱体的半径 :return: 连线是否穿过圆柱体,True 或 False """ # 参数化直线,直线上的点为 t * pt,t 属于 [0, 1] # 计算直线上的点到圆柱体中心轴(x=0, y=center_y)的距离 # 距离的平方为 (t * pt[0])**2 + (t * pt[1] - center_y)**2 # 展开为二次函数:(pt[0]**2 + pt[1]**2) * t**2 - 2 * pt[1] * center_y * t + center_y**2 a = pt[0]**2 + pt[1]**2 b = -2 * pt[1] * center_y c = center_y**2 # 求二次函数的最小值 if a == 0: # 若 a 为 0,说明直线平行于 y 轴 min_distance_squared = (pt[1] - center_y)**2 else: # 二次函数的最小值点为 t = -b / (2 * a) t_min = -b / (2 * a) if 0 <= t_min <= 1: min_distance_squared = a * t_min**2 + b * t_min + c else: # 最小值在端点处取得 d0 = c d1 = a + b + c min_distance_squared = min(d0, d1) # 判断最小距离是否小于等于半径的平方 return min_distance_squared <= radius**2 # 测试点 points = { "M1": [20000, 0, 2000], "M2": [19000, 600, 2100], "M3": [18000, -600, 1900] } # 判断各点连线是否穿过圆柱体 results = {} for name, pt in points.items(): results[name] = line_intersects_cylinder(pt) # 输出结果 for name, result in results.items(): print(f"{name}: {'连线穿过圆柱体' if result else '连线不穿过圆柱体'}") ```
最新发布
09-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值