QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

[讨论] 水泵叶线画法

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

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

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

x
如图,中间红色线与内圆切线夹角为27度,与外圆切线夹角为45度,随R增大,夹角均匀增大,求其曲线画法!
1111.JPG
发表于 2009-5-23 15:00:45 | 显示全部楼层 来自: 中国辽宁营口
  1. 3 D6 s8 \1 H& ]7 n
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double, w. Z- W+ s: v# D$ s
  3.     Dim Lng样条曲线拟合点数量 As Long, Lng相邻拟合点间计算分段数量 As Long* m. j; n8 I/ e/ E, _: k# Z5 ~# L
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant
    4 X. |$ Y3 i+ ]0 N3 G# T2 c8 V5 u/ O
  5.     Dim Lng拟合点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double1 O  G$ t" j- n6 T: P/ ~* _* g
  6.     Dim DblArr样条曲线拟合点() As Double, DblArr样条曲线起点切向(2) As Double, DblArr样条曲线端点切向(2) As Double. t, {; m% P+ S9 ]
  7.     1 ]3 }& T- x# \8 {2 K0 b$ D
  8.     '已知条件
    % Q4 p5 o0 u9 O* D6 g
  9.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 45
    ) U# _7 g# ~  v2 ^$ }0 d( x
  10.    
    / v1 B& E) C& a4 K/ V$ T$ j
  11.     '设定曲线拟合点数量,通常不大于500,可根据情况自行更改
    & A. T* t; \$ `: O# O
  12.     Lng样条曲线拟合点数量 = 101
    & f- _- o* u# O4 b5 `9 t
  13.     '设定相邻拟合点间计算分段数量,可根据情况自行更改
    & F1 ~1 R# T  R8 d- }
  14.     Lng相邻拟合点间计算分段数量 = 50
    : X7 ^; l3 |* t4 ^6 L( c
  15.     '数值越大,曲线精度相对越高,但运行时间越长, P/ B. X' E% Y* m) z
  16.     - L" C3 \& \* u- u
  17.    
    ) l  W% g2 T; {8 J& V4 Y4 O
  18.    
    0 t) C! p# H; Q- }' X: j+ [
  19.     '按拟合点数量重定义数组9 U9 `0 n% }  z4 O
  20.     ReDim DblArr样条曲线拟合点(Lng样条曲线拟合点数量 * 3 - 1)4 q) x0 j6 m5 X
  21.     6 n" ^9 a1 P2 s8 s, s2 Y
  22.     With ThisDrawing
    ; `$ G$ ]* s: K3 w) c4 K
  23.     % \& }9 n# r& T& {
  24.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改
    8 M$ f; p6 u: J4 W6 [9 U" R
  25.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)
    . B& @: Q# b8 {7 W6 Q; ]
  26.         0 z9 v# s& k" t  }4 D
  27.         '复制圆,做为结果显示
    ) C8 s& p7 q1 G/ ~
  28.         Obj圆.Copy
    6 ]+ \9 F! _" U& }
  29.         
    * J8 V% t  Z- z$ R! I* L
  30.         '圆心右侧最小半径长度处为曲线起点; }9 [' b8 j: R8 `( o
  31.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)
    6 u8 v6 z0 ]& Q5 {* e; \8 O, m
  32.         
    $ `1 D7 o/ P2 n. A, R8 h
  33.         '记录曲线的第一个拟合点(起点)坐标
    6 _4 Q" S* Z! `8 G
  34.         DblArr样条曲线拟合点(0) = Var点(0): DblArr样条曲线拟合点(1) = Var点(1)! E& s* m; @. O: w7 D, P
  35.         
    ; J- k6 `# f  R2 n5 ]. K
  36.         For Lng拟合点循环变量 = 0 To Lng样条曲线拟合点数量 - 2+ `: i6 \: C: Y6 i+ j; v8 J
  37.             For Lng计算分段循环变量 = 1 To Lng相邻拟合点间计算分段数量& R% C. t5 V  U# X
  38.             $ @# G/ F! A" F, e! {% [0 s8 M; S& r
  39.                 '按半径计算夹角
    8 l* D) n- N" b- D1 n
  40.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _4 ?# v' a) b# o/ i3 k! p4 c
  41.                   + Dbl最小夹角* b' \4 S: F! }* w" T' h2 @
  42.                 & d# G1 ~" K5 M- F! @& ?
  43.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点
    ( c0 ^" e1 g- E
  44.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线
    # S, R6 `' j7 A' U" |- \7 y3 O$ t
  45.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _7 {, T$ ]9 q) N2 W; M" j
  46.                   .Utility.PolarPoint(Var点, _9 ~- e  g! W7 C  _; k$ I4 c
  47.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))" f# R: Q, r/ u9 E6 [/ l- p
  48.                             / d/ Z3 R1 y$ T9 m. ^% v5 q  i4 w  h
  49.                 '辅助圆半径增大一个增量单位; ^4 j" m. G, G  h* [" ]! f- a
  50.                 Obj圆.Radius = (Lng相邻拟合点间计算分段数量 * Lng拟合点循环变量 + Lng计算分段循环变量) _
    * T! F9 U, K7 L9 e  q
  51.                   / ((Lng样条曲线拟合点数量 - 1) * Lng相邻拟合点间计算分段数量) _
    , p0 n  s8 C" O+ @7 F# Y
  52.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径7 L) |% `6 k& h! B" J
  53.                 8 ?. G6 R. y  O
  54.                 '获得辅助直线与辅助圆的交点* L1 ^. W0 R- j$ K( G$ v# t) I
  55.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone), j5 f* k5 V  P, G2 T. f/ ?
  56.                 * L) k! O, o! ]. M- D8 B  ]5 f
  57.                 '删除辅助直线
    4 {8 P  w  e' o# T8 p9 v
  58.                 Obj直线.Delete                        ( b' W' x! c1 D: A$ M- e
  59.             Next
    . e' `# D5 \, ?; n& n
  60.             6 ]% P1 H+ R) E5 E3 Z& @- u- V
  61.             '记录拟合点坐标
    " n6 p5 V* R& Y( }/ f/ }2 Z) {
  62.             DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 3) = Var点(0): DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 4) = Var点(1); g4 o! V; D9 k* q
  63.         Next
    & h$ o$ L3 w6 W0 C2 ~3 y, t
  64.                
    $ X+ ]4 R) @) h6 ?( T" B7 D- b
  65.         '计算起点切向
    : m7 t6 b1 o5 ~  `6 P' o
  66.         DblArr样条曲线起点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))" x* R, T& c6 o
  67.         DblArr样条曲线起点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))4 Q% C2 r, |) z* E* ]
  68.         ' b; C! |0 q! I0 e& r# X
  69.         '计算端点切向
    ! D5 X5 O, ?# S
  70.         DblArr样条曲线端点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))3 f* h1 J8 c6 w  a% z4 A( W7 h* I
  71.         DblArr样条曲线端点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))" J4 P3 s, S" R$ [7 q- M3 q7 I
  72.         
    3 J; w2 u7 y: l9 B: V
  73.         '画曲线2 H- |" w  l4 ~
  74.         .ModelSpace.AddSpline DblArr样条曲线拟合点, DblArr样条曲线起点切向, DblArr样条曲线端点切向4 K3 F$ F  n3 `- K" [* }
  75.     End With+ `8 n3 |# o" `. K% d
复制代码
 楼主| 发表于 2009-5-24 10:13:07 | 显示全部楼层 来自: 中国江苏苏州
首先非常感谢版主的解答!% M* E0 @& \: M' b& m  b
如果改成多段线,该代码又如何修改呢?
发表于 2009-5-24 14:45:56 | 显示全部楼层 来自: 中国辽宁营口

回复 3# benwang 的帖子

  1. + D7 o: c$ B2 c% T$ r6 K: T; U) i
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double& S: j+ X6 R2 i2 ~5 d$ a, k/ [# k
  3.     Dim Lng优化多段线顶点数量 As Long, Lng相邻顶点间计算分段数量 As Long% _# o7 V' {) e- r
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant
    % V: d* {* p! }. F' R# J3 P
  5.     Dim Lng顶点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double
    " S" R5 [/ K: H. G# A7 a& [/ j7 h$ e
  6.     Dim DblArr优化多段线顶点() As Double
    ! S# _$ H: ~7 S# r
  7.     + P& r& g3 ~$ i  _
  8.     '设定优化多段线顶点数量,通常不大于5000 ?% ^: h' _# e* L) r) A7 ]# E+ \
  9.     Lng优化多段线顶点数量 = 101
    4 N* E$ o1 r3 d6 C* \8 ?
  10.     '设定相邻顶点间计算分段数量
    ' h) _* M/ C' |% c  e1 H( [- H- ]0 v
  11.     Lng相邻顶点间计算分段数量 = 5
    # y' c7 o, m; n" N1 C6 C6 s6 C
  12.     '数值越大,优化多段线精度相对越高,但运行时间越长5 r8 ~4 k0 f, q1 v. S' x
  13.    
    9 ^) m# b* y5 k8 w9 V
  14.     '按顶点数量重定义数组
    5 A* G) U1 p3 d/ l- U0 C
  15.     ReDim DblArr优化多段线顶点(Lng优化多段线顶点数量 * 2 - 1)! A4 [; d! F. B8 H9 {# o# q5 F
  16.     ! J0 u  A* S$ x
  17.     '已知条件, e2 c; j- A2 t+ m
  18.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 45
    ( U7 N: Y4 O- L4 O& p1 C3 g' U3 N! O
  19.     7 d/ h6 b5 s( o
  20.     With ThisDrawing
    5 l, N; x2 d( ]- [
  21.     : e& }" p# M9 Z
  22.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改
    2 i9 t; Q# D" `4 f- r+ ~+ m. R
  23.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)
    9 @9 ^. T- t1 k# ~3 V
  24.         
    ! R0 a3 D8 t7 t8 h. ?( ~4 F
  25.         '复制圆,做为结果显示; i0 r* b! D; g1 o. L
  26.         Obj圆.Copy3 U( l2 ~6 H2 A% O3 \! N
  27.           I! B3 p; s; u1 P% H7 |  J
  28.         '圆心右侧最小半径长度处为优化多段线起点: N' p( ^7 G% @* E8 ]
  29.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)
    + T: ^: C5 P  u. _. _# ]2 g
  30.         - s8 e, f1 L1 L0 @; b9 j" \/ Q
  31.         '记录优化多段线的第一个顶点(起点)坐标
    5 K6 B" a$ h/ d: ?7 j
  32.         DblArr优化多段线顶点(0) = Var点(0): DblArr优化多段线顶点(1) = Var点(1)
    , U* i* J. K4 e$ z/ g( B) H+ V4 o
  33.         * b. D" r( _1 n& ?. ~% W2 @
  34.         For Lng顶点循环变量 = 0 To Lng优化多段线顶点数量 - 2  ~% b& Y7 D0 j8 j) u6 a
  35.             For Lng计算分段循环变量 = 1 To Lng相邻顶点间计算分段数量, \; X- @8 `/ Y0 m* {5 S6 g; ]
  36.             ) K! V! J( n5 }% i* ^
  37.                 '按半径计算夹角6 v# i- _/ z! l
  38.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _5 C6 X8 M& K% g, A# n) {. `; z2 y
  39.                   + Dbl最小夹角
    5 j) k4 g: f7 M) _
  40.                 8 u% U: h; \3 V% g9 @
  41.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点
      u8 w" y& L2 A1 [1 ?$ j; e
  42.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线
    , n7 H) J5 g3 A+ p" w5 F" X8 j
  43.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _
    3 b- b1 @+ o, v6 X! |4 L4 X
  44.                   .Utility.PolarPoint(Var点, _
    % G2 J7 D9 R0 \* y6 F9 G* w
  45.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))
    & G" y' P1 V, {* {
  46.                             6 L. F# Q: ^3 F4 f; P
  47.                 '辅助圆半径增大一个增量单位" t9 _, o8 ]) P" Q4 E# Q9 Y
  48.                 Obj圆.Radius = (Lng相邻顶点间计算分段数量 * Lng顶点循环变量 + Lng计算分段循环变量) _
    , u- K4 b8 A* ?) h0 }( \
  49.                   / ((Lng优化多段线顶点数量 - 1) * Lng相邻顶点间计算分段数量) _
    ! s- F& d0 E  |/ O/ v4 P
  50.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径3 E* M- q8 p% E0 }8 v, u
  51.                 ; I3 G  ]% Q# J
  52.                 '获得辅助直线与辅助圆的交点,即为本次循环要找的取样点( x5 O; R$ [% g4 U0 a  n% i
  53.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)
    $ `* m: T6 _. M# `0 _4 K
  54.                 . {! |- z3 q6 R8 U" M' [" s
  55.                 '删除辅助直线% b3 o7 N3 Z2 B! x0 _2 ^. _
  56.                 Obj直线.Delete9 D) N7 M, Z, Z3 n2 @! l5 q# ?
  57.             Next
    # q% J2 |1 v  m
  58.             
    % N; A$ g2 j2 x# T. P, R
  59.             '记录顶点坐标
    - H1 R7 P4 G* ?4 z0 d
  60.             DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 2) = Var点(0): DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 3) = Var点(1)' ]6 W% e8 ^# J. d2 h9 J. D
  61.         Next1 Y& K% \1 O( d9 R! L5 n9 D; ]9 u
  62.         
    2 o. o- V* H9 q8 g+ _6 W
  63.         '画多段线; Q; B1 a) M8 a- m4 I3 ]
  64.         .ModelSpace.AddLightWeightPolyline DblArr优化多段线顶点* W: o, z. j* G$ F
  65.     End With
    # Y" C6 L4 L2 y5 i; F% V& K
复制代码
发表于 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 )

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