QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

[讨论] 水泵叶线画法

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

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

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

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

  1. % t; |% V4 [4 d( L( o+ x
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double
    2 t8 d; R2 R: k* [9 m
  3.     Dim Lng样条曲线拟合点数量 As Long, Lng相邻拟合点间计算分段数量 As Long
    - R0 ?, T# f( [! `' ]2 W' M3 A
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant
    ( v& z. d  z: f: G# ]* ]. q
  5.     Dim Lng拟合点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double
    # A% T5 o& w9 g. N9 H
  6.     Dim DblArr样条曲线拟合点() As Double, DblArr样条曲线起点切向(2) As Double, DblArr样条曲线端点切向(2) As Double
    / b4 I9 k% V6 v. d
  7.    
    6 t0 w4 i& p+ n( z" _; |$ }9 f
  8.     '已知条件! b9 [3 M$ R6 O5 j; o) {# F
  9.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 450 {% w/ Y: e  B
  10.     1 D0 d# S: ~- f% o8 S
  11.     '设定曲线拟合点数量,通常不大于500,可根据情况自行更改* O* \1 A7 f9 C& ~9 x9 S" U
  12.     Lng样条曲线拟合点数量 = 101( V* j+ o4 O0 e! f( Q
  13.     '设定相邻拟合点间计算分段数量,可根据情况自行更改: U( v1 b, [" k: I
  14.     Lng相邻拟合点间计算分段数量 = 50$ t# j$ k7 b% v6 C3 H1 |/ D
  15.     '数值越大,曲线精度相对越高,但运行时间越长" ~5 p! j. t( O2 w* N9 ?# r
  16.    
    . E6 z* o" ^$ S( x0 i6 y
  17.     + O/ z. Z6 `. t( h; x& `5 O8 w( S
  18.    
    5 v6 m# z* b3 [' l6 D. U
  19.     '按拟合点数量重定义数组
    # _$ w. Y& ]' I0 e/ R
  20.     ReDim DblArr样条曲线拟合点(Lng样条曲线拟合点数量 * 3 - 1)
    / E' b3 \' U3 O* x. p$ r& }! h
  21.    
    ( |. t5 A( T/ b* d& O
  22.     With ThisDrawing
    8 _+ K  |! x7 F
  23.     ! ~: _! F; P& T: C4 w
  24.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改
    # ?* S6 l6 C1 e) ?3 F7 C
  25.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)+ h3 G0 w( W7 V! G, |4 _, h2 s
  26.         
    0 R9 X3 s! V5 G. h
  27.         '复制圆,做为结果显示
    ( M; a6 ~# w/ e; {2 m
  28.         Obj圆.Copy7 I* S6 P, z) n6 C  N) e
  29.         1 R/ J8 F- S/ ?
  30.         '圆心右侧最小半径长度处为曲线起点
    ( l) H; t' L$ [6 R
  31.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)( t3 {0 v1 {- w+ m, w  q0 r& P
  32.         
    5 G' ^$ G/ b( C8 F
  33.         '记录曲线的第一个拟合点(起点)坐标0 I/ a$ P, E" `; u- x  V" r
  34.         DblArr样条曲线拟合点(0) = Var点(0): DblArr样条曲线拟合点(1) = Var点(1)
    * A1 |# H( h* z
  35.         
    + n! {; W; a4 s
  36.         For Lng拟合点循环变量 = 0 To Lng样条曲线拟合点数量 - 2
    ! @& Q/ T5 i7 I, Y8 C6 Y
  37.             For Lng计算分段循环变量 = 1 To Lng相邻拟合点间计算分段数量
    + y% v' }: a( u8 i& A; [3 }
  38.             . b/ U; e/ t/ y* V$ d3 E- q! F6 i
  39.                 '按半径计算夹角
    8 F0 Y: n$ F/ }( i- _! ]3 w' S: e
  40.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _1 X3 R; j( v3 n5 j8 _/ }8 }
  41.                   + Dbl最小夹角
    & A" h$ `: m% x' M2 G# J
  42.                
    : I' ]+ P( i5 d( T) K/ k
  43.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点5 J8 K1 s/ l  e6 }# X: v; y/ F: \% o
  44.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线  Y* K* b: A/ m  k$ X" L+ z
  45.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _; x0 m9 n; J9 U' [  U
  46.                   .Utility.PolarPoint(Var点, _% w' y2 b3 ^5 r6 q3 H* L2 N. a$ M
  47.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))
    7 C! F* C, _1 q$ a
  48.                            
    , T8 g+ _5 f* T2 q4 s: S3 p% f
  49.                 '辅助圆半径增大一个增量单位) |6 t- I2 s+ n3 t' e' R  f
  50.                 Obj圆.Radius = (Lng相邻拟合点间计算分段数量 * Lng拟合点循环变量 + Lng计算分段循环变量) _+ N# x; u% M' t4 `' R, G
  51.                   / ((Lng样条曲线拟合点数量 - 1) * Lng相邻拟合点间计算分段数量) _
    8 A# s  n9 D& E, {" I. r
  52.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径
    " T1 A( D9 v6 L, j( r& h
  53.                 ) o9 E/ o, M$ H4 x% P7 E  W
  54.                 '获得辅助直线与辅助圆的交点+ @* B9 k' _$ v: {( m
  55.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)6 h4 f# R: |! ~+ D& I3 _
  56.                 & E: D  g" w  Z; C4 P. _
  57.                 '删除辅助直线" Z% n' ^! a; ^. V: S
  58.                 Obj直线.Delete                        
    0 t9 j& T! R0 C
  59.             Next9 z0 g* R: D# q7 ~! L: C
  60.             6 k. f& C5 H, A& Z
  61.             '记录拟合点坐标9 k$ o- I, J7 s9 Z$ J% t* J
  62.             DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 3) = Var点(0): DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 4) = Var点(1)
    ) n8 F; Q  J+ }- e3 x3 p
  63.         Next* `$ q7 Y: K$ d! ?
  64.                
    1 N- F) e% ~8 R. |+ k
  65.         '计算起点切向4 J$ h6 ]& o9 G2 F# u2 E
  66.         DblArr样条曲线起点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))
    ; h9 v2 q+ j$ I) m$ x
  67.         DblArr样条曲线起点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))/ e, ^5 V' J+ V$ U
  68.         - Q( u2 n& M9 J& [& ~1 s; o/ k
  69.         '计算端点切向8 x% h1 R: N: |. v
  70.         DblArr样条曲线端点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))
    ; ^- O& @+ s1 ^4 a4 j6 [2 b
  71.         DblArr样条曲线端点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))* O  J- |7 K' c6 q
  72.         ( L( `% f/ d2 _( {
  73.         '画曲线% d5 D4 }" ]( }; ]
  74.         .ModelSpace.AddSpline DblArr样条曲线拟合点, DblArr样条曲线起点切向, DblArr样条曲线端点切向2 _" H; m* K2 O6 g$ V
  75.     End With
    ) u; d. M2 y. |5 R- U& D
复制代码
 楼主| 发表于 2009-5-24 10:13:07 | 显示全部楼层 来自: 中国江苏苏州
首先非常感谢版主的解答!7 V% o: d' T$ t$ Z; E
如果改成多段线,该代码又如何修改呢?
发表于 2009-5-24 14:45:56 | 显示全部楼层 来自: 中国辽宁营口

回复 3# benwang 的帖子


  1. 1 K. q% p# F8 Y" }: y: N1 j3 e
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double5 j, M- z: G' Z' H% _1 ^! @4 Q4 R
  3.     Dim Lng优化多段线顶点数量 As Long, Lng相邻顶点间计算分段数量 As Long
    + M# S  s0 K* w) L' m
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant( b5 b/ D4 |7 C1 X8 T/ u$ ~% N
  5.     Dim Lng顶点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double; Q# a1 [/ H$ w( k
  6.     Dim DblArr优化多段线顶点() As Double
    4 C: Y% ^8 g6 a, z9 J- J
  7.    
    6 a9 ^3 R6 g9 |! |; X4 d
  8.     '设定优化多段线顶点数量,通常不大于500
    2 C* O' i2 J3 ]% V" @# q
  9.     Lng优化多段线顶点数量 = 101
    # T! W+ t% H2 Y
  10.     '设定相邻顶点间计算分段数量0 H+ T# c/ {. Y2 P* S  m
  11.     Lng相邻顶点间计算分段数量 = 5
    1 \- y: b- S" Z
  12.     '数值越大,优化多段线精度相对越高,但运行时间越长9 n! b4 P0 V7 M- R2 u2 }
  13.    
    $ X1 b- x6 W  m! Z. H0 k! X
  14.     '按顶点数量重定义数组
    1 k( o/ ]2 T; Q/ U8 O9 V
  15.     ReDim DblArr优化多段线顶点(Lng优化多段线顶点数量 * 2 - 1)* k3 i+ l( a# Z7 @7 e8 V- a
  16.     2 u2 z9 J2 r! N* r$ R: K0 _/ \* _
  17.     '已知条件
    9 `" p' j, e% r
  18.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 45, A( d4 q; x& ~- q
  19.    
    % p% C8 }& w8 ~2 Z7 i
  20.     With ThisDrawing' ]% n4 a$ A9 Y8 N7 ~, G5 L5 ^
  21.     9 V; x( V; {9 J3 U/ m
  22.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改  H) N  l; w% L
  23.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)
    0 Q* f. j  G3 G$ J. X) ?( U
  24.         
    3 T, u" z4 U. y# }' z8 e6 m
  25.         '复制圆,做为结果显示
    : @! g$ V. S1 @' t1 F
  26.         Obj圆.Copy
    1 x+ r" [. u/ X
  27.         
    - ]4 {& @' Y% `0 `' x' p$ d9 U
  28.         '圆心右侧最小半径长度处为优化多段线起点5 B8 s8 Y5 h4 S9 y# G; ^( d! w
  29.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)
    9 n0 e% N+ {+ g1 j! K
  30.         
    6 P" s1 ~# v, w! T
  31.         '记录优化多段线的第一个顶点(起点)坐标
    7 U; ^+ n% e- N  _5 U
  32.         DblArr优化多段线顶点(0) = Var点(0): DblArr优化多段线顶点(1) = Var点(1)' s) [& d( T- o% E
  33.         
    8 f# X5 t; ]7 R8 n
  34.         For Lng顶点循环变量 = 0 To Lng优化多段线顶点数量 - 2
    & F# x) c* Z1 ?, I( F! F- R
  35.             For Lng计算分段循环变量 = 1 To Lng相邻顶点间计算分段数量
    + A/ h4 M2 _$ [0 }
  36.             , e8 Y; m( u) W) c. Y: x& ^5 _  w! z! O
  37.                 '按半径计算夹角9 U/ S; D& Y, `/ I7 D
  38.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _
    ( L( L& h. |' Y6 r( r, b! o( H
  39.                   + Dbl最小夹角# ?7 M' q+ X( }$ w
  40.                 ' N! v0 {# p& a7 z: j1 @, ?
  41.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点
    % p% x5 w( L( p4 P+ L, u% Y; g
  42.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线
    1 P: q7 `, r1 T0 b5 w/ g
  43.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _7 ?8 G1 P# v# m& y. u
  44.                   .Utility.PolarPoint(Var点, _% {8 O  r* N- \/ [: S! D% f
  45.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))# T0 K. D  }. o6 C: I5 X& L
  46.                            
    ' f& ]( T1 P3 f3 p$ F( L* Q9 @9 V# Z
  47.                 '辅助圆半径增大一个增量单位  M/ x- p; ~7 H
  48.                 Obj圆.Radius = (Lng相邻顶点间计算分段数量 * Lng顶点循环变量 + Lng计算分段循环变量) _
    + k1 i' r1 G; ]$ U1 E
  49.                   / ((Lng优化多段线顶点数量 - 1) * Lng相邻顶点间计算分段数量) _
    : T  Y. X2 \; B6 g
  50.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径3 ^. Z$ t* r4 m$ D, P, X) i9 F: d
  51.                 , C' V! C5 q3 V9 F7 J. x
  52.                 '获得辅助直线与辅助圆的交点,即为本次循环要找的取样点, F+ F: O% a6 X0 M+ W) ~
  53.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)
    / ~) c3 V1 R9 I. d; C" y
  54.                 0 p# ^; h( n- `5 |% X
  55.                 '删除辅助直线
    ! y  _5 T$ W5 B' e9 z
  56.                 Obj直线.Delete+ l# W: o  S3 `0 V
  57.             Next
    $ U+ ^% k! X8 K- U
  58.             : N( }/ m" e- T9 t6 ^; j" ^7 z
  59.             '记录顶点坐标2 F1 v: k: u8 d* H3 O
  60.             DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 2) = Var点(0): DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 3) = Var点(1)% _* h# e: @& Y. B4 K$ b% t
  61.         Next9 D: y3 r2 y- ?& I+ s2 l
  62.         
    4 X: m3 c' I( G1 {5 {3 A) X
  63.         '画多段线
    5 S* g# A" c6 ?
  64.         .ModelSpace.AddLightWeightPolyline DblArr优化多段线顶点! l" J- j7 k. j2 P- S
  65.     End With! C# V7 @! I- ]* @* j
复制代码
发表于 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 )

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