Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk merancang badan cembung dalam Python?

Bagaimana untuk merancang badan cembung dalam Python?

WBOY
WBOYke hadapan
2023-05-08 19:25:061843semak imbas

ConvexHull

ConvexHull ialah kelas dalam ruang Fungsi utamanya adalah untuk mencari tepi set titik dan membuat badan cembung. Parameter permulaan yang diperlukan ialah set titik, format set titik ialah tatasusunan dimensi n×m, n ialah bilangan titik dalam set titik dan m ialah dimensi titik.

from scipy.spatial import ConvexHull
import matplotlib.pyplot as plt
import numpy as np

pts = np.random.rand(30, 2)
hull = ConvexHull(pts)
plt.plot(pts[:,0], pts[:,1], 'o')
for i in hull.simplices:
    plt.plot(pts[i, 0], pts[i, 1], 'k-')

plt.show()

di mana simplex ialah nombor siri titik indeks Kesan selepas lukisan adalah seperti berikut

Bagaimana untuk merancang badan cembung dalam Python?

ConvexHull mempunyai dua parameter pilihan, antaranya. incremental ialah Parameter jenis Boolean, apabila Benar, membenarkan penambahan mata baharu.

Parameter khusus qhull_options boleh dilihat dalam qhull Hanya QG akan ditunjukkan di bawah.

QG

QGn bermaksud menganggap titik ke-n sebagai titik cerapan Selepas membahagikan titik yang ditetapkan dengan badan cembung, jika bucu disambungkan dan digunakan sebagai dinding, maka titik cerapan boleh The. mata yang boleh dilihat ditandakan sebagai baik, dan kesannya adalah seperti berikut

pts = np.random.rand(1000, 2)
# 添加一个观察点
pts = np.vstack([pts, np.array([[2,0.5]])])
hull = ConvexHull(pts, qhull_options='QG1000')
plt.plot(pts[:,0], pts[:,1], '.')
for i in hull.simplices:
    plt.plot(pts[i, 0], pts[i, 1], 'k-')

for i in hull.simplices[hull.good]:
    plt.plot(pts[i, 0],pts[i, 1], lw=5)

plt.show()

Kesannya adalah seperti yang ditunjukkan dalam rajah

Bagaimana untuk merancang badan cembung dalam Python?

Kes tiga dimensi

Badan cembung dalam dua dimensi jelas sekali adalah rajah tertutup yang terdiri daripada garisan, manakala badan cembung dalam tiga dimensi secara semula jadi mestilah geometri tiga dimensi. Dikembangkan ke mana-mana dimensi, badan cembung sebenarnya adalah simpleks. Simplices dalam ConvexHull ialah titik yang membentuk simpleks dan diindeks dalam set asal. Contohnya adalah seperti berikut

pts = np.random.rand(30, 3)
hull = ConvexHull(pts)
ax = plt.subplot(projection='3d')
ax.scatter(pts[:,0], pts[:,1], pts[:,2])
for i in hull.simplices:
    ax.plot_trisurf(pts[i, 0], pts[i, 1], pts[i,2], alpha=0.5)

plt.show()

Parameter alfa digunakan untuk melaraskan ketelusan permukaan segi tiga, supaya titik di dalam badan cembung boleh dilihat melalui badan cembung.

Kesannya adalah seperti berikut

Bagaimana untuk merancang badan cembung dalam Python?

Atribut ConvexHull

Konsep simpleks telah diperkenalkan sebelum ini, iaitu rajah yang terdiri daripada badan cembung ialah simpleks . Sebagai kes dua dimensi, badan cembung dikelilingi oleh segmen garisan, dalam kes tiga dimensi, badan cembung dikelilingi oleh satah, ia boleh dinyatakan sebagai simpleks yang membentuk badan cembung, dikelilingi; oleh hypersurfaces. Memandangkan konsep hypersurface tidak mempunyai sempadan, permukaan badan cembung dengan bucu dan tepi dirujuk sebagai hypersurface simpleks dalam perkara berikut.

Atribut yang biasa digunakan dalam kelas ConvexHull adalah seperti berikut

  • set titik titik yang dikelilingi oleh badan cembung

  • bucu simplex bucu pada titik Indeks berpusat

  • memudahkan bucu metasurface Simplex

  • jiran Indeks hipersurface bersebelahan metasurface

  • persamaan Parameter persamaan hiperpermukaan

Contoh persamaan hiperpermukaan dalam tiga dimensi adalah seperti berikut, iaitu setiap hiperpermukaan mempunyai 4 parameter

>>> hull.equations
array([[-0.5509472 ,  0.72386104, -0.41530999, -0.36369123],
       [-0.26155355,  0.16210178, -0.95147925,  0.02022163],
       [-0.99132368, -0.0460725 ,  0.12310441,  0.045523  ],
       [-0.98526526, -0.07170442,  0.15527666,  0.04749854],
       [-0.15900968, -0.98529789, -0.06248198,  0.13294496],
   # .......

Atas ialah kandungan terperinci Bagaimana untuk merancang badan cembung dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam