QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 4485|回复: 5
收起左侧

[讨论] 水泵叶线画法

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

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

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

x
如图,中间红色线与内圆切线夹角为27度,与外圆切线夹角为45度,随R增大,夹角均匀增大,求其曲线画法!
1111.JPG
发表于 2009-5-23 15:00:45 | 显示全部楼层 来自: 中国辽宁营口
  1. 5 q/ ]9 [' x' i+ l0 i
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double$ o( x. g- G7 O: W+ ^% r+ M
  3.     Dim Lng样条曲线拟合点数量 As Long, Lng相邻拟合点间计算分段数量 As Long: `, D1 e* K& D! d; o7 I5 r0 @+ S
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant
    4 @8 P$ U- g8 d1 H
  5.     Dim Lng拟合点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double1 M: |6 P4 g5 M6 W, I
  6.     Dim DblArr样条曲线拟合点() As Double, DblArr样条曲线起点切向(2) As Double, DblArr样条曲线端点切向(2) As Double7 P; P: Y7 \. e! {& M6 G0 O# k
  7.     8 }/ O' e% \  e6 p: l, v7 m
  8.     '已知条件8 t5 n6 O2 V# _. a' N
  9.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 45  v9 d, I; U5 X; P  x4 V
  10.    
    6 P4 V$ A& k, s+ T
  11.     '设定曲线拟合点数量,通常不大于500,可根据情况自行更改
    / l/ Z7 ?# y+ G8 {7 O/ C
  12.     Lng样条曲线拟合点数量 = 101* g, ?! L1 [+ }
  13.     '设定相邻拟合点间计算分段数量,可根据情况自行更改
    * _' }3 x: W  v$ ^/ D
  14.     Lng相邻拟合点间计算分段数量 = 50
    $ c  P" S: q; Z: ]( l; s. B, F
  15.     '数值越大,曲线精度相对越高,但运行时间越长
    & f: E6 [9 l  T9 d" H6 n* \
  16.     & v) Z3 v. w9 Y; C2 d
  17.    
    . a( b' P$ j: G0 t8 ]
  18.    
    ! s& e3 }, n! z, Y7 K& F
  19.     '按拟合点数量重定义数组
    5 @4 S( e$ `& P  J# @
  20.     ReDim DblArr样条曲线拟合点(Lng样条曲线拟合点数量 * 3 - 1)( p( W) o8 Q$ Y2 d2 |! q7 [! R
  21.    
    , v9 O0 W% x# @2 j* O' ], B
  22.     With ThisDrawing
    6 I7 p0 ]6 m" a: v. r) g
  23.    
    8 j4 |6 l8 O5 E9 H1 F4 T# ]4 F3 {
  24.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改
    1 T  Y- ~. t9 d9 V9 O/ R
  25.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)8 ^3 N% v; U' s5 O
  26.         
    1 O4 y7 P- H7 k7 v
  27.         '复制圆,做为结果显示
      s" d. l7 p. D% n! E
  28.         Obj圆.Copy; E( {: _6 E3 s& \5 c: o
  29.         0 \7 {5 _6 S% @* T
  30.         '圆心右侧最小半径长度处为曲线起点' }5 Q, w  ]1 D
  31.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)
    / T5 J. d. P) B; B7 ~( a
  32.         1 T0 Y/ |/ o& {& B, I9 o8 {/ Z7 C' g  o% a
  33.         '记录曲线的第一个拟合点(起点)坐标' i5 V0 Z1 R7 s0 j: r; P# K
  34.         DblArr样条曲线拟合点(0) = Var点(0): DblArr样条曲线拟合点(1) = Var点(1)# Y; T% l& g4 I2 M  h
  35.         ; d; V" ~9 {$ D3 _4 S% ]2 e  o
  36.         For Lng拟合点循环变量 = 0 To Lng样条曲线拟合点数量 - 2
    ; U, f* j* Y6 Q& o$ W, [/ Z
  37.             For Lng计算分段循环变量 = 1 To Lng相邻拟合点间计算分段数量
      B! ]& a3 Z9 ]$ T0 Z% v
  38.             
    : J$ V% S2 Y; U  Z9 N  Z2 o# {
  39.                 '按半径计算夹角8 W7 {, E+ x0 I* d. D; Y
  40.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _
    7 X  h, D6 D  @( m) X
  41.                   + Dbl最小夹角( W/ \* Z. Q  W) E7 G) i
  42.                 9 s, S; y' S( {6 H' A1 k" g6 Z
  43.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点
    ) O4 J% |6 |8 s+ T% C" J2 ]5 T+ P
  44.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线( j. J$ `/ ^& Z' ?! [' n. [
  45.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _
    9 D% J2 z7 q% k1 ~' i7 M0 ^
  46.                   .Utility.PolarPoint(Var点, _
    7 p) H) E& v( C1 ]; W
  47.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))' F" Z4 D) a8 H* R+ T) ^+ O2 I
  48.                            
    6 C+ Z. Y( D, @5 D( x3 [! ?
  49.                 '辅助圆半径增大一个增量单位1 r5 b* d8 c0 u
  50.                 Obj圆.Radius = (Lng相邻拟合点间计算分段数量 * Lng拟合点循环变量 + Lng计算分段循环变量) _
    7 @, I$ h( t+ k& F0 \
  51.                   / ((Lng样条曲线拟合点数量 - 1) * Lng相邻拟合点间计算分段数量) _
    ' ]6 U& S+ c" h, Z  @# J, `
  52.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径
    ; i$ j8 B, ]: O6 Z8 x0 r5 \" Z
  53.                 , w" f" Q- r1 y2 f4 \- `, _
  54.                 '获得辅助直线与辅助圆的交点
    ! R( d/ h0 M) o' ~. h. @" O
  55.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)  C  o; R) \; F  v5 h0 @
  56.                
    / |& ]& ^$ O$ s5 M1 y
  57.                 '删除辅助直线
    2 K2 H' i0 |6 }! g) ~+ w* V
  58.                 Obj直线.Delete                        * L, h6 F2 Z5 P1 I% p  G+ [
  59.             Next
    . `6 J; F6 p( b6 W
  60.             
    8 V$ {% c7 m% R: ]
  61.             '记录拟合点坐标
    " Y/ [; L) J, y4 w
  62.             DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 3) = Var点(0): DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 4) = Var点(1)
    ( ?6 ]/ E8 g& R. N& Y( w& J: N6 b
  63.         Next
    + a) n8 z" D- C% O9 R# R: I) l
  64.                
    9 j4 u; [$ |: }" S0 M" e( u
  65.         '计算起点切向9 E7 |$ @+ Y, ~, ^# o! w9 i
  66.         DblArr样条曲线起点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))0 p' o- j  ]) k7 x; n
  67.         DblArr样条曲线起点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))
    0 s* u! u5 v1 _0 m! ~- E3 l0 }
  68.         ; w7 V8 Y6 _# U9 A8 g0 V
  69.         '计算端点切向
    - u$ \& v$ K( O# C, L5 i$ t
  70.         DblArr样条曲线端点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))' |% O* D3 X; h3 z9 W' ~
  71.         DblArr样条曲线端点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))$ S, L+ o6 Q: ~$ D' M2 G" H  y2 F
  72.         
    3 \# a) J" @) ?
  73.         '画曲线
    " e8 ~( Z& v' _" s/ c+ f9 {) z
  74.         .ModelSpace.AddSpline DblArr样条曲线拟合点, DblArr样条曲线起点切向, DblArr样条曲线端点切向
    # A1 ]  n2 D# m! Z; \9 ~
  75.     End With8 d- I5 s1 j. f* S; }6 D
