亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python Graham求凸包問題并畫圖操作

 更新時間:2021年06月03日 14:11:06   作者:sunnyorrainy  
這篇文章主要介紹了python Graham求凸包問題并畫圖操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

python Graham求凸包并畫圖

python寫Graham沒有c++那么好寫,但是python畫圖簡單。只需要用matplotlib里的pyplot,c++畫圖太難了。

Graham算法寫起來比較簡單,只需要想辦法對最小點和其他的點所連成的直線,與x軸正半軸的夾角進行排序,然后其他的就直接套用Graham算法模板就好了,因為c++可以重載排序函數(shù)sort,不用計算角度(用其他的數(shù)學方法),但是python不行(也許是我不知道而已,菜)。

python必須要在結(jié)構(gòu)體里面加上角度這個變量,然后才能按照角度排序。排好序后就變得容易了,用stack棧存放答案,算完答案后,用scatter(散點圖)畫出點,用plt(折線圖)畫邊界就好了。

import matplotlib.pyplot as plt
import math
import numpy as np  
class Node:
    def __init__(self):
        self.x = 0
        self.y = 0
        self.angel = 0
        #和最左下的點連成的直線,與x軸正半軸的夾角大小 
 
#按照角度從小到大排序
def cmp(x):
    return x.angel  
def bottom_point(points):
    min_index = 0
    n = len(points)
    #先判斷y坐標,找出y坐標最小的點,x坐標最小的點
    for i in range(1, n):
        if points[i].y < points[min_index].y or (points[i].y == points[min_index].y and
           points[i].x < points[min_index].x):
            min_index = i
    return min_index 
 
#計算角度
def calc_angel(vec):
    norm = math.sqrt(vec[0] * vec[0] + vec[1] * vec[1])
    if norm == 0:
        return 0
    angel = math.acos(vec[0]/norm)
    if vec[1] >= 0:
        return angel
    else:
        return math.pi * 2 - angel 
 
def multi(v1, v2):
    return v1[0] * v2[1] - v1[1] * v2[0] 
 
point = []
n = 30
#生成30個點的坐標,n可以修改
for i in range(n):
    temp = Node()
    temp.x = np.random.randint(1, 100)
    temp.y = np.random.randint(1, 100)
    point.append(temp)
index = bottom_point(point)
for i in range(n):
    if i == index:
        continue
    #計算每個點和point[index]所連成的直線與x軸正半軸的夾角
    vector = [point[i].x - point[index].x, point[i].y - point[index].y]
    #vector是向量
    point[i].angel = calc_angel(vector)
#排序
point.sort(key=cmp)
#答案存入棧中
stack = []
stack.append(point[0])
stack.append(point[1])
#for循環(huán)更新答案
for i in range(2, n):
    L = len(stack)
    top = stack[L - 1]
    next_top = stack[L - 2]
    vec1 = [point[i].x - next_top.x, point[i].y - next_top.y]
    vec2 = [top.x - next_top.x, top.y - next_top.y]
    #一定要大于等于零,因為可能在一條直線上
    while multi(vec1, vec2) >= 0:
        stack.pop()
        L = len(stack)
        top = stack[L - 1]
        next_top = stack[L - 2]
        vec1 = [point[i].x - next_top.x, point[i].y - next_top.y]
        vec2 = [top.x - next_top.x, top.y - next_top.y]
    stack.append(point[i])
#畫出圖像
for p in point:
    plt.scatter(p.x, p.y, marker='o', c='g')
L = len(stack)
for i in range(L-1):
    plt.plot([stack[i].x, stack[i+1].x], [stack[i].y, stack[i+1].y], c='r')
plt.plot([stack[0].x, stack[L-1].x], [stack[0].y, stack[L-1].y], c='r')
plt.show()

Python 找到凸包 Convex hulls

圖形學可以說經(jīng)常遇到這東西了,這里給出一個庫函數(shù)的實現(xiàn)

from scipy.spatial import ConvexHull
points = np.random.rand(10, 2) # 30 random points in 2-D
hull = ConvexHull(points)
import matplotlib.pyplot as plt
plt.plot(points[:,0], points[:,1], 'o')
for simplex in hull.simplices:
 plt.plot(points[simplex,0], points[simplex,1], 'k-')
plt.show()

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 在cmd中運行.py文件: python的操作步驟

    在cmd中運行.py文件: python的操作步驟

    今天小編就為大家分享一篇在cmd中運行.py文件: python的操作步驟,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • python 解決tqdm模塊不能單行顯示的問題

    python 解決tqdm模塊不能單行顯示的問題

    這篇文章主要介紹了python 解決tqdm模塊不能單行顯示的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • python實現(xiàn)三維擬合的方法

    python實現(xiàn)三維擬合的方法

    今天小編就為大家分享一篇python實現(xiàn)三維擬合的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python 矩陣轉(zhuǎn)置的幾種方法小結(jié)

    Python 矩陣轉(zhuǎn)置的幾種方法小結(jié)

    今天小編就為大家分享一篇Python 矩陣轉(zhuǎn)置的幾種方法小結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python中實現(xiàn)輸入超時及如何通過變量獲取變量名

    Python中實現(xiàn)輸入超時及如何通過變量獲取變量名

    這篇文章主要介紹了Python中實現(xiàn)輸入超時以及通過變量獲取變量的名字,本文給大家分享了解決思路主要是通過多線程法實現(xiàn),需要的朋友可以參考下
    2020-01-01
  • Python實現(xiàn)矩陣轉(zhuǎn)置的幾種方法詳解

    Python實現(xiàn)矩陣轉(zhuǎn)置的幾種方法詳解

    這篇文章主要介紹了Python實現(xiàn)矩陣轉(zhuǎn)置的幾種方法詳解,zip() 函數(shù)用于將可迭代的對象作為參數(shù),將對象中對應的元素打包成一個個元組,然后返回由這些元組組成的對象,這樣做的好處是節(jié)約了不少的內(nèi)存,需要的朋友可以參考下
    2023-08-08
  • Python繪制心形曲線完整代碼實現(xiàn)

    Python繪制心形曲線完整代碼實現(xiàn)

    這篇文章主要介紹了Python繪制心形曲線的相關(guān)資料,通過numpy和matplotlib庫計算坐標并繪圖,代碼包含導入庫、定義函數(shù)、生成參數(shù)、計算坐標、繪圖和顯示圖形等步驟,展示了數(shù)學與編程的結(jié)合美感,需要的朋友可以參考下
    2024-10-10
  • python基礎(chǔ)之并發(fā)編程(一)

    python基礎(chǔ)之并發(fā)編程(一)

    這篇文章主要介紹了詳解python的并發(fā)編程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-10-10
  • Python學習筆記之open()函數(shù)打開文件路徑報錯問題

    Python學習筆記之open()函數(shù)打開文件路徑報錯問題

    這篇文章主要介紹了Python學習筆記之open()函數(shù)打開文件路徑報錯問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • TensorFlow車牌識別完整版代碼(含車牌數(shù)據(jù)集)

    TensorFlow車牌識別完整版代碼(含車牌數(shù)據(jù)集)

    這篇文章主要介紹了TensorFlow車牌識別完整版代碼(含車牌數(shù)據(jù)集),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-08-08

最新評論