手動(dòng)一體pos機(jī)p1,Python 過(guò)三點(diǎn)畫(huà)圓做一個(gè)路徑動(dòng)畫(huà)

 新聞資訊  |   2023-04-24 09:46  |  投稿人:pos機(jī)之家

網(wǎng)上有很多關(guān)于手動(dòng)一體pos機(jī)p1,Python 過(guò)三點(diǎn)畫(huà)圓做一個(gè)路徑動(dòng)畫(huà)的知識(shí),也有很多人為大家解答關(guān)于手動(dòng)一體pos機(jī)p1的問(wèn)題,今天pos機(jī)之家(www.dsth100338.com)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來(lái)看下吧!

本文目錄一覽:

1、手動(dòng)一體pos機(jī)p1

手動(dòng)一體pos機(jī)p1

最近做課件的時(shí)候,要做一個(gè)圓形路徑動(dòng)畫(huà),就想著給定起點(diǎn)和終點(diǎn)后,再自動(dòng)計(jì)算一個(gè)運(yùn)動(dòng)幅度,然后畫(huà)出圓來(lái),于是就引出三點(diǎn)畫(huà)圓的問(wèn)題。

CSDN 上有篇文章,列出了一個(gè)二元二次求解,我能看懂原理,但是代碼有點(diǎn)長(zhǎng)。大家懂的,python 代碼一長(zhǎng),意味著效率低。

于是繼續(xù)尋尋覓覓,終于在 stackoverflow 上找到了一個(gè)高手的答案,他用了復(fù)數(shù)求解,原理雖然沒(méi)搞懂,但是代碼簡(jiǎn)單啊,對(duì)于一個(gè)有經(jīng)驗(yàn)的程序員,沒(méi)什么是三個(gè)按鍵解決不了的。

簡(jiǎn)單封裝成一個(gè)求圓心和半徑的函數(shù)。

def get_circle(p1,p2,p3): '''三點(diǎn)求圓,返回圓心和半徑''' x, y, z = p1[0]+p1[1]*1j, p2[0]+p2[1]*1j, p3[0]+p3[1]*1j w = z-x w /= y-x c = (x-y)*(w-abs(w)**2)/2j/w.imag-x# 看不懂,to-do:復(fù)習(xí)一下復(fù)變函數(shù) return (-c.real,-c.imag),abs(c+x) c,r = get_circle((1,1),(1,2),(3,4))print('({:.2f},{:.2f}),r= {:.2f}'.format(c[0],c[1], r))

順手做了個(gè)演示程序,在屏幕中間隨便點(diǎn)一些點(diǎn),畫(huà)出來(lái)的效果有點(diǎn)像鳥(niǎo)群,居然還有點(diǎn)好看,閨女吐槽我又用了Matrix 綠,不廢話,上源碼。

# circlepath.pyfrom base import * W,H = 1280,800def get_circle(p1,p2,p3): '''三點(diǎn)求圓,返回圓心和半徑''' x, y, z = p1[0]+p1[1]*1j, p2[0]+p2[1]*1j, p3[0]+p3[1]*1j w = z-x w /= y-x c = (x-y)*(w-abs(w)**2)/2j/w.imag-x return (-c.real,-c.imag),abs(c+x)class CirclePath: def __init__(self,center,r): self.center = Vector2(center) self.r = r self.angle = 0 self.speed = 2 def draw(self,canvas): self.angle += self.speed pos = self.center + Vector2(self.r,0).rotate(self.angle) pygame.draw.circle(canvas, (0,200,0),pos, 3)points = []circles = []show_points = True # 顯示點(diǎn)def setup(): size(W,H)def draw(): global show_points for event in ctx.events: if event.type == pygame.KEYDOWN: if event.key == K_SPACE: show_points = not show_points if event.type == pygame.MOUSEBUTTONDOWN: points.append(event.pos) if len(points) >= 3: c,r = get_circle(points[-3],points[-2],points[-1]) circles.append(CirclePath(c,r)) ctx.screen.fill((0,0,0,100)) if show_points: for p in points: pygame.draw.circle(ctx.screen, (100,100,0),p, 2) for circle in circles: circle.draw(ctx.screen)run()

(按空格鍵,不顯示坐標(biāo)點(diǎn),會(huì)更好看一些。)

base.py 是我自己封裝了一下 pygame ,主要是為了仿 processing 的調(diào)用方式。

# base.pyimport pygamefrom pygame.locals import *from pygame.math import Vector2import sys,random,math,oswidth="360px",height="auto" />

第三方庫(kù)只用到了 pygame,如果您看到這里了,不嫌麻煩就給點(diǎn)個(gè)贊吧,鼓勵(lì)一下我。

以上就是關(guān)于手動(dòng)一體pos機(jī)p1,Python 過(guò)三點(diǎn)畫(huà)圓做一個(gè)路徑動(dòng)畫(huà)的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于手動(dòng)一體pos機(jī)p1的知識(shí),希望能夠幫助到大家!

轉(zhuǎn)發(fā)請(qǐng)帶上網(wǎng)址:http://www.dsth100338.com/news/32702.html

你可能會(huì)喜歡:

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 babsan@163.com 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。