欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于python?win32setpixel?api?實(shí)現(xiàn)計(jì)算機(jī)圖形學(xué)相關(guān)操作(推薦)

 更新時(shí)間:2021年12月08日 14:16:17   作者:禿桔子  
這篇文章主要介紹了基于python?win32setpixel?api?實(shí)現(xiàn)計(jì)算機(jī)圖形學(xué)相關(guān)操作,這次的主要分為2個(gè)主要模塊,一個(gè)是實(shí)現(xiàn)畫(huà)線,畫(huà)圓的算法,還有填充的算法,以及裁剪的算法,需要的朋友可以參考下

最近讀研期間上了計(jì)算機(jī)可視化的課,老師也對(duì)計(jì)算機(jī)圖形學(xué)的實(shí)現(xiàn)布置了相關(guān)的作業(yè)。雖然我沒(méi)有系統(tǒng)地學(xué)過(guò)圖形可視化的課,但是我之前逆向過(guò)一些游戲引擎,除了保護(hù)驅(qū)動(dòng)之外,因?yàn)橐鐾敢?/s>,接觸過(guò)一些計(jì)算機(jī)圖形學(xué)的基礎(chǔ)常識(shí)。這次的作業(yè)主要分為2個(gè)主要模塊,一個(gè)是實(shí)現(xiàn)畫(huà)線,畫(huà)圓的算法,還有填充的算法,以及裁剪的算法。
之前工作的時(shí)候雖然參與過(guò)一些數(shù)據(jù)可視化大屏的設(shè)計(jì),但是當(dāng)時(shí)主要的工作使用Echarts或者G2做業(yè)務(wù)組件開(kāi)發(fā),并沒(méi)有對(duì)畫(huà)線,填充,裁剪等基礎(chǔ)算法做過(guò)實(shí)現(xiàn)。這次就著這個(gè)機(jī)會(huì)我就想了解一些。實(shí)現(xiàn)的效果如下(動(dòng)圖加載可能有些慢):

掃描線填充過(guò)程

裁剪過(guò)程(根據(jù)鼠標(biāo)位置,實(shí)時(shí)裁剪多邊形,右邊的藍(lán)色是裁剪后的圖形)

為什么選擇win32 api畫(huà)圖

選擇win32的原因是我想做一些與眾不同的實(shí)現(xiàn)方法,比起用D3或者Echarts這種webGL的實(shí)現(xiàn)方式,我更想直接在顯示器上畫(huà)出圖像,看起來(lái)更極客一些。這也導(dǎo)致了錄屏軟件沒(méi)辦法捕捉,只能用手機(jī)來(lái)錄制??

為什么不選C++而選擇python

主要是python能對(duì)內(nèi)存做個(gè)管理,C++直接調(diào)這種底層的接口會(huì)把內(nèi)存搞壞掉,導(dǎo)致電腦變得特別卡。。不信大家可以在電腦上編譯運(yùn)行這段代碼2分鐘試一試,如果你電腦沒(méi)炸,算你有錢(qián)。。

#include <windows.h>
// g++ a.cpp -o a.exe -lgdi32 && a.exe
void bresenham(int x0,int y0,int x1,int y1){
    int dx = abs(x1-x0);
    int dy = abs(y1-y0);
    int sx = x0<x1 ? 1 : -1;
    int sy = y0<y1 ? 1 : -1;
    int err = dx-dy;
    int e2;
    while(1){
        SetPixel(GetDC(0),x0,y0,RGB(255,0,0));
        if(x0==x1 && y0==y1) break;
        e2 = 2*err;
        if(e2>-dy){
            err = err-dy;
            x0 = x0+sx;
        }
        if(e2<dx){
            err = err+dx;
            y0 = y0+sy;
        }
    }
}


void draw_polygon(int x[], int y[], int n)
{
    int i;
    for (i = 0; i < n - 1; i++)
        bresenham(x[i], y[i], x[i + 1], y[i + 1]);
    bresenham(x[n - 1], y[n - 1], x[0], y[0]);
}

int main()
{
    HDC hdc = GetDC(0);
    int x[4] = {100,200,300,100};
    int y[4] = {100,100,200,200};
    while (1)
    {
        draw_polygon(x,y,4);
        ReleaseDC(0, hdc);
    }
    return 0;
}

畫(huà)線

對(duì)于畫(huà)線部分,我這里使用了一個(gè)叫bresenham算法。。雖然我念不出名字,但是這個(gè)算法能夠幫助我們實(shí)現(xiàn)畫(huà)線運(yùn)算,還有后面的中心圓填充,多邊形繪畫(huà)等方法。而且不通過(guò)浮點(diǎn)數(shù)的運(yùn)算,直接變成整數(shù)運(yùn)算,算法實(shí)現(xiàn)的函數(shù)如下所示,看起來(lái)比較簡(jiǎn)單,運(yùn)行速度也很快。

def bresenham(x0, y0, x1, y1 , color):
    dx = abs(x1 - x0)
    dy = abs(y1 - y0)
    sx = 1 if x0 < x1 else -1
    sy = 1 if y0 < y1 else -1
    err = dx - dy
    while True:
        win32gui.SetPixel(dc, x0, y0, color)
        if x0 == x1 and y0 == y1:
            break
        e2 = 2 * err
        if e2 > -dy:
            err -= dy
            x0 += sx
        if e2 < dx:
            err += dx
            y0 += sy

我的屏幕分辨率是1920x1080的,只要在電腦里調(diào)用這個(gè)函數(shù),把兩個(gè)點(diǎn)的坐標(biāo)填進(jìn)去,就可以在顯示器屏幕上畫(huà)一條線。

中心圓算法

這個(gè)中心圓算法相對(duì)來(lái)說(shuō)就比畫(huà)線的算法在理解上面難很多,但是實(shí)現(xiàn)起來(lái)更簡(jiǎn)單一些,分成8個(gè)關(guān)于直線的和坐標(biāo)軸對(duì)稱(chēng)的區(qū)域畫(huà)圓,因此知道一個(gè)就可以畫(huà)出其他幾個(gè),下面是實(shí)現(xiàn)過(guò)程。

def draw_circle(x, y, r):
    x0 = 0
    y0 = r
    d = 3 - 2 * r
    while x0 <= y0:
        win32gui.SetPixel(dc, x + x0, y + y0, 0xffffff)
        win32gui.SetPixel(dc, x + y0, y + x0, 0xffffff)
        win32gui.SetPixel(dc, x - y0, y + x0, 0xffffff)
        win32gui.SetPixel(dc, x - x0, y + y0, 0xffffff)
        win32gui.SetPixel(dc, x - x0, y - y0, 0xffffff)
        win32gui.SetPixel(dc, x - y0, y - x0, 0xffffff)
        win32gui.SetPixel(dc, x + y0, y - x0, 0xffffff)
        win32gui.SetPixel(dc, x + x0, y - y0, 0xffffff)
        if d < 0:
            d += 4 * x0 + 6
        else:
            d += 4 * (x0 - y0) + 10
            y0 -= 1
        x0 += 1

在中心圓填充這里,可以取個(gè)巧,把幾個(gè)頂點(diǎn)直接用畫(huà)線的算法一行一行填充上去。就可以實(shí)現(xiàn)下面的效果。代碼如下

# 畫(huà)實(shí)心圓
def draw_circle_fill(x0, y0, r):
    x = 0
    y = r
    d = 3 - 2 * r
    while x <= y:
        time.sleep(0.01)
        bresenham(x0 + x, y0 + y, x0 - x, y0 + y)
        time.sleep(0.01)
        bresenham(x0 + x, y0 - y, x0 - x, y0 - y)
        time.sleep(0.01)
        bresenham(x0 + y, y0 + x, x0 - y, y0 + x)
        time.sleep(0.01)
        bresenham(x0 + y, y0 - x, x0 - y, y0 - x)
        if d < 0:
            d += 4 * x + 6
        else:
            d += 4 * (x - y) + 10
            y -= 1
        x += 1

掃描線填充

掃描線填充的算法就比較難實(shí)現(xiàn)了,需要找到起始的種子,還有每行的種子,因?yàn)槲疫@里僅僅用頂點(diǎn)實(shí)現(xiàn)起來(lái)過(guò)于復(fù)雜,就索性偷懶用了數(shù)組。下面的算法實(shí)現(xiàn)部分僅供參考,具體的實(shí)現(xiàn)包括種子的選擇等等,可以更好一些。

maps = [[0 for x in range(0,400)] for x in range(0,400)]

for i in range(200,300):
    maps[i][200] = 1
    maps[200][i] = 1
    maps[i][300] = 1
    maps[300][i] = 1
for i in range(230,270):
    maps[i][230] = 1
    maps[i][270] = 1
    maps[230][i] = 1
    maps[270][i] = 1
# 掃描填充maps
def scan_fill():
    seed = (271,296)
    stack = []
    stack.append(seed)
    while len(stack) > 0:
        (x,y) = stack.pop()
        # 如果已經(jīng)被填充過(guò),則跳過(guò)
        if(maps[x][y] == 1):
            continue
        # 橫向填充并記錄lx rx
        i=0
        time.sleep(0.01)
        while(maps[x+i][y] == 0):
            maps[x+i][y] = 1
            win32gui.SetPixel(dc, x+i, y, 0xffffff)
            i += 1
        rx = x+i-1
        i=1
        while(maps[x-i][y] == 0):
            maps[x-i][y] = 1
            win32gui.SetPixel(dc, x-i, y, 0xffffff)
            i+=1
        lx = x-i+1
        # 下一個(gè)種子
        if y+1>=300:
            continue
        i=0
        while(maps[lx+i][y+1] == 0):
            if(maps[lx+i+1][y+1]==1):
                stack.append((lx+i,y+1))
                break
            i+=1
        i=0
        while(maps[rx-i][y+1] == 0):
            if(maps[rx-i-1][y+1]==1):
                stack.append((rx-i,y+1))
                break
            i+=1
        if y-1<=0:
            continue
        i=0
        while(maps[lx+i][y-1] == 0):
            if(maps[lx+i+1][y-1]==1):
                stack.append((lx+i,y-1))
                break
            i+=1
        i=0
        while(maps[rx-i][y-1] == 0):
            if(maps[rx-i-1][y-1]==1):
                stack.append((rx-i,y-1))
                break
            i+=1
scan_fill()

這里是所有代碼

上面的代碼都是剪切過(guò)的,完整的代碼如下所示,運(yùn)行后大家就可以在顯示器上看到運(yùn)行過(guò)程:

import time
import win32gui
dc = win32gui.GetDC(0)
maps = [[0 for x in range(0,400)] for x in range(0,400)]

for i in range(200,300):
    maps[i][200] = 1
    maps[200][i] = 1
    maps[i][300] = 1
    maps[300][i] = 1
for i in range(230,270):
    maps[i][230] = 1
    maps[i][270] = 1
    maps[230][i] = 1
    maps[270][i] = 1
# 中點(diǎn)算法畫(huà)圓
def draw_circle(x, y, r):
    x0 = 0
    y0 = r
    d = 3 - 2 * r
    while x0 <= y0:
        time.sleep(0.01)
        win32gui.SetPixel(dc, x + x0, y + y0, 0xffffff)
        time.sleep(0.01)
        win32gui.SetPixel(dc, x + y0, y + x0, 0xffffff)
        time.sleep(0.01)
        win32gui.SetPixel(dc, x - y0, y + x0, 0xffffff)
        time.sleep(0.01)
        win32gui.SetPixel(dc, x - x0, y + y0, 0xffffff)
        time.sleep(0.01)
        win32gui.SetPixel(dc, x - x0, y - y0, 0xffffff)
        time.sleep(0.01)
        win32gui.SetPixel(dc, x - y0, y - x0, 0xffffff)
        time.sleep(0.01)
        win32gui.SetPixel(dc, x + y0, y - x0, 0xffffff)
        time.sleep(0.01)
        win32gui.SetPixel(dc, x + x0, y - y0, 0xffffff)
        if d < 0:
            d += 4 * x0 + 6
        else:
            d += 4 * (x0 - y0) + 10
            y0 -= 1
        x0 += 1
# 畫(huà)線
def bresenham(x0, y0, x1, y1):
    dx = abs(x1 - x0)
    dy = abs(y1 - y0)
    sx = 1 if x0 < x1 else -1
    sy = 1 if y0 < y1 else -1
    err = dx - dy

    while True:
        #time.sleep(0.01)
        win32gui.SetPixel(dc, x0, y0, 0xffffff)
        if x0 == x1 and y0 == y1:
            break
        e2 = 2 * err
        if e2 > -dy:
            err -= dy
            x0 += sx
        if e2 < dx:
            err += dx
            y0 += sy

# 畫(huà)實(shí)心圓
def draw_circle_fill(x0, y0, r):
    x = 0
    y = r
    d = 3 - 2 * r
    while x <= y:
        time.sleep(0.01)
        bresenham(x0 + x, y0 + y, x0 - x, y0 + y)
        time.sleep(0.01)
        bresenham(x0 + x, y0 - y, x0 - x, y0 - y)
        time.sleep(0.01)
        bresenham(x0 + y, y0 + x, x0 - y, y0 + x)
        time.sleep(0.01)
        bresenham(x0 + y, y0 - x, x0 - y, y0 - x)
        if d < 0:
            d += 4 * x + 6
        else:
            d += 4 * (x - y) + 10
            y -= 1
        x += 1
# 畫(huà)多邊形
def draw_polygon(points):
    for i in range(len(points)):
        x0 = points[i][0]
        y0 = points[i][1]
        x1 = points[(i + 1) % len(points)][0]
        y1 = points[(i + 1) % len(points)][1]
        bresenham(x0, y0, x1, y1)

# 畫(huà)橢圓
def draw_ellipse(x0, y0, a, b):
    x = 0
    y = b
    a2 = a * a
    b2 = b * b
    d = b2 - a2 * b + a2 / 4
    while b2 * x <= a2 * y:
        win32gui.SetPixel(dc, x0 + x, y0 + y, 0xffffff)
        win32gui.SetPixel(dc, x0 - x, y0 + y, 0xffffff)
        win32gui.SetPixel(dc, x0 + x, y0 - y, 0xffffff)
        win32gui.SetPixel(dc, x0 - x, y0 - y, 0xffffff)
        if d < 0:
            d += b2 * (2 * x + 3)
        else:
            d += b2 * (2 * x - 2 * y + 5)
            y -= 1
        x += 1
    d1 = b2 * (x + 0.5) * (x + 0.5) + a2 * (y - 1) * (y - 1) - a2 * b2
    while y >= 0:
        win32gui.SetPixel(dc, x0 + x, y0 + y, 0xffffff)
        win32gui.SetPixel(dc, x0 - x, y0 + y, 0xffffff)
        win32gui.SetPixel(dc, x0 + x, y0 - y, 0xffffff)
        win32gui.SetPixel(dc, x0 - x, y0 - y, 0xffffff)
        if d1 > 0:
            d1 -= a2 * (2 * y - 1)
        d1 += b2 * (2 * x + 3)
        x += 1
        y -= 1
# 畫(huà)矩形
def draw_rectangle(x0, y0, x1, y1):
    bresenham(x0, y0, x1, y0)
    bresenham(x1, y0, x1, y1)
    bresenham(x1, y1, x0, y1)
    bresenham(x0, y1, x0, y0)

