NCF参数化建筑论坛

标题: python编程如何获取一个不规则封闭solid内部的随机点?(附现有程序) [打印本页]

作者: Argydit    时间: 2016-9-21 10:29
标题: python编程如何获取一个不规则封闭solid内部的随机点?(附现有程序)
本帖最后由 Argydit 于 2016-9-21 11:06 编辑

如题,如何获取一个不规则封闭solid内部的随机点?或者是思路也可以。想了很久很想出来…总感觉很绕。

[attach]45126[/attach]

下面这一段是我现在的思路,因为是一个整的程序里面挖出来的一部分,可能定义的函数比较多。
这个思路就是通过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)


作者: 月之眼    时间: 2016-9-21 12:59
本帖最后由 月之眼 于 2016-9-21 13:07 编辑

给你简单改了一下,快不少,你可以看看
  1. #coding=utf-8
  2. import rhinoscriptsyntax as rs
  3. import random
  4. import Rhino.Geometry as rg

  5. def ptRange(pt01,pt02):
  6.     xB = random.uniform(pt01[0],pt02[0])
  7.     yB = random.uniform(pt01[1],pt02[1])
  8.     zB = random.uniform(pt01[2],pt02[2])
  9.     return xB,yB,zB

  10. randomPtsNum = rs.GetInteger("输入生成的随机点数")
  11. brep = rs.GetObject("选择要生成随机点的多重曲面",rs.filter.polysurface)
  12. geo_brep = rs.coercebrep(brep)
  13. box = geo_brep.GetBoundingBox(True)

  14. random_pt = []

  15. while (len(random_pt)<= randomPtsNum):
  16.     pt = ptRange(box.Min,box.Max)
  17.     if rs.IsPointInSurface(brep,pt,True,3):
  18.         random_pt.append(pt)

  19. for pot in random_pt:
  20.     rs.AddPoint(pot)
复制代码


作者: Argydit    时间: 2016-9-21 14:18
月之眼 发表于 2016-9-21 12:59
给你简单改了一下,快不少,你可以看看

嗯嗯 多谢。




欢迎光临 NCF参数化建筑论坛 (http://www.ncf-china.com/) Powered by Discuz! X3.2