Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Kami Boleh Mengesan Lubang dengan Cekap dalam Set Titik 2D dengan Sensitiviti Boleh Laras?

Bagaimanakah Kami Boleh Mengesan Lubang dengan Cekap dalam Set Titik 2D dengan Sensitiviti Boleh Laras?

Susan Sarandon
Lepaskan: 2025-01-18 07:41:07
asal
921 orang telah melayarinya

How Can We Efficiently Detect Holes in 2D Point Sets with Adjustable Sensitivity?

Pengesanan lubang set titik dua dimensi

Soalan:

Memandangkan set titik dua dimensi, bagaimana untuk mencari lubang dalam set titik? Algoritma harus mempunyai sensitiviti boleh laras untuk mencari lubang ini.

Penyelesaian:

  1. Mencipta perwakilan bitmap bagi set titik.

    • Imbas mata dan tentukan kotak sempadan set titik.
    • Mencipta peta bit dengan dimensi sama dengan kotak sempadan.
    • Untuk setiap titik, tetapkan piksel yang sepadan dalam peta bit kepada 1.
  2. Cari komponen yang disambungkan dalam peta bit.

    • Menggunakan algoritma komponen bersambung standard untuk mengenal pasti komponen bersambung dalam peta bit.
    • Setiap komponen yang disambungkan mewakili lubang dalam set titik.
  3. Hitung badan cembung setiap komponen yang disambungkan.

    • Gunakan algoritma lambung cembung piawai untuk mengira lambung cembung setiap komponen yang disambungkan.
    • Lambung cembung mewakili sempadan lubang.
  4. Keluarkan sempadan lubang.

    • Keluaran algoritma ialah senarai badan cembung, setiap badan cembung mewakili sempadan lubang dalam set titik.

Algoritma:

<code class="language-python">import numpy as np
from scipy.ndimage import label

def find_holes(points, sensitivity=1):
  """
  查找二维点集中的孔洞。

  参数:
    points: 二维点列表。
    sensitivity: 算法的灵敏度。较高的值将导致找到更多孔洞。

  返回:
    表示孔洞边界的凸包列表。
  """

  # 创建点集的位图表示。

  xmin, xmax, ymin, ymax = get_bounding_box(points)
  bitmap = np.zeros((ymax - ymin + 1, xmax - xmin + 1), dtype=np.uint8)
  for point in points:
    bitmap[point[1] - ymin, point[0] - xmin] = 1

  # 查找位图中的连通分量。

  labeled, num_components = label(bitmap)

  # 计算每个连通分量的凸包。

  holes = []
  for i in range(1, num_components + 1):
    component_mask = (labeled == i)
    component_points = np.where(component_mask)
    convex_hull = compute_convex_hull(component_points)
    holes.append(convex_hull)

  # 输出孔洞的边界。

  return holes</code>
Salin selepas log masuk

Contoh:

<code class="language-python">import matplotlib.pyplot as plt

# 生成一组随机点。

points = np.random.rand(100, 2)

# 查找点集中的孔洞。

holes = find_holes(points)

# 绘制点和孔洞。

plt.scatter(points[:, 0], points[:, 1])
for hole in holes:
  plt.plot(hole[:, 0], hole[:, 1])
plt.show()</code>
Salin selepas log masuk

Output:

[Plot serakan 2D, lubang ditanda]

Perbincangan:

Parameter sensitiviti algoritma mengawal saiz lubang yang ditemui. Kepekaan yang lebih tinggi akan menyebabkan lebih banyak lubang ditemui, manakala sensitiviti yang lebih rendah akan menyebabkan lebih sedikit lubang ditemui. Kepekaan optimum bergantung pada aplikasi tertentu.

Algoritma boleh digunakan untuk mencari lubang dalam pelbagai jenis set data yang berbeza, termasuk awan titik, imej dan jerat. Ia adalah alat yang serba boleh dan berkuasa untuk menganalisis data dan mengenal pasti corak.

Atas ialah kandungan terperinci Bagaimanakah Kami Boleh Mengesan Lubang dengan Cekap dalam Set Titik 2D dengan Sensitiviti Boleh Laras?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan