QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
7天前
查看: 4410|回复: 5
收起左侧

[讨论] 水泵叶线画法

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

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

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

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

  1. + O: s* y+ v3 e7 `, I
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double
    4 M2 h) d! A& v" b  t' z2 u5 O% o
  3.     Dim Lng样条曲线拟合点数量 As Long, Lng相邻拟合点间计算分段数量 As Long
    3 @8 e7 |; x; K, f7 I
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant( g" R" x: F$ S" w# L% [0 b9 a
  5.     Dim Lng拟合点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double
    ) a, y5 X* `% x% o+ S1 o* I
  6.     Dim DblArr样条曲线拟合点() As Double, DblArr样条曲线起点切向(2) As Double, DblArr样条曲线端点切向(2) As Double
    ' b# c5 H. T: I( |" F" a6 o
  7.    
    " Z- n- v  b1 v3 h& n1 G5 c9 m
  8.     '已知条件
    / `( |4 [2 z2 M& W# U# [
  9.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 45
    ; m( A  _. X+ V- a2 R
  10.    
    / j+ e' B0 ?4 T/ r/ d0 ?8 H2 C  M
  11.     '设定曲线拟合点数量,通常不大于500,可根据情况自行更改" r: b$ z8 D. Y' p; u5 S
  12.     Lng样条曲线拟合点数量 = 1012 @' f4 E! }2 X
  13.     '设定相邻拟合点间计算分段数量,可根据情况自行更改( f' O$ G; |7 Q4 r, l
  14.     Lng相邻拟合点间计算分段数量 = 50" G" o1 v. x- `
  15.     '数值越大,曲线精度相对越高,但运行时间越长8 d/ F' z5 q6 G+ B" E
  16.    
    5 D3 D; o7 `/ A" Y( E0 j
  17.       z1 P  c* Q  N- M* A# w+ a
  18.     , q6 H/ V: T1 K$ P  r5 a
  19.     '按拟合点数量重定义数组
    & c6 o8 i: M3 E5 v8 I
  20.     ReDim DblArr样条曲线拟合点(Lng样条曲线拟合点数量 * 3 - 1)
    9 |8 \' Y; R: g4 Y+ c8 ?, I
  21.    
    6 ?- S5 q* m6 E- r9 T" A: h9 F6 z
  22.     With ThisDrawing* y! A- o. t: b+ x; k
  23.     " {7 P; i: D7 s1 U" e, W
  24.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改* e" k5 i  C; w' R2 Z$ D( s- k
  25.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)$ O! F9 g+ v' u# Q7 R8 D
  26.         
    ! I) S/ ?: S( Q. O/ `2 d
  27.         '复制圆,做为结果显示8 T; l1 L& e4 S7 ~+ Z' V& H  d
  28.         Obj圆.Copy& d( g7 G6 k* p8 `& @
  29.         + i" u. v+ f4 c8 J0 q) @
  30.         '圆心右侧最小半径长度处为曲线起点
    9 {9 S7 l! q/ v5 \3 L/ r
  31.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)) E6 m, H$ ^6 F( R- x% ?- f
  32.         
    3 v; I- q6 t4 Y4 U
  33.         '记录曲线的第一个拟合点(起点)坐标& A0 n; c; I) G+ _, ^
  34.         DblArr样条曲线拟合点(0) = Var点(0): DblArr样条曲线拟合点(1) = Var点(1)" p" A4 ]. h, `$ x
  35.         
    & H- i& S* K1 u! ]) Q4 H
  36.         For Lng拟合点循环变量 = 0 To Lng样条曲线拟合点数量 - 23 B5 f4 ?* H4 ~& [
  37.             For Lng计算分段循环变量 = 1 To Lng相邻拟合点间计算分段数量
    & }% d3 a  ?' Y" T
  38.             8 P$ N0 H7 }( u3 b0 J4 p
  39.                 '按半径计算夹角
    5 Q4 I! |4 ^7 i* P2 j0 E3 j4 [" I: X
  40.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _. X2 J/ S' L3 h4 u
  41.                   + Dbl最小夹角; G4 R# F1 ?6 Q1 I$ E3 p  }
  42.                 5 e( i: I% k! a$ Z$ e& E. f( Q
  43.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点
    " |6 s5 {" v/ v3 [" h5 _, Z, S
  44.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线! w3 w$ g$ N& Q! C$ W9 P
  45.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _% S! x. d+ y) d0 n1 G/ `/ s
  46.                   .Utility.PolarPoint(Var点, _, O% y7 a" Y# X9 o  V8 Y
  47.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))  b$ o) }: n# e! x; Y% z
  48.                             % b# U( |! l- m( d& i) {4 d
  49.                 '辅助圆半径增大一个增量单位
    ! s0 m6 M: l: l" t* h( C! {
  50.                 Obj圆.Radius = (Lng相邻拟合点间计算分段数量 * Lng拟合点循环变量 + Lng计算分段循环变量) _6 E7 g) x8 R6 z0 ?: H
  51.                   / ((Lng样条曲线拟合点数量 - 1) * Lng相邻拟合点间计算分段数量) _
      f7 e9 {! {9 c, w5 w  Z7 c, @
  52.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径. L$ t2 m, B( u; @
  53.                 8 @" B( r8 e0 |1 k+ |- ^" r- q
  54.                 '获得辅助直线与辅助圆的交点
    $ j6 |2 i7 e, }2 Q1 b5 S
  55.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)- b0 _5 B6 E9 F; ?
  56.                 " `* t. M$ o" E. f7 e
  57.                 '删除辅助直线# x- G: l& T& H# @
  58.                 Obj直线.Delete                        
    / u4 _: u8 }$ r2 u
  59.             Next* h: }. W& }/ J8 ]) V- ?7 L
  60.             4 d4 Q  @9 |4 O4 W
  61.             '记录拟合点坐标
    0 k/ O( X9 U, k# r6 B# f" G
  62.             DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 3) = Var点(0): DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 4) = Var点(1)
      x+ A5 b. l9 D7 Q' F3 k
  63.         Next$ b) ]# z% P% {
  64.                
    % f0 o) u$ O4 {# K! ?. E; r
  65.         '计算起点切向' |, u( U$ H& d- f  [, w4 }
  66.         DblArr样条曲线起点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))* [* M' j- a) u- r$ _9 i
  67.         DblArr样条曲线起点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))% [* G. v* f" W; K; p' i
  68.         3 @7 @9 L! f# l7 g2 \8 a$ T' @
  69.         '计算端点切向
    ' b4 a) J+ m, r$ [1 i8 Y
  70.         DblArr样条曲线端点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))* {+ t& P1 n0 X9 h' S7 p9 t
  71.         DblArr样条曲线端点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))" j$ [7 v4 t4 R- p
  72.         
    # ], r" s6 z- a4 v
  73.         '画曲线
    / |- V  e) o  [
  74.         .ModelSpace.AddSpline DblArr样条曲线拟合点, DblArr样条曲线起点切向, DblArr样条曲线端点切向# [. _7 H0 m# A# y
  75.     End With
    . `# n  Y( Y# I9 b& b$ K  K; E. E
复制代码
 楼主| 发表于 2009-5-24 10:13:07 | 显示全部楼层 来自: 中国江苏苏州
首先非常感谢版主的解答!+ q9 J1 J8 `* ~. o
如果改成多段线,该代码又如何修改呢?
发表于 2009-5-24 14:45:56 | 显示全部楼层 来自: 中国辽宁营口

回复 3# benwang 的帖子


  1.   z- I, H9 @4 u' K7 f9 h
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double4 ]8 |. f- [: x7 G" y
  3.     Dim Lng优化多段线顶点数量 As Long, Lng相邻顶点间计算分段数量 As Long
    ! c; K7 E5 e: n- Z7 a9 |
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant
    8 K  }& O# D4 u, O! r
  5.     Dim Lng顶点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double( R" W7 o: ~3 n
  6.     Dim DblArr优化多段线顶点() As Double
    # b! b% e+ l' ^+ P4 m  Y
  7.     & o- t$ s5 \. w, y$ h2 m; }; H
  8.     '设定优化多段线顶点数量,通常不大于5000 V7 o6 W8 |4 n& q8 e
  9.     Lng优化多段线顶点数量 = 101
    # Z6 ]4 d8 N9 Q) e* T
  10.     '设定相邻顶点间计算分段数量
    $ w5 W$ V9 F& `2 ]1 x0 B
  11.     Lng相邻顶点间计算分段数量 = 5
    - R1 }* `4 @  r, t
  12.     '数值越大,优化多段线精度相对越高,但运行时间越长
    * B: W/ L( X' O0 K
  13.     $ v- {$ M3 ?. C) H* T
  14.     '按顶点数量重定义数组7 g( n( ^; o- ~9 m8 y% r* q- O, \+ G
  15.     ReDim DblArr优化多段线顶点(Lng优化多段线顶点数量 * 2 - 1)4 W! W- W, O- Q$ ^) ]
  16.     5 ]- S8 R6 {' j5 C, j+ }
  17.     '已知条件  q7 f: g' @) B$ a. C
  18.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 45
    + H& y2 G" o$ Z2 r# `
  19.    
    / I9 J4 p9 @0 k3 z0 ]
  20.     With ThisDrawing
    4 o# G, }: \6 L" f. K2 P
  21.     9 @% c0 {! \% b- |; x* _
  22.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改
      e$ }) v% ?9 x+ q2 o. d1 G3 _( j, y
  23.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)
    " O* C" f/ A) ]1 }
  24.         
    , Z& b) Y1 r9 Y" s# j7 f- N  v
  25.         '复制圆,做为结果显示
      n5 a' J) l8 y. r: Y/ s
  26.         Obj圆.Copy8 i& W3 R) ~! }. c; `
  27.         
    4 s! y8 X5 o4 T; y  e# a
  28.         '圆心右侧最小半径长度处为优化多段线起点
    - Z" Y& X2 B$ u4 I/ L
  29.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)) i2 H9 L' I$ ]; _; h3 M
  30.         
    - ^! I' R4 R* P) `' o* G, I
  31.         '记录优化多段线的第一个顶点(起点)坐标
    $ }. b1 R1 r6 A! e2 ]+ f
  32.         DblArr优化多段线顶点(0) = Var点(0): DblArr优化多段线顶点(1) = Var点(1)) [: T: c- t0 q- A7 u5 n. M
  33.         ! x# b7 s0 Y2 ?6 C$ R3 \
  34.         For Lng顶点循环变量 = 0 To Lng优化多段线顶点数量 - 2! X0 i8 d. z- M" _
  35.             For Lng计算分段循环变量 = 1 To Lng相邻顶点间计算分段数量( a# Y  J' \6 N  l# n
  36.             . o: m( `7 f* g8 g5 g
  37.                 '按半径计算夹角: F6 u9 W9 y/ y# [$ W8 l/ [" k
  38.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _
    7 t  y, y5 y) ?. m" U; ?- ?
  39.                   + Dbl最小夹角
    2 G! @; A$ t7 M2 O8 X$ W$ a
  40.                
    $ a( i: c$ Y" c1 R) F
  41.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点
    8 u- i" p; l+ R# H$ X3 [, O# X* v( ^
  42.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线) i3 B4 D4 ~& A1 K1 R+ W7 K
  43.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _5 c( r- L, {' ?8 Q' I
  44.                   .Utility.PolarPoint(Var点, _
    & o5 v, w, l) q$ @2 D' Y
  45.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500)). ]& d4 o- J- {/ @/ O3 x: b
  46.                            
    5 M* @" f; N  f3 M8 Y" }  B! s: p
  47.                 '辅助圆半径增大一个增量单位
    0 @. }0 y# m4 D. t( u5 A
  48.                 Obj圆.Radius = (Lng相邻顶点间计算分段数量 * Lng顶点循环变量 + Lng计算分段循环变量) _
    ( ?6 t- {% B9 I0 E3 I5 L3 M
  49.                   / ((Lng优化多段线顶点数量 - 1) * Lng相邻顶点间计算分段数量) _
    2 O; G# W- Q9 s: @, d0 o3 t
  50.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径0 {. S6 c  v+ e: z6 S1 ]
  51.                
    7 K9 a+ M7 B8 b/ L1 @" M; C  D
  52.                 '获得辅助直线与辅助圆的交点,即为本次循环要找的取样点6 f* v% O  f% p+ A# I1 H
  53.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)& V5 o: Z3 M' s! P
  54.                
    * G* I- H1 V  d  F3 c
  55.                 '删除辅助直线
    / c, V! ~& t; O2 R0 k, i* E
  56.                 Obj直线.Delete; T: O6 X6 \# ?( z, c' N
  57.             Next9 {( w$ l. l9 B8 ?0 C6 }) I
  58.             5 M/ `$ N1 ~$ l% @) f! ~: Z2 \
  59.             '记录顶点坐标
    7 i0 [) t: N* H. S5 J
  60.             DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 2) = Var点(0): DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 3) = Var点(1)
    9 S) G5 S1 g: @9 ?
  61.         Next
    * I& ~$ m7 R' @
  62.         
    8 S2 U) q. d2 X- f* U
  63.         '画多段线
    8 c" S$ a) m* |/ {
  64.         .ModelSpace.AddLightWeightPolyline DblArr优化多段线顶点- q1 b6 n6 _; V8 T
  65.     End With
    - X: y0 J1 e5 _6 s. s: X
复制代码
发表于 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 )

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