ブール演算#

閉じた(多様な)曲面でブーリアン演算を行う.

ブール/位相演算(交差,結合,切断)法は, pyvista.PolyData メッシュタイプに対してのみ実装され,任意の pyvista.PolyData メッシュから直接アクセス可能である. pyvista.PolyDataFilters をチェックして,次のフィルタを確認してください.

基本的に,ブーリアン結合,切断,交差はすべて同じ操作です.ただ,オブジェクトの異なる部分が最終的に保持されるだけです.

演算子 - は,PyVistaの任意の2つの pyvista.PolyData メッシュの間で使用することができ,最初のメッシュを2番目のメッシュでカットします. これらのメッシュはすべて3角形のメッシュでなければなりません.これは pyvista.PolyData.is_all_triangles で確認できます.

注釈

マージでは, + 演算子をPyVistaの任意の2つのメッシュ間で使用できます.この演算子は,任意の2つのメッシュを結合するために .merge() フィルタを呼び出すだけです.これは単に boolean_union フィルタを呼び出すだけでのPyVistaの | 演算子とは異なり、結果に対して追加の計算を行うことなく2つのメッシュを重ね合わせます。 PyVista の & 演算子は単に boolean_intersection を呼び出します。

警告

ブーリアン演算が思った通りに反応しない(例えば,間違った部分が消えてしまう)場合,メッシュの1つが法線を内側に向けている可能性があります.法線を可視化するには, pyvista.PolyDataFilters.plot_normals() を使用してください.

from __future__ import annotations

import pyvista as pv

sphere_a = pv.Sphere()
sphere_b = pv.Sphere(center=(0.5, 0, 0))

ブール演算和#

pyvista.PolyDataFilters.boolean_union() フィルタを使用して, AB のブール結合を行います.

2つの多様体メッシュ AB の結合は, A にあるメッシュ, B にあるメッシュ,または AB の両方にあるメッシュとなります.

論理和にはオペランドの順序は関係ありません(演算は可換です).

result = sphere_a | sphere_b
pl = pv.Plotter()
_ = pl.add_mesh(sphere_a, color='r', style='wireframe', line_width=3)
_ = pl.add_mesh(sphere_b, color='b', style='wireframe', line_width=3)
_ = pl.add_mesh(result, color='lightblue')
pl.camera_position = 'xz'
pl.show()
boolean operations

論理差#

両方のメッシュが pyvista.PolyData であるため, pyvista.PolyDataFilters.boolean_difference() フィルタまたは - 演算子を使用して AB のブーリアン値の差を実行します.

2つのマニフォールドメッシュ AB の差は, A のメッシュのうち B に属さない部分の体積である.

真偽判定にはオペランドの順序が重要です.

result = sphere_a - sphere_b
pl = pv.Plotter()
_ = pl.add_mesh(sphere_a, color='r', style='wireframe', line_width=3)
_ = pl.add_mesh(sphere_b, color='b', style='wireframe', line_width=3)
_ = pl.add_mesh(result, color='lightblue')
pl.camera_position = 'xz'
pl.show()
boolean operations

ブール交差#

pyvista.PolyDataFilters.boolean_intersection() フィルタを使用して, AB のブール交差を行います.

2つの多様体メッシュ AB の交点は, A の体積が B の中にもあるメッシュである.

論理交差にはオペランドの順序は関係ありません(演算は可換です).

result = sphere_a & sphere_b
pl = pv.Plotter()
_ = pl.add_mesh(sphere_a, color='r', style='wireframe', line_width=3)
_ = pl.add_mesh(sphere_b, color='b', style='wireframe', line_width=3)
_ = pl.add_mesh(result, color='lightblue')
pl.camera_position = 'xz'
pl.show()
boolean operations

裏返った面による動作#

これらのブーリアンフィルターは面の向きによって動作が異なることに注意してください。 これは、向きによってメッシュの "外側" と "内側" のどちらの部分とみなされるかが決まるからです。 この例では flip_faces() を使って面を反転させています。

立方体と球体の両方の面が外側を向いている状態でのブール型の差分です. これが "normal" の動作です.

cube = pv.Cube().triangulate().subdivide(3)
sphere = pv.Sphere(radius=0.6)
result = cube.boolean_difference(sphere)
result.plot(color='lightblue')
boolean operations

立方体の面を外側に,球面を内側にしたブール値の差.

cube = pv.Cube().triangulate().subdivide(3)
sphere = pv.Sphere(radius=0.6).flip_faces()
result = cube.boolean_difference(sphere)
result.plot(color='lightblue')
boolean operations

立方体の面を内側に,球面を外側にしたブール値の差.

cube = pv.Cube().triangulate().subdivide(3).flip_faces()
sphere = pv.Sphere(radius=0.6)
result = cube.boolean_difference(sphere)
result.plot(color='lightblue')
boolean operations

立方体と球体の両方の面を内側にします.

cube = pv.Cube().triangulate().subdivide(3).flip_faces()
sphere = pv.Sphere(radius=0.6).flip_faces()
result = cube.boolean_difference(sphere)
result.plot(color='lightblue')
boolean operations

Tags: filter

Total running time of the script: (0 minutes 6.278 seconds)

Sphinx-Galleryによるギャラリー