|
本帖最后由 Argydit 于 2016-9-21 11:06 编辑
如题,如何获取一个不规则封闭solid内部的随机点?或者是思路也可以。想了很久很想出来…总感觉很绕。
下面这一段是我现在的思路,因为是一个整的程序里面挖出来的一部分,可能定义的函数比较多。
这个思路就是通过boundingBox内部的随机点来判定是否在solid之内。但是担心如果solid 形状奇怪的话会计算缓慢。有没有别的直接一点的办法呢
def ranL(mi,ma):
random0 =random.random()
randomF = random0*(ma-mi)+mi
return randomF
def ptFromBox(box):
crv = rs.DuplicateEdgeCurves(box)
corpt = []
for i in crv:
endpt = rs.CurveEndPoint(i)
corpt.append(endpt)
xA = []
yA = []
zA = []
for i in corpt:
x,y,z = i
xA.append(x)
yA.append(y)
zA.append(z)
xA.sort()
yA.sort()
zA.sort()
p1 = [xA[0],yA[0],zA[0]]
p2 = [xA[-1],yA[-1],zA[-1]]
return p1,p2
def ptChoice(pt01,pt02):
xA = random.choice((pt01[0],pt02[0]))
yA = random.choice((pt01[1],pt02[1]))
zA = random.choice((pt01[2],pt02[2]))
return xA,yA,zA
def ptRange(pt01,pt02):
xB = ranL(pt01[0],pt02[0])
yB = ranL(pt01[1],pt02[1])
zB = ranL(pt01[2],pt02[2])
return xB,yB,zB
##carveMode-loc face=1 edge=2 corner=3
def ptLocation(box,loc):
pt0 = ptFromBox(box)
pt01 = pt0[0]
pt02 = pt0[1]
codC = ptChoice(pt01,pt02)
codR = ptRange(pt01,pt02)
pt = [0,0,0]
plist = [0,1,2]
for i in range(loc): ##carveMode face=1 edge=2 corner=3
nChoice = random.choice(plist)
plist.remove(nChoice)
pt[nChoice] = codC[nChoice]
for i in plist:
nRange = i
pt[nRange] = codR[nRange]
return pt
block = rs.GetObject()
for i in range(100):
x=0
while x<100:
x = x+1
boxblock = rs.AddBox(rs.BoundingBox(block))
pot = ptLocation(boxblock,0)
rs.DeleteObject(boxblock)
if rs.IsPointInSurface(block,pot,True,3):break
rs.AddPoint(pot)
|
|