# 掃描填充maps
def scan_fill():
    seed = (271,296)
    stack = []
    stack.append(seed)
    while len(stack) > 0:
        (x,y) = stack.pop()
        # 如果已經(jīng)被填充過(guò),則跳過(guò)
        if(maps[x][y] == 1):
            continue
        # 橫向填充并記錄lx rx
        i=0
        time.sleep(0.01)
        while(maps[x+i][y] == 0):
            maps[x+i][y] = 1
            win32gui.SetPixel(dc, x+i, y, 0xffffff)
            i += 1
        rx = x+i-1
        i=1
        while(maps[x-i][y] == 0):
            maps[x-i][y] = 1
            
            win32gui.SetPixel(dc, x-i, y, 0xffffff)
            i+=1
        lx = x-i+1
        # 下一個(gè)種子
        if y+1>=300:
            continue
        i=0
        while(maps[lx+i][y+1] == 0):
            if(maps[lx+i+1][y+1]==1):
                stack.append((lx+i,y+1))
                break
            i+=1
        i=0
        while(maps[rx-i][y+1] == 0):
            if(maps[rx-i-1][y+1]==1):
                stack.append((rx-i,y+1))
                break
            i+=1
        if y-1<=0:
            continue
        i=0
        while(maps[lx+i][y-1] == 0):
            if(maps[lx+i+1][y-1]==1):
                stack.append((lx+i,y-1))
                break
            i+=1
        i=0
        while(maps[rx-i][y-1] == 0):
            if(maps[rx-i-1][y-1]==1):
                stack.append((rx-i,y-1))
                break
            i+=1
scan_fill()
while True:
    # 畫(huà)線
    
    bresenham(400, 900, 1000, 700)
    # 填充圓
    draw_circle_fill(900, 500, 100)
    # 中心圓
    draw_circle(1000, 200, 100)
    # 橢圓
    draw_ellipse(1500, 200, 100, 100)
    # 矩形
    draw_rectangle(1100, 400, 1200, 500)
    # 多邊形
    draw_polygon([(900, 1000), (800, 800), (1000, 900), (1100, 1000)])
    #三角形
    draw_polygon([(400, 200), (500, 300), (600, 200)])

裁剪

裁剪這里簡(jiǎn)直就是我的噩夢(mèng),因?yàn)槲抑盀榱藰O客選擇了僅僅知道頂點(diǎn)就畫(huà)出裁剪過(guò)的多邊形,導(dǎo)致我沒(méi)有數(shù)組,只能設(shè)計(jì)更極客的算法。
最后我找到了一種裁剪凸多邊形的辦法,大致就是找到每個(gè)線段的交點(diǎn),然后順時(shí)針?lè)较驅(qū)稽c(diǎn)和在主多邊形,副多邊形的頂點(diǎn)排序,最后就可以實(shí)現(xiàn)裁剪。代碼超級(jí)復(fù)雜,

import win32gui
import math
import pygame
dc = win32gui.GetDC(0)
# 獲取鼠標(biāo)的位置
mouse_x=win32gui.GetCursorPos()[0]
mouse_y=win32gui.GetCursorPos()[1]
temp = win32gui.GetCursorPos()
def get_mouse_pos():
    global mouse_x, mouse_y
    mouse_x = win32gui.GetCursorPos()[0]
    mouse_y = win32gui.GetCursorPos()[1]
clock = pygame.time.Clock()

temp2 = []
def bresenham(x0, y0, x1, y1 , color):
    dx = abs(x1 - x0)
    dy = abs(y1 - y0)
    sx = 1 if x0 < x1 else -1
    sy = 1 if y0 < y1 else -1
    err = dx - dy
    while True:
        win32gui.SetPixel(dc, x0, y0, color)
        if x0 == x1 and y0 == y1:
            break
        e2 = 2 * err
        if e2 > -dy:
            err -= dy
            x0 += sx
        if e2 < dx:
            err += dx
            y0 += sy


