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

python Graham求凸包問(wèn)題并畫圖操作

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

python Graham求凸包并畫圖

python寫Graham沒(méi)有c++那么好寫,但是python畫圖簡(jiǎn)單。只需要用matplotlib里的pyplot,c++畫圖太難了。

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

python必須要在結(jié)構(gòu)體里面加上角度這個(gè)變量,然后才能按照角度排序。排好序后就變得容易了,用stack棧存放答案,算完答案后,用scatter(散點(diǎn)圖)畫出點(diǎn),用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
        #和最左下的點(diǎn)連成的直線,與x軸正半軸的夾角大小 
 
#按照角度從小到大排序
def cmp(x):
    return x.angel  
def bottom_point(points):
    min_index = 0
    n = len(points)
    #先判斷y坐標(biāo),找出y坐標(biāo)最小的點(diǎn),x坐標(biāo)最小的點(diǎn)
    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 
 
#計(jì)算角度
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個(gè)點(diǎn)的坐標(biāo),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
    #計(jì)算每個(gè)點(diǎn)和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]
    #一定要大于等于零,因?yàn)榭赡茉谝粭l直線上
    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

圖形學(xué)可以說(shuō)經(jīng)常遇到這東西了,這里給出一個(gè)庫(kù)函數(shù)的實(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()

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

相關(guān)文章

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

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

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

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

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

    python刪除某個(gè)字符

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

    python多線程threading.Lock鎖用法實(shí)例

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

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

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

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

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

    在 Jupyter 中重新導(dǎo)入特定的 Python 文件(場(chǎng)景分析)

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

    將本地Python項(xiàng)目打包成docker鏡像上傳到服務(wù)器并在docker中運(yùn)行

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

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

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

    Python編程應(yīng)用設(shè)計(jì)原則詳解

    什么是好用的代碼呢?其實(shí)就是代碼質(zhì)量比較高,如何評(píng)價(jià)代碼質(zhì)量的高低呢?最常用的、最重要的評(píng)價(jià)標(biāo)準(zhǔn),就是代碼的可維護(hù)性、可讀性、可擴(kuò)展性、靈活性、簡(jiǎn)潔性、可復(fù)用性、可測(cè)試性
    2021-09-09

最新評(píng)論

那曲县| 邢台市| 芜湖市| 锡林浩特市| 乡宁县| 乌兰浩特市| 宜兴市| 崇仁县| 五大连池市| 浦城县| 清原| 博客| 宝清县| 敦煌市| 永州市| 郁南县| 中山市| 双峰县| 谷城县| 出国| 昌江| 客服| 秭归县| 镶黄旗| 乐业县| 大竹县| 山西省| 上思县| 襄城县| 大宁县| 古丈县| 禄丰县| 古交市| 荣成市| 交口县| 河南省| 陆川县| 康乐县| 永清县| 荔波县| 湟中县|