Ghpython里while循环逻辑问题


2023.6.26.gh (17.2 KB)

1b4682843e2e7757e7839b562cc203a
逻辑问题…解决了

标题可以修改一下吗?内容放到贴内即可 :rofl:

原问题如图,这里为polys程序运行正常,改为borders程序陷入死循环,但在我看来polys和borders列表没有区别。

代码的逻辑没问题,编程习惯的问题还挺多的。这里简单提一下,仅供参考

函数的目的是程序的模块化,节约工作量的同时让程序便于维护。而你做的恰恰相反,你是为了函数而函数的,有点形式主义。判断曲线内外的函数,is_point_in_curve和is_point_without_border他们明明做的事情和内部逻辑几乎一样,为什么要分成两个呢?而且并且每个函数都会重复获取一次文档的容差。你的代码当作程序看的话,就太像八股文了。

python的for以及配合的enumerate用法不太熟练,建议多查资料。

1 个赞
import Rhino.Geometry as rg
import random as r
import Rhino.RhinoDoc as doc

tol = doc.ActiveDoc.ModelAbsoluteTolerance

def point_in_curve(crv, pt):
    containment = crv.Contains(pt,rg.Plane.WorldXY,tol)
    return containment == rg.PointContainment.Inside
    #不用加上点落在曲线上的情况,因为那样生成的矩形一定和边界相交

def random_point_in_curve(crv):
    #在边界内生成一个随机点
    bbox = crv.GetBoundingBox(True)
    while True:
        X=r.uniform(bbox.Min.X,bbox.Max.X)
        Y=r.uniform(bbox.Min.Y,bbox.Max.Y)
        pt = rg.Point3d(X,Y,0)
        if point_in_curve(crv, pt):
             return pt    

def generate_rectangle(pt,w,h):
    #生成矩形    
    # 既然可以一句话写的东西都写成了函数,不妨把语句分分开增强可读性
    plane = rg.Plane(pt,rg.Vector3d(0,0,1))
    rec = rg.Rectangle3d(plane,w,-h)
    rec = rec.ToNurbsCurve()
    return rec    
    
def generate_back_rectangle(crv):
    #生成退距线框
    offset_rec=crv.Offset(rg.Plane.WorldXY,d,tol,rg.CurveOffsetCornerStyle(1))[0]
    return offset_rec

#函数名称不要加上这种反人类逻辑,建议crv_intersected
#调用判断时if crv_intersected或者if not crv_intersected
def crv_intersected(crv0,crv1):
    #检查两条曲线是否相交
    return rg.Intersect.Intersection.CurveCurve(crv0,crv1,tol,0.0)

recs=[]
borders=[]

while len(recs)<num:
    
    pt=random_point_in_curve(crv)
    rec=generate_rectangle(pt,w,h)
    # 先不着急做offset

    if not crv_intersected(crv,rec): # 和边界不相交
    
        isolated = True # 用一个标记表示是否和以前的方块有相交      
        for other_rec in recs: # python的list和for用法
            if crv_intersected(other_rec,rec): # 和任何一个以前的矩形相交了    
                isolated = False # 标记改掉       
                break # 跳出这一个循环
                
        if isolated:
            recs.append(rec)
            border=generate_back_rectangle(rec) # 此时再offset
            borders.append(border)

image
我修改了一些你的变量名
rec-polys
border-borders
不够清晰,变量名的关系应该尽量不形成误解
rec-recs
border-borders
或者觉得s看不清,可以用rec_list

各类用法和编程逻辑全部在程序内展现了,这里就不多列举
另外欢迎其他版主和用户们优化更正
作为编程初学,能把程序写完已经很不容易
不过还是任重道远,编程不是几个月而是几年的工夫。再接再厉!

2 个赞