def draw_rectangle(x0, y0, x1, y1):
    bresenham(x0, y0, x1, y0,0xffffff)
    bresenham(x1, y0, x1, y1,0xffffff)
    bresenham(x1, y1, x0, y1,0xffffff)
    bresenham(x0, y1, x0, y0,0xffffff)


def draw_polygon(points):
    for i in range(len(points)):
        x0 = points[i][0]
        y0 = points[i][1]
        x1 = points[(i + 1) % len(points)][0]
        y1 = points[(i + 1) % len(points)][1]
        bresenham(x0, y0, x1, y1,0x00ff00)
def draw_polygon_black(points):
    for i in range(len(points)):
        x0 = points[i][0]
        y0 = points[i][1]
        x1 = points[(i + 1) % len(points)][0]
        y1 = points[(i + 1) % len(points)][1]
        bresenham(x0, y0, x1, y1,0x000000)
# 線段是否相交
def IsRectCross(p1x, p1y, p2x, p2y, q1x, q1y, q2x, q2y):
    return min(p1x,p2x) <= max(q1x,q2x) and min(q1x,q2x) <= max(p1x,p2x) and min(p1y,p2y) <= max(q1y,q2y) and min(q1y,q2y) <= max(p1y,p2y)


def IsLineSegmentCross(pFirst1x,pFirst1y,pFirst2x,pFirst2y,pSecond1x,pSecond1y,pSecond2x,pSecond2y):
    line1 = pFirst1x * (pSecond1y - pFirst2y) + pFirst2x * (pFirst1y - pSecond1y) + pSecond1x * (pFirst2y - pFirst1y)
    line2 = pFirst1x * (pSecond2y - pFirst2y) + pFirst2x * (pFirst1y - pSecond2y) + pSecond2x * (pFirst2y - pFirst1y)
    if (((line1 ^ line2) >= 0) and not (line1 == 0 and line2 == 0)):
        return False

    line1 = pSecond1x * (pFirst1y - pSecond2y) + pSecond2x * (pSecond1y - pFirst1y) + pFirst1x * (pSecond2y - pSecond1y)
    line2 = pSecond1x * (pFirst2y - pSecond2y) + pSecond2x * (pSecond1y - pFirst2y) + pFirst2x * (pSecond2y - pSecond1y)
    if (((line1 ^ line2) >= 0) and not (line1 == 0 and line2 == 0)):
        return False
    return True

def GetCrossPoint(p1x, p1y, p2x, p2y, q1x, q1y, q2x, q2y):
    if(IsRectCross(p1x, p1y, p2x, p2y, q1x, q1y, q2x, q2y)):
        if (IsLineSegmentCross(p1x, p1y, p2x, p2y, q1x, q1y, q2x, q2y)):
            tmpLeft = (q2x - q1x) * (p1y - p2y) - (p2x - p1x) * (q1y - q2y)
            tmpRight = (p1y - q1y) * (p2x - p1x) * (q2x - q1x) + q1x * (q2y - q1y) * (p2x - p1x) - p1x * (p2y - p1y) * (q2x - q1x)
            if (tmpLeft == 0):
                return None
            x = (int)(tmpRight/tmpLeft)
            tmpLeft = (p1x - p2x) * (q2y - q1y) - (p2y - p1y) * (q1x - q2x)
            tmpRight = p2y * (p1x - p2x) * (q2y - q1y) + (q2x- p2x) * (q2y - q1y) * (p1y - p2y) - q2y * (q1x - q2x) * (p2y - p1y)
            if (tmpLeft == 0):
                return None
            y = (int)(tmpRight/tmpLeft)
            return (x,y)
        else:
            return None
    else:
        return None

