QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
11天前
查看: 4470|回复: 5
收起左侧

[讨论] 水泵叶线画法

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

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

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

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

  1. ! ?) s/ ~6 u$ V9 t! K; K
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double
    , f3 ?9 p( f3 R$ d) b, T2 K' m% I
  3.     Dim Lng样条曲线拟合点数量 As Long, Lng相邻拟合点间计算分段数量 As Long, @8 s6 @# z2 _+ Y. D/ D
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant; a4 A0 N1 G6 K( y
  5.     Dim Lng拟合点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double
    + W1 P* s$ X- q9 s4 u9 B; j0 o
  6.     Dim DblArr样条曲线拟合点() As Double, DblArr样条曲线起点切向(2) As Double, DblArr样条曲线端点切向(2) As Double$ H7 D% E9 `* k+ \# K- m
  7.    
    ' m' W. h& b! f! J; r
  8.     '已知条件
    , q8 e! t% ~6 ^5 [( y0 F6 a
  9.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 45& x  x! R# L; l: L  W
  10.    
    7 A4 [/ \1 i5 T* G* {0 ?2 b8 z. z1 _
  11.     '设定曲线拟合点数量,通常不大于500,可根据情况自行更改( G3 g: T' x; J2 v* `! q
  12.     Lng样条曲线拟合点数量 = 101
    0 F  y2 j4 H9 W7 g9 `( Z4 ?
  13.     '设定相邻拟合点间计算分段数量,可根据情况自行更改) n0 d' A7 ^+ M9 K& U  u. |0 [
  14.     Lng相邻拟合点间计算分段数量 = 50; b4 o& d) o" f  ]% O- x( ?3 g/ {$ I5 X
  15.     '数值越大,曲线精度相对越高,但运行时间越长
    $ |0 t+ D+ y/ o4 D( B6 \# l' U. _
  16.    
    : N4 t  e2 T8 b& f* q* |; P
  17.     & X1 _, X2 }2 `
  18.    
    4 j" w/ T$ w! Q- r+ k% g& _
  19.     '按拟合点数量重定义数组
    , w' v+ Z+ f: \: n
  20.     ReDim DblArr样条曲线拟合点(Lng样条曲线拟合点数量 * 3 - 1)9 j3 z; Z! ]( b) S/ T6 w; C3 M
  21.     8 j6 m$ h8 e- u3 \# c* a' `) j: S
  22.     With ThisDrawing. D  j$ c, H8 `$ D3 M
  23.    
    , F; X6 |/ o2 D/ X* x5 p* Q! E  [
  24.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改& b/ v4 y, t+ b
  25.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)
    . b2 h& G# A- X2 X! \8 Z
  26.         
    * X5 X( x9 I5 T7 r* Z/ X# o
  27.         '复制圆,做为结果显示
    # {% h1 @) p1 t7 p+ E3 K+ _
  28.         Obj圆.Copy
    0 F$ W$ \* S9 ~' w1 a$ Q. O
  29.         
    8 R0 w% N0 C, p7 i3 m  P
  30.         '圆心右侧最小半径长度处为曲线起点
    ) D2 c& Z& E3 Q& n
  31.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)6 Q, D- j# l4 f9 F; L
  32.           c5 c. u( C6 {+ G1 x' d
  33.         '记录曲线的第一个拟合点(起点)坐标
    : n6 p& g9 O4 m
  34.         DblArr样条曲线拟合点(0) = Var点(0): DblArr样条曲线拟合点(1) = Var点(1)
    ) t5 f0 x. Z) y  t$ D
  35.         
    : i# u6 B  y) s4 f
  36.         For Lng拟合点循环变量 = 0 To Lng样条曲线拟合点数量 - 2/ ^( k# ~. Y5 Z$ I7 k
  37.             For Lng计算分段循环变量 = 1 To Lng相邻拟合点间计算分段数量. E- D  P3 D! V, O. p
  38.             / J3 _% H1 @& T$ V, D3 c$ D& X! S
  39.                 '按半径计算夹角
    1 C1 d9 ^& B; w' h- k4 q
  40.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _
    ' b) ~2 K7 \- k% U
  41.                   + Dbl最小夹角" O6 K3 o0 z- c4 |
  42.                 # @0 ~* o4 s/ |( e9 q8 I
  43.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点
    & l0 k8 s" ?, L- m8 W
  44.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线  z/ p+ W' J% [8 J* P" R: W3 U% u
  45.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _7 ]' Q8 N3 @$ y* Y* M
  46.                   .Utility.PolarPoint(Var点, _
    ) ^+ `0 t! C9 C% M3 x' l
  47.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))' w* i! C  A& ?) t7 g. b. i, S
  48.                             7 g8 ~/ D! N& H
  49.                 '辅助圆半径增大一个增量单位
    - u3 D3 b: w; o% y: ^) x) w) r
  50.                 Obj圆.Radius = (Lng相邻拟合点间计算分段数量 * Lng拟合点循环变量 + Lng计算分段循环变量) _2 d- {# m6 F5 [0 @0 q2 t
  51.                   / ((Lng样条曲线拟合点数量 - 1) * Lng相邻拟合点间计算分段数量) _
    % S+ B  z) V) s7 p# f* b/ E. ]
  52.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径" |4 n" N/ j! T2 x9 n  V- {
  53.                 ) h6 W, N4 O* z( w$ s$ X$ B" a8 Y
  54.                 '获得辅助直线与辅助圆的交点  n' }1 Q2 d' [9 L
  55.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)
    % f7 F1 X$ z) M5 G
  56.                 & M% L. n. t5 {, s: s
  57.                 '删除辅助直线  [+ O2 ]3 ~. z" B  J
  58.                 Obj直线.Delete                        * l/ L$ C1 a# |+ g0 G$ [' P/ f
  59.             Next
    " P. Y( @4 K0 o1 A: a) K( F
  60.             9 O) {( c; e. c) J
  61.             '记录拟合点坐标
    $ H# n7 {9 y$ r1 O, B' d9 K+ X
  62.             DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 3) = Var点(0): DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 4) = Var点(1)7 b3 s" l) O6 s; ?# D3 x7 d2 g
  63.         Next
    7 @9 h# ]" c3 M  F, B; W: _
  64.                
    / B; k& Z* v9 ^8 Q# i
  65.         '计算起点切向
    6 y2 g0 X+ W& G: l
  66.         DblArr样条曲线起点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))- c0 u* ^9 p$ S) k4 `8 p- L
  67.         DblArr样条曲线起点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))
    / @. w8 z$ {: C" T) s1 a' ]2 N5 b
  68.         
      o4 H7 q% ]- s) o. M) k4 Q
  69.         '计算端点切向
    , _/ g% L- r# n) u, g
  70.         DblArr样条曲线端点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))
    1 \: n) h5 Y# N& ^' \, c0 H
  71.         DblArr样条曲线端点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))
    : r4 R; b' e% p
  72.         ; j; o3 h2 I* j" V4 R4 i
  73.         '画曲线9 T0 b: k  G* t9 B1 t
  74.         .ModelSpace.AddSpline DblArr样条曲线拟合点, DblArr样条曲线起点切向, DblArr样条曲线端点切向/ C, V) W4 x$ f5 q$ M. [2 T; C' O
  75.     End With$ C' E$ h* r, Y1 I  e6 _, f; d  q9 v
复制代码
 楼主| 发表于 2009-5-24 10:13:07 | 显示全部楼层 来自: 中国江苏苏州
首先非常感谢版主的解答!2 v% W2 m8 z, T/ j8 \$ ?% e8 k
如果改成多段线,该代码又如何修改呢?
发表于 2009-5-24 14:45:56 | 显示全部楼层 来自: 中国辽宁营口

回复 3# benwang 的帖子

  1. + {/ C: J; H' d8 z' V% Q0 J1 U& ?; g
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double9 X% w* v, A& I
  3.     Dim Lng优化多段线顶点数量 As Long, Lng相邻顶点间计算分段数量 As Long
    1 @( Y0 e& ?1 ^. _; y# e* v
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant
    + {( f6 ]0 K( O" s
  5.     Dim Lng顶点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double
    ! W- K. ?5 o; i  c
  6.     Dim DblArr优化多段线顶点() As Double+ e% H% X) n! T# ^* S) D
  7.    
    4 y% [8 N) `; \) W- _
  8.     '设定优化多段线顶点数量,通常不大于500" w3 ^' L* j: _9 l# w  ^
  9.     Lng优化多段线顶点数量 = 1019 r/ q" G3 H8 k# k  G8 A
  10.     '设定相邻顶点间计算分段数量
    2 O8 e. I% I6 ~2 ~4 z+ ^" D
  11.     Lng相邻顶点间计算分段数量 = 5! P3 n1 U" g& s
  12.     '数值越大,优化多段线精度相对越高,但运行时间越长: O3 n: q8 e+ j* v3 i7 c1 p, c
  13.     0 {, V% _9 H) O6 L
  14.     '按顶点数量重定义数组
    , T1 q- W6 U+ d7 |- J
  15.     ReDim DblArr优化多段线顶点(Lng优化多段线顶点数量 * 2 - 1)+ O! `/ J) W* Q5 Q5 d
  16.    
    ) c" E$ g; K7 p! B+ g0 Y
  17.     '已知条件
    ! m2 }1 ?. Y* t. t
  18.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 45' g  j0 \8 d3 I! X8 K
  19.    
    4 `$ p" M& N/ r5 a
  20.     With ThisDrawing
    ) {8 `" J) A9 u7 X
  21.     / K1 X- s, X7 Y- o; Y" c
  22.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改6 W, J8 D+ i( _* O& ]! b
  23.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)  u- g6 ]; ~- n" n; i1 ^' X
  24.         & j/ p+ \" A# c& B# U3 _
  25.         '复制圆,做为结果显示: R- Z: k+ a* Z  f
  26.         Obj圆.Copy
    1 k, X' ~3 @+ A& v& u8 k. c1 X
  27.         $ c8 y) u: p2 G
  28.         '圆心右侧最小半径长度处为优化多段线起点7 a; s! V+ Z" U$ d) z
  29.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)
    $ C( |) a1 m3 d" v% D
  30.         
    / ~6 x  h7 |' E
  31.         '记录优化多段线的第一个顶点(起点)坐标
    , f0 F% i+ e1 ^# h6 Y/ ?8 Z1 N
  32.         DblArr优化多段线顶点(0) = Var点(0): DblArr优化多段线顶点(1) = Var点(1). o7 ]9 c% C. g0 q" f: d+ ^* a* j
  33.         
    $ F) P, l6 \+ k! K( F- G  T5 i( J
  34.         For Lng顶点循环变量 = 0 To Lng优化多段线顶点数量 - 2
    1 |3 P' t7 S: \7 p# O5 N" A
  35.             For Lng计算分段循环变量 = 1 To Lng相邻顶点间计算分段数量
    # D7 d( |; V7 P; n5 n$ [  j
  36.             , f) u4 u+ @3 Z
  37.                 '按半径计算夹角9 [2 X. Z& {3 x+ K
  38.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _
    + L0 g# L# `( q3 `6 ]" p$ X
  39.                   + Dbl最小夹角# H& @' {* g# E7 U& C
  40.                 8 U' I7 s0 m' e
  41.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点" U+ O) L$ w9 v" O
  42.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线1 b8 H5 ?; x: d
  43.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _9 B0 x' N- H- o( i9 v, s1 d
  44.                   .Utility.PolarPoint(Var点, _" N' a# g1 E$ g
  45.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))
    % k& Y% S& i7 \( |3 @5 h
  46.                            
    ) K( y6 J# ~* v% B% F
  47.                 '辅助圆半径增大一个增量单位- Y! [! h4 [+ c6 s
  48.                 Obj圆.Radius = (Lng相邻顶点间计算分段数量 * Lng顶点循环变量 + Lng计算分段循环变量) _/ ]" p# K, }2 r" d) ~* v. a
  49.                   / ((Lng优化多段线顶点数量 - 1) * Lng相邻顶点间计算分段数量) _0 _) m( l4 p) S9 W+ g
  50.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径
    # l9 I7 s  p( K/ o
  51.                
    - q  |2 V) v. c# \8 h" h
  52.                 '获得辅助直线与辅助圆的交点,即为本次循环要找的取样点
    # q; Z" {+ ~; c' ~8 u* P7 M# a1 w8 c
  53.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)
    8 ?' V  y4 Q; ]7 c$ b: Y5 ]
  54.                
    % o8 k7 x/ E3 F% Z* _1 }
  55.                 '删除辅助直线
    9 q: Y6 I$ {+ h
  56.                 Obj直线.Delete3 z$ u, `- W6 z% X& D5 L
  57.             Next( R/ j! \$ Q6 r* P; e6 f
  58.             * K+ b- M/ b, v  K
  59.             '记录顶点坐标5 Z" e5 W: e- e$ d
  60.             DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 2) = Var点(0): DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 3) = Var点(1)
    & d9 R5 l8 o4 O
  61.         Next1 x' ^& d" P# C1 l8 u
  62.         
    1 u/ m/ G( l% q
  63.         '画多段线
    % z% s: J3 J6 J, [' m2 n* C1 x
  64.         .ModelSpace.AddLightWeightPolyline DblArr优化多段线顶点
    ) w/ v, W2 N* x$ m
  65.     End With* O+ r4 X& @) c, e
复制代码
发表于 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 )

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