×

工业设计互动平台

手机短信,快捷登录

微信登录,快人一步

QQ登录

只需一步,快速开始

分享高尔夫球的PYTHON练习

发布于 2014-9-4 2 点赞 25 评论 7337 浏览

分享高尔夫球的PYTHON练习,请筑梦NARUTO等高手指教
golfBall.png

代码如下
  1. import rhinoscriptsyntax as rs
  2. import math
  3. def golfBall():
  4. sphere_radius = 21
  5. sphere1 = rs.AddSphere([0,0,0], sphere_radius)

  6. circle_radius = 1.95
  7. vertical_count = int( (math.pi*sphere_radius)/(2*circle_radius) )

  8. phi = -0.5*math.pi
  9. phi_step = math.pi/vertical_count
  10. totalCount = 0
  11. realCount = 0

  12. r2 = 4
  13. while phi<=0.5*math.pi:
  14.   horizontal_count = int( (2*math.pi*math.cos(phi)*sphere_radius)/(2*circle_radius) )
  15.   if horizontal_count==0: horizontal_count=1
  16.   theta = 0
  17.   theta_step = 2*math.pi/horizontal_count
  18.   while theta<2*math.pi-1e-8:
  19.    offset = sphere_radius + r2 - 0.4
  20.    real_center = (offset*math.cos(theta)*math.cos(phi),
  21.     offset*math.sin(theta)*math.cos(phi), offset*math.sin(phi))
  22.    tempSphere = rs.AddSphere(real_center, r2)
  23.    
  24.    tempSphere = rs.BooleanDifference(sphere1, tempSphere)
  25.    if tempSphere!=None:
  26.        sphere1 = tempSphere
  27.        realCount+=1
  28.       
  29.    totalCount+=1
  30.    theta += theta_step
  31.   phi += phi_step

  32. print "Total count is ", totalCount, " Real count is ", realCount

  33. if __name__=="__main__":
  34.     rs.EnableRedraw(False)
  35.     golfBall()
  36.     rs.EnableRedraw(True)
复制代码


参与人数 2经验 +3 大洋 +16 收起 理由
筑梦NARUTO + 10 很给力!
wyx10022 + 3 + 6 很给力!

查看全部评分

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精彩回复

文明上网理性发言、请文明用语

wyx10022 | 网校特聘讲师 | 发表于 2014-9-4 14:35:15
鼓励代码研究!
0 回复

举报

筑梦NARUTO | 设计师 | 发表于 2014-9-4 15:08:43
本帖最后由 筑梦NARUTO 于 2014-9-4 15:09 编辑

做的不错啊,学习学习
0 回复

举报

wwwtiger | 设计助理 | 发表于 2014-9-4 16:58:57
本帖最后由 wwwtiger 于 2014-9-5 08:57 编辑

谢谢,其中有一个问题,按照标准的高尔夫球规定,球体上有 336 个凹洞, 每个洞的平均直径≤5毫米,深度约为0.25毫米,我取的直径为4mm,使用深度为0.25mm时,有几个点总是与球体无法切割,但从数学上应该是可以切到的

是不是AddSphere生成的球体不是标准球体,但我用曲率分析看了一下,各个视图上的投影应该是标准圆。

各位可以试一下,
r2 = 4
offset = sphere_radius + r2 - 0.4
改为
r2 = 5
offset = sphere_radius + r2 - 0.25


0 回复

举报

筑梦NARUTO · 发表于 2014-9-4 19:44 点评

可能与你使用了int函数有关系

筑梦NARUTO | 设计师 | 发表于 2014-9-4 19:44:29
wwwtiger 发表于 2014-9-4 16:58
谢谢,其中有一个问题,按照标准的高尔夫球规定,球体上有 336 个凹洞, 每个洞的平均直径≤5毫米,深度约为 ...

可能与你使用了int函数有关系
0 回复

举报

wwwtiger · 发表于 2014-9-5 08:38 点评

但是INT只是影响了行数和列数,并没有影响坐标值啊

toplay | 设计助理 | 发表于 2014-9-4 22:32:01
QQ截图20140904223108.jpg 像不像?
0 回复

举报

wwwtiger · 发表于 2014-9-5 08:40 点评

对,就是这个效果,是圆本身的问题,还是坐标计算的问题?百思不得其解

wwwtiger | 设计助理 | 发表于 2014-9-5 08:38:28
筑梦NARUTO 发表于 2014-9-4 19:44
可能与你使用了int函数有关系

但是INT只是影响了行数和列数,并没有影响坐标值啊
0 回复

举报

wwwtiger | 设计助理 | 发表于 2014-9-5 08:40:00

对,就是这个效果,是圆本身的问题,还是坐标计算的问题?百思不得其解
0 回复

举报