def draw_rectangle_black(x0, y0, x1, y1):
    bresenham(x0, y0, x1, y0,0x000000)
    bresenham(x1, y0, x1, y1,0x000000)
    bresenham(x1, y1, x0, y1,0x000000)
    bresenham(x0, y1, x0, y0,0x000000)

# 判斷點(diǎn)是否在多邊形內(nèi)
def IsPointInPolygon(points, x, y):
    nCross = 0
    for i in range(len(points)):
        p1x = points[i][0]
        p1y = points[i][1]
        p2x = points[(i + 1) % len(points)][0]
        p2y = points[(i + 1) % len(points)][1]
        if (y > min(p1y, p2y)):
            if (y <= max(p1y, p2y)):
                if (x <= max(p1x, p2x)):
                    if (p1y != p2y):
                        xinters = (y - p1y) * (p2x - p1x) / (p2y - p1y) + p1x
                    if (p1x == p2x or x <= xinters):
                        nCross += 1
    if (nCross % 2 == 0):
        return False
    else:
        return True
def getNonRepeatList(data):
    new_data = []
    for i in range(len(data)):
        if data[i] not in new_data:
            new_data.append(data[i])
    return new_data


# 判斷兩多邊形重疊部分 返回一個(gè)多邊形
def IsPolygonCross(points1, points2):
    result = []
    for i in range(len(points1)):
        p1x = points1[i][0]
        p1y = points1[i][1]
        p2x = points1[(i + 1) % len(points1)][0]
        p2y = points1[(i + 1) % len(points1)][1]
        for j in range(len(points2)):
            q1x = points2[j][0]
            q1y = points2[j][1]
            q2x = points2[(j + 1) % len(points2)][0]
            q2y = points2[(j + 1) % len(points2)][1]
            if (IsPointInPolygon(points1, q1x, q1y) and (q1x, q1y) not in result):
                result.append((q1x, q1y))
            if (IsPointInPolygon(points1, q2x, q2y) and (q2x, q2y) not in result):
                result.append((q2x, q2y))
            if (IsPointInPolygon(points2, p1x, p1y) and (p1x, p1y) not in result):
                result.append((p1x, p1y))
            if (IsPointInPolygon(points2, p2x, p2y) and (p2x, p2y) not in result):
                result.append((p2x, p2y))
            if (IsRectCross(p1x, p1y, p2x, p2y, q1x, q1y, q2x, q2y)):
                if  GetCrossPoint(p1x, p1y, p2x, p2y, q1x, q1y, q2x, q2y) != None:
                    (x, y) = GetCrossPoint(p1x, p1y, p2x, p2y, q1x, q1y, q2x, q2y)
                    result.append((x, y))
    if (result == []):
        return result
    return (sort_points_in_clockwise_order(result))

w = 60
h = 100

def draw_polygon_red(points):
    for i in range(len(points)):
        x0 = points[i][0]
        y0 = points[i][1]
        x1 = points[(i + 1) % len(points)][0]
        y1 = points[(i + 1) % len(points)][1]
        bresenham(x0, y0, x1, y1,0xff0000)

def sort_points_in_clockwise_order(points):
    center = (0, 0)
    for point in points:
        center = (center[0] + point[0], center[1] + point[1])
    center = (center[0] / len(points), center[1] / len(points))
    points_copy = list(points)
    points_copy.sort(key=lambda point: math.atan2(point[0] - center[0], point[1] - center[1]))
    res = []
    for i in points_copy:
       res.append((i[0]+500,i[1]))
    return res

polygon_Points = [(600,500), (800,500), (900, 600), (900, 400),(600,300)]

while True:
    draw_rectangle_black(temp[0],temp[1],temp[0]+w,temp[1]+h)
    draw_rectangle(mouse_x,mouse_y,mouse_x+w,mouse_y+h)
    temp = (mouse_x,mouse_y)
    get_mouse_pos()
    draw_polygon(polygon_Points)
    res =  IsPolygonCross(polygon_Points,[(mouse_x,mouse_y),(mouse_x+w,mouse_y),(mouse_x+w,mouse_y+h),(mouse_x,mouse_y+h)]) 
    print(res)
    if temp2 != []:
        draw_polygon_black(temp2)
    if res != [] and res != None:
        draw_polygon_red(res)
        temp2 = res
    clock.tick(120)# 60幀
    
    

