900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > [计算机图形学]Python实现梁友栋裁剪算法

[计算机图形学]Python实现梁友栋裁剪算法

时间:2022-11-08 17:43:21

相关推荐

[计算机图形学]Python实现梁友栋裁剪算法

梁友栋算法是很简单的一个裁剪算法,但是只适用于裁剪范围是矩形框并且矩形框边界平行于坐标轴的情况。

实验结果:

完整代码:

注意代码没有写到线是平行和垂直的情况,也没有考虑线不经过框的情况,所以输入的时候要注意

##梁友栋import numpy as np import matplotlib.pyplot as pltfrom matplotlib import animationimport random as rd#梁友栋算法计算出起点组最小组中的最大值,终点组#求出PL,PR,PB,PT的坐标def calPoint(p0,p1,LRBT):dx=p1[0]-p0[0]dy=p1[1]-p0[1]## 按要求写出ri,si rL=-dxrR=dxrB=-dyrT=dysL=p0[0]-LRBT[0]sR=LRBT[1]-p0[0]sB=p0[1]-LRBT[2]sT=LRBT[3]-p0[1]r_list=[rL,rR,rB,rT]s_list=[sL,sR,sB,sT]print("r_list,s_list",r_list,s_list)## t_list=[]start_group=[]end_group=[]## 计算ti=ri/sifor i in range(0,4):## 分配到起点组终点组if(r_list[i]<0):start_group.append(s_list[i]/r_list[i])if(r_list[i]>0):end_group.append(s_list[i]/r_list[i])print("sg,eg",start_group,end_group)return start_group,end_groupdef setAxis():lent=range(-15,15,1)plt.xticks(lent)plt.yticks(lent)plt.plot([-18,18],[0,0],'k')plt.plot([0,0],[-18,18],'k')## plt.grid()def calLRBT(site,line):d=line/2#返回LRBT的直线坐标LRBT=[site[0]-d,site[0]+d,site[1]-d,site[1]+d]return LRBTdef drawBorder(LRBT):#从左下角开始4个点x1=[LRBT[0],LRBT[2]]x2=[LRBT[1],LRBT[2]]x3=[LRBT[1],LRBT[3]]x4=[LRBT[0],LRBT[3]]print(x1,x2,x3,x4)drawLine(x1,x2,'k')drawLine(x1,x4,'k')drawLine(x3,x4,'k')drawLine(x3,x2,'k')def drawLine(st,ed,r='b'):plt.plot([st[0],ed[0]],[st[1],ed[1]],r)if __name__=="__main__":setAxis()##起点 中点st=list(map(int,input("起点:").split()))ed=list(map(int,input("终点:").split()))## 边界 规定中点为(10,10),方框边长为5border_site=list(map(int,input("方框中心:").split()))border_line=int((input("边长:")))## st=[1,3]## ed=[8,8]## border_site=[4,4]## border_line=4dpx=ed[0]-st[0]dpy=ed[1]-st[1]drawLine(st,ed)LRBT=calLRBT(border_site,border_line)drawBorder(LRBT)start_group,end_group=calPoint(st,ed,LRBT)start_group.append(0)end_group.append(1)t0=max(start_group)t1=min(end_group)new_p0=[dpx*t0+st[0],dpy*t0+st[1]]new_p1=[dpx*t1+st[0],dpy*t1+st[1]]drawLine(new_p0,new_p1,'y')plt.show()## print(st,ed,border_site,border_line)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。