最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)文章

  • Python提取Word中圖片的實現(xiàn)步驟

    Python提取Word中圖片的實現(xiàn)步驟

    本文主要介紹了Python提取Word中圖片的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • 詳解如何使用python腳本制作生成CANdbc

    詳解如何使用python腳本制作生成CANdbc

    這篇文章主要為大家詳細介紹了如何使用python腳本制作生成CANdbc,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解下
    2024-01-01
  • python刪除某個字符

    python刪除某個字符

    這篇文章主要介紹了python刪除某個字符,現(xiàn)在發(fā)布的是一個比較簡單易行的方法,就是遇到該字符便跳過去,不對其進行操作,完美呈現(xiàn)出刪除該字符的功能,需要的朋友可以參考下
    2018-03-03
  • python多線程threading.Lock鎖用法實例

    python多線程threading.Lock鎖用法實例

    這篇文章主要介紹了python多線程threading.Lock鎖用法,以實例形式對python鎖的用法進行了較為詳細的分析,需要的朋友可以參考下
    2014-11-11
  • window7下的python2.7版本和python3.5版本的opencv-python安裝過程

    window7下的python2.7版本和python3.5版本的opencv-python安裝過程

    這篇文章主要介紹了window7下的python2.7版本和python3.5版本的opencv-python安裝過程,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • Python實現(xiàn)刪除列表中滿足一定條件的元素示例

    Python實現(xiàn)刪除列表中滿足一定條件的元素示例

    這篇文章主要介紹了Python實現(xiàn)刪除列表中滿足一定條件的元素,結(jié)合具體實例形式對比分析了Python針對列表元素的遍歷、復制、刪除等相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • 在 Jupyter 中重新導入特定的 Python 文件(場景分析)

    在 Jupyter 中重新導入特定的 Python 文件(場景分析)

    Jupyter 是數(shù)據(jù)分析領(lǐng)域非常有名的開發(fā)環(huán)境,使用 Jupyter 寫數(shù)據(jù)分析相關(guān)的代碼會大大節(jié)約開發(fā)時間。這篇文章主要介紹了在 Jupyter 中如何重新導入特定的 Python 文件,需要的朋友可以參考下
    2019-10-10
  • 將本地Python項目打包成docker鏡像上傳到服務器并在docker中運行

    將本地Python項目打包成docker鏡像上傳到服務器并在docker中運行

    Docker是一個開源項目,為開發(fā)人員和系統(tǒng)管理員提供了一個開放平臺,可以將應用程序構(gòu)建、打包為一個輕量級容器,并在任何地方運行,這篇文章主要給大家介紹了關(guān)于將本地Python項目打包成docker鏡像上傳到服務器并在docker中運行的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • Python解析網(wǎng)頁源代碼中的115網(wǎng)盤鏈接實例

    Python解析網(wǎng)頁源代碼中的115網(wǎng)盤鏈接實例

    這篇文章主要介紹了Python解析網(wǎng)頁源代碼中的115網(wǎng)盤鏈接實例,主要采用了正則表達式re模塊來實現(xiàn)該功能,需要的朋友可以參考下
    2014-09-09
  • Python編程應用設計原則詳解

    Python編程應用設計原則詳解

    什么是好用的代碼呢?其實就是代碼質(zhì)量比較高,如何評價代碼質(zhì)量的高低呢?最常用的、最重要的評價標準,就是代碼的可維護性、可讀性、可擴展性、靈活性、簡潔性、可復用性、可測試性
    2021-09-09

最新評論

合水县| 清河县| 辰溪县| 垦利县| 新民市| 罗定市| 股票| 宁远县| 黄大仙区| 桐城市| 罗山县| 卢氏县| 西林县| 衡山县| 武宣县| 祁阳县| 龙岩市| 宜丰县| 壤塘县| 洛隆县| 华阴市| 台江县| 江孜县| 蒙山县| 黄山市| 巴林右旗| 墨江| 出国| 陇川县| 新邵县| 汾西县| 错那县| 龙游县| 灵寿县| 福贡县| 四平市| 堆龙德庆县| 海阳市| 于田县| 无棣县| 陇南市|