NCF参数化建筑论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 12458|回复: 2

[在线求助] python编程如何获取一个不规则封闭solid内部的随机点?(附现有程序)

[复制链接]
发表于 2016-9-21 10:29:59 | 显示全部楼层 |阅读模式
本帖最后由 Argydit 于 2016-9-21 11:06 编辑

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

微信截图_20160921103131.png

下面这一段是我现在的思路,因为是一个整的程序里面挖出来的一部分,可能定义的函数比较多。
这个思路就是通过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:01 | 显示全部楼层
本帖最后由 月之眼 于 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)
复制代码

点评

嗯嗯 多谢。  详情 回复 发表于 2016-9-21 14:18

评分

参与人数 1强度 +3 照度 +10 收起 理由
skywoolf + 3 + 10 表示赞同!

查看全部评分

 楼主| 发表于 2016-9-21 14:18:05 | 显示全部楼层
月之眼 发表于 2016-9-21 12:59
给你简单改了一下,快不少,你可以看看

嗯嗯 多谢。

小黑屋|手机版|NCF参数化建筑论坛 ( 浙ICP备2020044100号-2 )    辽公网安备21021102000973号

GMT+8, 2024-4-19 05:26 , Processed in 0.346492 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表