复制代码
 楼主| 发表于 2009-5-24 10:13:07 | 显示全部楼层 来自: 中国江苏苏州
首先非常感谢版主的解答!9 `6 L- i( S" _' a+ W- R
如果改成多段线,该代码又如何修改呢?
发表于 2009-5-24 14:45:56 | 显示全部楼层 来自: 中国辽宁营口

回复 3# benwang 的帖子

  1. 0 |0 I/ r& {  R. ?
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double
    + [( j' B/ M" [6 L
  3.     Dim Lng优化多段线顶点数量 As Long, Lng相邻顶点间计算分段数量 As Long
    3 R: c: O2 h" E, O3 u
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant
    / e) H) X$ c& F. s
  5.     Dim Lng顶点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double- k; x& `3 I3 F6 w
  6.     Dim DblArr优化多段线顶点() As Double( w; V, k  m0 r+ A
  7.    
    ; h# ?5 B$ [( ^; Q$ P% E
  8.     '设定优化多段线顶点数量,通常不大于500% G3 s' R- K. f
  9.     Lng优化多段线顶点数量 = 1016 j9 w1 p5 D0 u0 f( h1 J; F
  10.     '设定相邻顶点间计算分段数量
    ) h1 X" o' Z9 ~: \, K  z+ B
  11.     Lng相邻顶点间计算分段数量 = 5
    & s" J6 {6 Q9 Y, i
  12.     '数值越大,优化多段线精度相对越高,但运行时间越长
    5 H* n2 o6 o8 i3 n6 t2 Z0 g4 y. F
  13.     8 `9 `2 j  @" L# s& Z  U
  14.     '按顶点数量重定义数组7 e' ^8 {( y5 P8 j
  15.     ReDim DblArr优化多段线顶点(Lng优化多段线顶点数量 * 2 - 1)9 l) i$ U1 V6 x9 R
  16.    
    6 n% K& S$ t* k0 l/ ~- g2 ~2 J
  17.     '已知条件0 a  X- F0 i) B$ C1 H; k. W3 l3 R
  18.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 456 b% |9 c$ \8 K2 I" B
  19.     - n- ~9 S, G% i$ x2 l+ L
  20.     With ThisDrawing
    " s" r/ e, {" B3 @, p" C
  21.    
    ; r6 W: f* q3 \
  22.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改* W. n# z/ B/ R* y% t  E. R
  23.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)
    . v3 f( G" E; R# B
  24.         
    - F+ ^7 x3 Y/ n) G; I  w
  25.         '复制圆,做为结果显示3 e) J3 ]* Z4 U* h2 E
  26.         Obj圆.Copy! @) m. K% e7 b6 Z
  27.         * ?5 Z5 m3 o$ |9 y
  28.         '圆心右侧最小半径长度处为优化多段线起点( r% H5 d+ o# s% \) U, _
  29.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)
    1 H, j' W/ X( Y& Y1 t, u- i
  30.         , c9 Y& l: [5 D$ _+ M, _
  31.         '记录优化多段线的第一个顶点(起点)坐标; {- J6 }/ z2 E( e$ F; e8 S2 g
  32.         DblArr优化多段线顶点(0) = Var点(0): DblArr优化多段线顶点(1) = Var点(1)
    4 O0 h, s: x% @
  33.         7 m0 @) L1 |6 m$ Z% E
  34.         For Lng顶点循环变量 = 0 To Lng优化多段线顶点数量 - 23 c6 f$ y1 w  z
  35.             For Lng计算分段循环变量 = 1 To Lng相邻顶点间计算分段数量
    " W( d; w% H( ~3 H5 h1 G6 w( L! G
  36.             
    ) W1 N8 d. {" X9 I* H
  37.                 '按半径计算夹角
    3 P, v% l2 K: w8 ]0 C4 A& m
  38.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _0 w# k. f( [& O1 J7 Q# d
  39.                   + Dbl最小夹角3 l; h% e" U$ \
  40.                 ( s) v: b! r* O  g) k; b3 s
  41.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点( h3 }! E6 V5 b4 y
  42.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线$ r8 I' L& H$ R9 E3 |- n( _. i! @
  43.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _8 Z- ~- n# |! M) |/ {( C
  44.                   .Utility.PolarPoint(Var点, _
    ; }! N8 T% j, i% e1 A; y+ X
  45.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))  M* p' R: X. b  n
  46.                            
    ) X' ?1 U' j/ u+ J& m9 L4 I
  47.                 '辅助圆半径增大一个增量单位
    8 x$ k0 O5 ]- l: O. ^, w1 T6 ~
  48.                 Obj圆.Radius = (Lng相邻顶点间计算分段数量 * Lng顶点循环变量 + Lng计算分段循环变量) _
    3 n$ C/ C0 F2 t. u% I
  49.                   / ((Lng优化多段线顶点数量 - 1) * Lng相邻顶点间计算分段数量) _
    / t2 W2 y; `  j; j+ \1 s1 a
  50.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径& x+ o# w$ ~& u! j, z
  51.                 - j* T  f+ X1 {' i+ g. I
  52.                 '获得辅助直线与辅助圆的交点,即为本次循环要找的取样点0 L/ h! R1 j% p2 |' J) M
  53.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)# {% `- {2 i% y% o+ m
  54.                
    ' L+ s" Q6 s0 L$ |8 `
  55.                 '删除辅助直线
    $ N3 V8 V2 p6 R  @
  56.                 Obj直线.Delete
    / r* }4 o- \1 i' s; \+ E, b
  57.             Next5 X4 u! ?! V9 x5 K& p" K! }9 ]
  58.             
    + t6 e' }: v$ `
  59.             '记录顶点坐标  \# n# i$ z$ f# M. C2 {
  60.             DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 2) = Var点(0): DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 3) = Var点(1)& {  ~! P4 M. ^4 h# X7 [' j
  61.         Next
    1 c2 _6 }' f% J. G
  62.         
    0 ~+ n7 u8 R; V
  63.         '画多段线3 |; A* r7 n8 y; h
  64.         .ModelSpace.AddLightWeightPolyline DblArr优化多段线顶点
    6 d( {. R. Z5 w0 `+ G( \
  65.     End With
    4 X9 ^* A, @0 N" j: W& b1 G
复制代码
发表于 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 )

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