wwwtiger | 设计助理 | 发表于 2014-9-5 11:07:38
在r2 = 5  offset = sphere_radius + r2 - 0.25 的条件下,在代码中记录了一下不能相交的位置,发现它们的球体中心距离[0, 0, 0]约为25.75,半径为5,应该能与中心为[0, 0, 0],半径21的球体相交,可见坐标位置计算应该没有问题,只能怀疑球体本身的问题了。
Theta is  3.04639287621 Phi is  0.0 Center is  (-25.633402006256929, 2.447693115082686, 0.0) Radius is  5
Theta is  3.23679243097 Phi is  0.0 Center is  (-25.633402006256926, -2.4476931150827257, 0.0) Radius is  5
Theta is  2.85599332145 Phi is  0.196349540849 Center is  (-24.232207068164175, 7.115217977581336, 5.023575791915302) Radius is  5
Theta is  3.04639287621 Phi is  0.196349540849 Center is  (-25.140863374395433, 2.400661378217429, 5.023575791915302) Radius is  5
Total count is  337  Real count is  333
0 回复

举报

wwwtiger | 设计助理 | 发表于 2014-9-5 12:58:16
本帖最后由 wwwtiger 于 2014-9-5 13:00 编辑

终于找到元凶了,这是不是RHINO的一个BUG, 版本 5 SR2 (5.2.30328.21415, 2013/3/28) 教育版
请各位帮忙试一试

import rhinoscriptsyntax as rs
import math

sphere_radius = 21
sphere1 = rs.AddSphere([0,0,0], sphere_radius)

r2 = 5
sphere_s = rs.AddSphere([-24.706944070573311, 7.254613338666803, 0.0], r2)

sphere1 = rs.BooleanDifference(sphere1, sphere_s)

我得到的结果是这样的
golfBall_err.png

0 回复

举报

筑梦NARUTO · 发表于 2014-9-6 01:43 点评

应该是你的小球布尔运算的太小了,导致出错了,你把球往X正方形移动点就没有问题了

筑梦NARUTO | 设计师 | 发表于 2014-9-6 01:43:55
本帖最后由 筑梦NARUTO 于 2014-9-6 01:46 编辑
wwwtiger 发表于 2014-9-5 12:58
终于找到元凶了,这是不是RHINO的一个BUG, 版本 5 SR2 (5.2.30328.21415, 2013/3/28) 教育版
请各位帮忙 ...

应该是你的小球布尔运算的接触面太小了,导致出错了,你把球往X正方形移动点或者小球的半径大点就没有问题了
0 回复

举报

筑梦NARUTO · 发表于 2014-9-6 01:48 点评

像这样

筑梦NARUTO | 设计师 | 发表于 2014-9-6 01:48:19
筑梦NARUTO 发表于 2014-9-6 01:43
应该是你的小球布尔运算的接触面太小了,导致出错了,你把球往X正方形移动点或者小球的半径大点就没有问题 ...

像这样
3.jpg
0 回复

举报

hf0419001 · 发表于 2014-9-6 13:52 点评

建议仔细看一下帮助文件中的"布尔运算疑难排解"。 这个问题是因为小球的边界汇集点与大球面重叠导致的布尔计算错误。你只要把小球原地转一个角度使边界与大球错开就能布尔运算了

筑梦NARUTO · 发表于 2014-9-6 01:59 点评

半径设置成5.01都可以做到

筑梦NARUTO | 设计师 | 发表于 2014-9-6 01:59:32

半径设置成5.01都可以做到
0 回复

举报

筑梦NARUTO | 设计师 | 发表于 2014-9-6 02:16:02
import rhinoscriptsyntax as rs
sphere1 = rs.AddSphere((0,0,0),21)
center = (-24.706944070573311,7.254613338666803,0.0)
sphere_s = rs.AddSphere([round(i,3) for i in center], 5.0)
sphere1 = rs.BooleanDifference(sphere1, sphere_s)

0 回复

举报

筑梦NARUTO · 发表于 2014-9-6 02:16 点评

这样也可以,四舍五入下

