逻辑问题…解决了
标题可以修改一下吗?内容放到贴内即可
原问题如图,这里为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)
我修改了一些你的变量名
rec-polys
border-borders
不够清晰,变量名的关系应该尽量不形成误解
rec-recs
border-borders
或者觉得s看不清,可以用rec_list
各类用法和编程逻辑全部在程序内展现了,这里就不多列举
另外欢迎其他版主和用户们优化更正
作为编程初学,能把程序写完已经很不容易
不过还是任重道远,编程不是几个月而是几年的工夫。再接再厉!
2 个赞