热烈欢迎新会员,新手报到帖maxscript BUG和技巧收集场景助手3.0下载飞浪脚本零起点入门
返回列表 发帖

统一样条线(Reverse Spline)

本帖最后由 longshaohua 于 2017-8-25 18:32 编辑



思路:
Reverse是反转样条线的函数,通过这个可以反转样条线方向。要统一线就得判断这根线段是 逆时针 还是 顺时针。
线分类:曲线/折线;斜直线/偏直线/直线。
曲线折线判断是逆时针还是顺时针这个没争议;
直线类就有点含糊了,例如:垂直与x方向平行y方向直线等。
这里我统一从右到左的为逆时针,从上到下的为逆时针。
关于判断逆顺时针的脚本函数,版主ys172在之前的帖子里提供过:
  1. state=0
  2. pointnum=numknots $ 1

  3. if pointnum >=3 do
  4. (
  5. for i=1 to pointnum do
  6. (
  7. if i==1 then pb=pointnum
  8. else pb=i-1

  9. if i==pointnum then pf=1
  10. else pf=i+1

  11. a=getKnotPoint $ 1 i
  12. b=getKnotPoint $ 1 pf
  13. c=getKnotPoint $ 1 pb

  14. AB=normalize(B-A)
  15. AC=normalize(C-A)

  16. z=cross AB AC
  17. z=z.z
  18. if z>0 then state+=1
  19. else state-=1
  20. )
  21. )

  22. if state >0 then "逆时针"
  23. else "顺时针"
复制代码


---------------------------
但是这函数对于直线类就不行。
对于直线类我用了个笨方法:
就是收集线段上的点的xy的坐标值,再对比线段上第一个点。如果它的x值(或者y值)最大那么是逆时针,反之顺时针:
  1. fn cw_ccw_Direct_line2 obj numsl =
  2. (
  3. xpos=#()
  4. ypos=#()
  5. pointnum=numknots obj numsl
  6. onexpos=(getKnotPoint obj numsl 1).x
  7. oneypos=(getKnotPoint obj numsl 1).y
  8. for i=1 to (pointnum-1) do
  9. (
  10. a=getKnotPoint obj numsl i
  11. b=getKnotPoint obj numsl (i+1)
  12. if a.x!=b.x then
  13. (
  14. append xpos (a.x)
  15. if (pointnum-1)==i then append xpos (b.x)
  16. )
  17. if a.y!=b.y then
  18. (
  19. append ypos (a.y)
  20. if (pointnum-1)==i then append ypos (b.y)
  21. )
  22. )
  23. if xpos.count>1 then
  24. (
  25. aminx=amin xpos
  26. amaxx=amax xpos
  27. )
  28. if ypos.count>1 then
  29. (
  30. aminy=amin ypos
  31. amaxy=amax ypos
  32. )
  33. case rdo2.state of
  34. (
  35. 1:(
  36. if xpos.count>1 then (if(onexpos==amaxx)then (reverse obj numsl))
  37. else(if(oneypos==amaxy)then reverse obj numsl)
  38. )
  39. 2:(
  40. if xpos.count>1 then (if(onexpos==aminx)then (reverse obj numsl))
  41. else(if(oneypos==aminy)then reverse obj numsl)
  42. )
  43. )
  44. )
复制代码


------------------------------
下面问题是怎么判断这根线段是曲线/折线还是偏/直线类的呢?
自己查了下资料写了个判断函数:
  1. --判断折线/曲线还是直线/偏向直线:
  2. fn curve_Direct_Line obj numsl =
  3. (
  4. angle_c=0
  5. pointnum=numknots obj numsl
  6. for i=1 to (pointnum-2) do
  7. (
  8. a=getKnotPoint obj numsl i
  9. b=getKnotPoint obj numsl (i+1)
  10. c=getKnotPoint obj numsl (i+2)
  11. abx=b.x-a.x
  12. aby=b.y-a.y
  13. acx=c.x-a.x
  14. acy=c.y-a.y
  15. arctcos=(abx*acx+aby*acy)/(sqrt(abx*abx+aby*aby)*(sqrt(acx*acx+acy*acy)))
  16. n = acos(arctcos)
  17. case of
  18. (
  19. (n>1): angle_c+=1
  20. ((n<=1)and(n!=0)): angle_c-=1
  21. (n==0): angle_c+=0
  22. )
  23. )

  24. angle_c
  25. --if angle_c>0 then "折线/曲线"
  26. --if angle_c<0 then "偏向直线"
  27. --if angle_c==0 then "直线"
  28. )
复制代码


----------------------------------------
到这里差不多了。就是先判断是曲线还是直线,再分别判断是逆时针还是顺时针,再跟条件去反转线。
还有就是这样在工作中也不一定好使,因为没封闭的直线类线段它所在的位置不同有时并不一定要反转。
其实都做成封闭的样条线就不需要这么麻烦。(脚本不足的地方大家自己改改,献丑了。)
链接: http://pan.baidu.com/s/1nvBQaGp 密码: e75y
(怎么在帖子里面插入图片和附件不行??上传了看不到。)
1

评分人数

分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友

[img]
  1. {:5_134:}
复制代码
[/img]

TOP

返回列表