筑梦NARUTO | 设计师 | 发表于 2014-9-6 02:16:32
筑梦NARUTO 发表于 2014-9-6 02:16
import rhinoscriptsyntax as rs
sphere1 = rs.AddSphere((0,0,0),21)
center = (-24.706944070573311,7.25 ...

这样也可以,四舍五入下
0 回复

举报

wwwtiger · 发表于 2014-9-6 08:32 点评

对,我最后就是用round到小数点后2位就可以了,但是该点的坐标不四舍五入也是正确的,而且其它点即使不进行四舍五入也可以正常切割,所以我还是觉得这是RHINO底层函数的一个BUG

wwwtiger | 设计助理 | 发表于 2014-9-6 08:32:09
筑梦NARUTO 发表于 2014-9-6 02:16
这样也可以,四舍五入下

对,我最后就是用round到小数点后2位就可以了,但是该点的坐标不四舍五入也是正确的,而且其它点即使不进行四舍五入也可以正常切割,所以我还是觉得这是RHINO底层函数的一个BUG
0 回复

举报

筑梦NARUTO · 发表于 2014-9-6 10:22 点评

应该是犀牛中布尔运算的精度问题,你把圆画到犀牛里,用犀牛带的命令也做不到,犀牛的命令算法是最强大的。同样做不到

筑梦NARUTO | 设计师 | 发表于 2014-9-6 10:22:04
本帖最后由 筑梦NARUTO 于 2014-9-6 10:42 编辑
wwwtiger 发表于 2014-9-6 08:32
对,我最后就是用round到小数点后2位就可以了,但是该点的坐标不四舍五入也是正确的,而且其它点即使不进 ...

应该是犀牛中布尔运算的精度问题,昨天试了下调用rhinocommon里面的方法做也是错的,最后把圆画到犀牛里,用犀牛带的命令也做不到,犀牛的命令算法是最强大的。同样做不到,所以应该是犀牛精度的问题
0 回复

举报

hf0419001 | 资深设计师 | 发表于 2014-9-6 13:52:39
本帖最后由 hf0419001 于 2014-9-6 14:01 编辑

建议仔细看一下帮助文件中的"布尔运算疑难排解"。
这个问题是因为小球的边界汇集点与大球面重叠导致的布尔计算错误。你只要把小球原地转一个角度使边界与大球错开就能布尔运算了,比如这样

import rhinoscriptsyntax as rs
import math
sphere_radius = 21
sphere1 = rs.AddSphere([0,0,0], sphere_radius)
r2 = 5
sphere_s = rs.AddSphere([-24.706944070573311, 7.254613338666803, 0.0], r2)
sphere_r = rs.RotateObject(sphere_s,[-24.706944070573311, 7.254613338666803, 0.0],1)
sphere1 = rs.BooleanDifference(sphere1, sphere_r)

0 回复

举报

wwwtiger · 发表于 2014-9-7 14:23 点评

这个点的位置确实很奇怪,不过总是解决了心中的疑问。 谢谢大家的帮助

筑梦NARUTO · 发表于 2014-9-6 14:56 点评

版主给力

筑梦NARUTO | 设计师 | 发表于 2014-9-6 14:56:06
hf0419001 发表于 2014-9-6 13:52
建议仔细看一下帮助文件中的"布尔运算疑难排解"。
这个问题是因为小球的边界汇集点与大球面重叠导致的布尔 ...

版主给力
0 回复

举报

wwwtiger | 设计助理 | 发表于 2014-9-7 14:23:56
hf0419001 发表于 2014-9-6 13:52
建议仔细看一下帮助文件中的"布尔运算疑难排解"。
这个问题是因为小球的边界汇集点与大球面重叠导致的布尔 ...

这个点的位置确实很奇怪,不过总是解决了心中的疑问。
谢谢大家的帮助
0 回复

举报

开心就好Z | 设计助理 | 发表于 2014-11-12 15:31:22
我的在, 出现代码错误信息。File "C:\Documents and Settings\Administrator\Local Settings\Temp\TempScript.py", line 4
    sphere_radius = 21

    ^
SyntaxError: expected an indented block
0 回复

举报

wwwtiger · 发表于 2014-11-12 16:50 点评

PYTHON是靠缩进表示代码嵌套关系的,可能是网页拷贝下来的时候格式乱了,自己调整一下就好了

wwwtiger | 设计助理 | 发表于 2014-11-12 16:50:18
开心就好Z 发表于 2014-11-12 15:31
我的在, 出现代码错误信息。File "C:\Documents and Settings\Administrator\Local Settings\Temp\TempScr ...

PYTHON是靠缩进表示代码嵌套关系的,可能是网页拷贝下来的时候格式乱了,自己调整一下就好了
0 回复

举报

badrobot | 实习生 | 发表于 2014-12-4 13:08:52
11.jpg
是不是没有问题啊!
布尔是需要提高精度的,精度加一位就好了。
22.jpg

0 回复

举报

筑梦NARUTO · 发表于 2014-12-4 15:47 点评

上面版主回复了。。。是布尔的问题,你可以看下

筑梦NARUTO | 设计师 | 发表于 2014-12-4 15:47:19
badrobot 发表于 2014-12-4 13:08
是不是没有问题啊!
布尔是需要提高精度的,精度加一位就好了。

上面版主回复了。。。是布尔的问题,你可以看下
0 回复

举报

bula丶夏沫 | 实习生 | 发表于 2016-1-13 10:29:54
坐观大神讨论
0 回复

举报

一起去眺海 | 设计主管 | 发表于 2023-4-11 09:57:58
File "D:\Temp\TempScript.py", line 4
    sphere_radius = 21
    ^
SyntaxError: expected an indented block
-----------------------------------------------
rhino7.20 机器没装PY解释器,手工不知咋缩进
0 回复

举报