梁友栋算法是很简单的一个裁剪算法,但是只适用于裁剪范围是矩形框并且矩形框边界平行于坐标轴的情况。
实验结果:
完整代码:
注意代码没有写到线是平行和垂直的情况,也没有考虑线不经过框的情况,所以输入的时候要注意
##梁友栋
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
import 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=-dx
rR=dx
rB=-dy
rT=dy
sL=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/si
for 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_group
def 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 LRBT
def 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),方框边长为5
border_site=list(map(int,input("方框中心:").split()))
border_line=int((input("边长:")))
## st=[1,3]
## ed=[8,8]
## border_site=[4,4]
## border_line=4
dpx=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)