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

梁友栋算法是很简单的一个裁剪算法,但是只适用于裁剪范围是矩形框并且矩形框边界平行于坐标轴的情况。
实验结果:
在这里插入图片描述
在这里插入图片描述

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

##梁友栋
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)

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值