QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
9天前
查看: 4468|回复: 5
收起左侧

[讨论] 水泵叶线画法

[复制链接]
发表于 2009-5-22 13:57:39 | 显示全部楼层 |阅读模式 来自: 中国江苏苏州

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
如图,中间红色线与内圆切线夹角为27度,与外圆切线夹角为45度,随R增大,夹角均匀增大,求其曲线画法!
1111.JPG
发表于 2009-5-23 15:00:45 | 显示全部楼层 来自: 中国辽宁营口

  1. ; U2 x% n* ~3 F) r! ~
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double
    ; q/ M2 T: _" I& z" x$ A7 w8 C! g
  3.     Dim Lng样条曲线拟合点数量 As Long, Lng相邻拟合点间计算分段数量 As Long+ u  k& O" H2 |; [
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant
    % c5 o6 H; l) w+ E6 C7 V! z
  5.     Dim Lng拟合点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double$ ~7 P' x4 z; h. \- ^+ j
  6.     Dim DblArr样条曲线拟合点() As Double, DblArr样条曲线起点切向(2) As Double, DblArr样条曲线端点切向(2) As Double
    4 d$ l) h# u, k2 f2 _
  7.    
    0 q0 F- T# T' B* J/ S) F
  8.     '已知条件
    5 t3 L" Q. |- w* J( k
  9.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 45
    7 k% h9 X. R, m% D+ C9 M
  10.    
    0 g+ C2 c4 x8 P- p) n' t
  11.     '设定曲线拟合点数量,通常不大于500,可根据情况自行更改. Q  S+ O; I0 B( n: a; }* N+ |
  12.     Lng样条曲线拟合点数量 = 1013 W0 I$ W, K" Z2 f% q3 g
  13.     '设定相邻拟合点间计算分段数量,可根据情况自行更改
    ) ~+ {. `$ {3 h4 C( p4 V
  14.     Lng相邻拟合点间计算分段数量 = 50
    # C9 M( i3 X9 c( c) f
  15.     '数值越大,曲线精度相对越高,但运行时间越长# X' C8 r" Y7 d
  16.    
    5 k" @. q7 W( `, d  R* A7 w
  17.     . x. O+ o0 ~/ a( }1 X0 M0 a
  18.    
      L& \( L3 P( \, l! V: d. L% ~
  19.     '按拟合点数量重定义数组
    ; S5 q$ n+ D: x3 q) I" |1 Z; p
  20.     ReDim DblArr样条曲线拟合点(Lng样条曲线拟合点数量 * 3 - 1)
    7 n4 A: r5 O2 w1 v
  21.    
    % [3 t& ^! @8 D& f; h9 d9 B
  22.     With ThisDrawing
    & G* E6 c5 \) E0 C" @+ ?( ~1 z
  23.    
    % o$ H$ z6 ?' x6 w# ]2 h) U! Y, D
  24.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改" B: w" O0 V4 T& g" V- L
  25.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)
    ( n# C# P0 ?& p" ?
  26.         $ p% H7 T( f$ y* [
  27.         '复制圆,做为结果显示8 O2 Y5 ]% Q6 r
  28.         Obj圆.Copy4 c$ {1 R3 w- {. `! i" H% Y
  29.         3 K+ F5 Z9 L- `0 K' h
  30.         '圆心右侧最小半径长度处为曲线起点( ]3 h) z4 s( m
  31.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)3 ]+ X& K) k5 S5 {. [( v3 {
  32.         
    2 M+ Z2 P' Z0 q1 d5 P8 @. P1 g
  33.         '记录曲线的第一个拟合点(起点)坐标' W* p# d0 i6 Y9 R. y! h9 [0 Y9 i
  34.         DblArr样条曲线拟合点(0) = Var点(0): DblArr样条曲线拟合点(1) = Var点(1)
    / O3 I' Q1 X! r
  35.         
    . x3 d, T. n" w/ j+ P& p# I
  36.         For Lng拟合点循环变量 = 0 To Lng样条曲线拟合点数量 - 28 E* H. t, u1 P( \( i4 f
  37.             For Lng计算分段循环变量 = 1 To Lng相邻拟合点间计算分段数量
    # s" t& P% y. {% n8 p8 M* V
  38.             
    8 H' N& g5 l# }, y9 n/ P
  39.                 '按半径计算夹角
    ( N) b* X& w+ ?) }
  40.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _: n) P3 \/ R8 {9 s6 h
  41.                   + Dbl最小夹角
    ' Q2 u' p# g6 W/ {/ J0 K. @
  42.                
    4 w# a$ m' ~3 b( c" ?6 g! l+ H
  43.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点
    4 R* {2 {6 K# r* y0 ?, V
  44.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线; b6 P0 D' d5 W$ ?* x) N9 t
  45.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _8 W4 X. w9 p- f8 B, a) V
  46.                   .Utility.PolarPoint(Var点, _
    % A' K4 Z+ o! V" M
  47.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))$ o4 ^/ E7 \4 W! v- P8 I
  48.                            
    ; h5 u# \. {( ?- p" W
  49.                 '辅助圆半径增大一个增量单位
    . s, _7 }! b. E% j! h0 I
  50.                 Obj圆.Radius = (Lng相邻拟合点间计算分段数量 * Lng拟合点循环变量 + Lng计算分段循环变量) _' j& {, }4 ]% E6 W( @7 O
  51.                   / ((Lng样条曲线拟合点数量 - 1) * Lng相邻拟合点间计算分段数量) _& j: e3 t+ f( q2 d
  52.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径; b$ `7 |9 h# U. @; i, \( Y; M" T  q
  53.                
    8 m) U6 }. ]9 O
  54.                 '获得辅助直线与辅助圆的交点
    8 O2 Z+ V4 h2 I; ^
  55.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)9 o; Z( b2 X% F8 D7 `# k
  56.                
    1 F* A4 C; w- O0 L9 h" N
  57.                 '删除辅助直线) O+ k# q# y) T
  58.                 Obj直线.Delete                        
    $ j3 q) }& {5 V$ u" V
  59.             Next
    ' y4 d% r- L. W! T# K, F( L* {
  60.             + c8 a5 B  |8 e8 l4 @9 ]) x
  61.             '记录拟合点坐标  s7 y/ |7 q& V% W% Z
  62.             DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 3) = Var点(0): DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 4) = Var点(1)3 q  U: G, i; A& d+ C
  63.         Next
    7 X  P$ n* d8 ]9 P  l) r
  64.                 1 G- H, i# Y* Y/ a, J9 w" i2 {  [+ C8 k
  65.         '计算起点切向% J; N/ o& \) \: ?/ z) b, `0 o
  66.         DblArr样条曲线起点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))
    2 v1 n3 M% L/ j* g4 d
  67.         DblArr样条曲线起点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))0 b6 z. y0 H: ?
  68.         " ]" x  B5 l0 }7 p: ^* i
  69.         '计算端点切向
    + R5 i6 M, m3 I+ V
  70.         DblArr样条曲线端点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))
    1 l. n: Y2 E4 g: y
  71.         DblArr样条曲线端点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))0 f6 y4 K: T$ s$ Y) j* x
  72.         
    5 ^6 _7 k4 m3 I* i8 x
  73.         '画曲线
    5 j0 z) p' f( _) x9 q/ l
  74.         .ModelSpace.AddSpline DblArr样条曲线拟合点, DblArr样条曲线起点切向, DblArr样条曲线端点切向: ^, h2 H9 ~) Z0 r! d- W& X& Q
  75.     End With
    8 h6 Q, K6 a& [1 `# C8 s1 c
复制代码
 楼主| 发表于 2009-5-24 10:13:07 | 显示全部楼层 来自: 中国江苏苏州
首先非常感谢版主的解答!
2 e) F0 I6 h  N( c( V! ^% q# b2 v如果改成多段线,该代码又如何修改呢?
发表于 2009-5-24 14:45:56 | 显示全部楼层 来自: 中国辽宁营口

回复 3# benwang 的帖子


  1. ! J) v+ X. _; R8 Q/ n, h' D+ ~
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double* |+ {" ^% ]0 P: _$ ?$ a
  3.     Dim Lng优化多段线顶点数量 As Long, Lng相邻顶点间计算分段数量 As Long
    ' Z% M3 ^1 j" C) g3 r  U; L
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant: P' @7 c9 U* y9 {6 P
  5.     Dim Lng顶点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double6 I0 R6 ]- Z- W1 \% I
  6.     Dim DblArr优化多段线顶点() As Double
    6 ^% W7 v* G: T* z4 k
  7.     ' Q- U- _" J1 y  [+ N
  8.     '设定优化多段线顶点数量,通常不大于500
    $ d; d5 y! p" h0 ~% L
  9.     Lng优化多段线顶点数量 = 101
    / m% @; N$ n( l$ {9 D$ J+ ]. s
  10.     '设定相邻顶点间计算分段数量  K! m% ]0 H' r& v
  11.     Lng相邻顶点间计算分段数量 = 5
    : a  _- l  n3 e% p! L. \
  12.     '数值越大,优化多段线精度相对越高,但运行时间越长
    * u. i% O5 w5 u; ^/ r" k- x8 e
  13.     ; Y' q( R& f, E9 V% c! H! @
  14.     '按顶点数量重定义数组: _: J+ C* Y, J- d
  15.     ReDim DblArr优化多段线顶点(Lng优化多段线顶点数量 * 2 - 1)
    . ?! R2 B5 `! z. A4 d: X
  16.     " l) `3 ~+ v' P0 r1 y/ l! j- Z
  17.     '已知条件) b1 L+ [' |8 m& ]+ l% X
  18.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 45
    ; q+ b( f, D4 i' j6 H
  19.    
    2 B! m0 i6 v; z. c
  20.     With ThisDrawing
    0 J8 d' ~- {) Z" Q* I
  21.     / q: z+ q' I9 m9 C- K
  22.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改7 u3 k; F0 _) {& z- Y0 _
  23.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)8 v, k- A4 |* @! j3 x+ u
  24.         ' p8 l, Z) e% {" e. F. _1 ^
  25.         '复制圆,做为结果显示6 M8 @) W1 o3 J( `. p( A' K9 x
  26.         Obj圆.Copy
    ) Z. ?! k) }+ m4 p  o' P  G+ |3 B, B
  27.         + p: `* y0 Y. R9 C
  28.         '圆心右侧最小半径长度处为优化多段线起点' S4 J5 W& T9 c* B( ?+ I
  29.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)# S' p3 @7 K' o: }3 U  _6 F
  30.         
      u$ x. c, ^- {" f! v3 q5 C
  31.         '记录优化多段线的第一个顶点(起点)坐标1 _* }& O" Z6 c! U4 C# W
  32.         DblArr优化多段线顶点(0) = Var点(0): DblArr优化多段线顶点(1) = Var点(1)
    2 g# N5 X' v. w* L
  33.         - \4 a3 @1 H1 D; B! I' r- _; E
  34.         For Lng顶点循环变量 = 0 To Lng优化多段线顶点数量 - 2
    8 v1 h7 j! U) D9 V# w9 E
  35.             For Lng计算分段循环变量 = 1 To Lng相邻顶点间计算分段数量, _6 {  Q' K# `$ D8 |: W
  36.             
    " d" \3 R: v3 O% m
  37.                 '按半径计算夹角
    ; g3 t' }( \" a8 p! `# k; \
  38.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _
    $ x9 A* C9 Y- E- h/ j& K
  39.                   + Dbl最小夹角$ U, y5 l; c: a2 T4 ?- q/ d
  40.                 0 [' X0 Q$ }( z3 \  e
  41.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点
    0 \8 i: w: q/ o3 D+ d
  42.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线- g4 `- V! f5 O9 S: s/ f5 A# M
  43.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _
    & l  `  {' K1 n5 @( Z
  44.                   .Utility.PolarPoint(Var点, _
    ! l1 O5 p0 W% K9 a# k* ~
  45.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))" c* X5 n; b- I9 y/ a! F
  46.                             - w. [  Y) E. A8 X( A6 x( Y, e! J
  47.                 '辅助圆半径增大一个增量单位
    $ u0 P, I4 t$ j0 [/ ?- t# _; j% t6 d
  48.                 Obj圆.Radius = (Lng相邻顶点间计算分段数量 * Lng顶点循环变量 + Lng计算分段循环变量) _
    4 O# @5 j: ^% P1 W; V. i
  49.                   / ((Lng优化多段线顶点数量 - 1) * Lng相邻顶点间计算分段数量) _
    $ I% f2 R5 A# ~! ]
  50.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径
    ; M" N9 c" n7 w3 m' E% W
  51.                 ; ^4 |8 a! A3 j8 ]7 ^3 b' B
  52.                 '获得辅助直线与辅助圆的交点,即为本次循环要找的取样点
    3 ?+ n7 M/ j" v  f: Q; h
  53.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)
    ( P/ E! ]9 h0 K! h# n/ @
  54.                 " E8 a9 i9 V2 G6 C$ q# ?* m% Q
  55.                 '删除辅助直线5 }, x' Y  ~, k- C" W
  56.                 Obj直线.Delete
    & |, @! _- k3 l: _+ M' Q
  57.             Next. I3 o. F6 h" M1 m, Y
  58.             ( e# e1 X& [3 V( c8 D8 T
  59.             '记录顶点坐标
    - ~( G# }+ H$ r; L- \$ U6 u. C( ?
  60.             DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 2) = Var点(0): DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 3) = Var点(1)
    # r, Z2 y. p/ ^) I- f' o
  61.         Next% G3 [1 d. R: U9 S( r7 c
  62.         
    ! w; s  C- R: ~) y9 }3 Q
  63.         '画多段线
    4 Y6 a1 l6 @& u+ x9 B/ [
  64.         .ModelSpace.AddLightWeightPolyline DblArr优化多段线顶点
    ) Q0 J6 O# U7 j6 g0 j1 d1 W
  65.     End With
    8 T' ?% Q8 e; U: ^" e2 f
复制代码
发表于 2010-1-5 19:56:04 | 显示全部楼层 来自: 中国湖北十堰
好东西啊  高手
发表于 2011-4-13 22:22:17 | 显示全部楼层 来自: 中国安徽芜湖
超感谢,我们老师让我们做这个FLUENT,是一个二维离心泵的模拟,但是资料书,里面只是说由四段圆弧构成,就没有了,不知道怎么画!
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

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