總結(jié)

計(jì)算機(jī)圖形學(xué)并沒(méi)有我之前想的那么好學(xué),踩了很多坑,也補(bǔ)了很多知識(shí)。希望后面能再接再厲

到此這篇關(guān)于基于python?win32setpixel?api?實(shí)現(xiàn)計(jì)算機(jī)圖形學(xué)相關(guān)操作的文章就介紹到這了,更多相關(guān)python計(jì)算機(jī)圖形學(xué)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Django利用AJAX技術(shù)實(shí)現(xiàn)博文實(shí)時(shí)搜索

    Django利用AJAX技術(shù)實(shí)現(xiàn)博文實(shí)時(shí)搜索

    這篇文章主要介紹了Django如何利用AJAX技術(shù)實(shí)現(xiàn)博文實(shí)時(shí)搜索,幫助大家更好的理解和學(xué)習(xí)使用Django框架,感興趣的朋友可以了解下
    2021-05-05
  • Caffe卷積神經(jīng)網(wǎng)絡(luò)solver及其配置詳解

    Caffe卷積神經(jīng)網(wǎng)絡(luò)solver及其配置詳解

    這篇文章主要為大家介紹了Caffe卷積神經(jīng)網(wǎng)絡(luò)solver及其配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • python將圖片轉(zhuǎn)為矢量圖的方法步驟

    python將圖片轉(zhuǎn)為矢量圖的方法步驟

    這篇文章主要介紹了python將圖片轉(zhuǎn)為矢量圖的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之樹(shù)回歸詳解

    python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之樹(shù)回歸詳解

    這篇文章主要為大家詳細(xì)介紹了python機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之樹(shù)回歸的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • python3安裝OCR識(shí)別庫(kù)tesserocr過(guò)程圖解

    python3安裝OCR識(shí)別庫(kù)tesserocr過(guò)程圖解

    這篇文章主要介紹了python3安裝OCR識(shí)別庫(kù)tesserocr過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • python3 http提交json參數(shù)并獲取返回值的方法

    python3 http提交json參數(shù)并獲取返回值的方法

    今天小編就為大家分享一篇python3 http提交json參數(shù)并獲取返回值的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • python解釋器spython使用及原理解析

    python解釋器spython使用及原理解析

    這篇文章主要介紹了python解釋器spython使用及原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Pytorch使用transforms

    Pytorch使用transforms

    這篇文章主要介紹了Pytorch使用transforms,tansforms功能,通俗地講,類(lèi)似于在計(jì)算機(jī)視覺(jué)流程里的圖像預(yù)處理部分的數(shù)據(jù)增強(qiáng)。下面來(lái)看看文章的具體內(nèi)容介紹吧,需要的朋友可以參考一下
    2021-12-12
  • 一步一步教你用Python?pyglet仿制鴻蒙系統(tǒng)里的時(shí)鐘

    一步一步教你用Python?pyglet仿制鴻蒙系統(tǒng)里的時(shí)鐘

    pyglet是一個(gè)面向Python的跨平臺(tái)窗口、多媒體庫(kù),它可以用于創(chuàng)建游戲和多媒體應(yīng)用程序,下面這篇文章主要給大家介紹了關(guān)于如何一步一步教你用Python?pyglet仿制鴻蒙系統(tǒng)里的時(shí)鐘,需要的朋友可以參考下
    2024-03-03
  • python3+requests接口自動(dòng)化session操作方法

    python3+requests接口自動(dòng)化session操作方法

    今天小編就為大家分享一篇python3+requests接口自動(dòng)化session操作方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10

最新評(píng)論