QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

[讨论] 水泵叶线画法

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

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

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

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

  1. , B: O$ s$ U" c$ N4 d3 J
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double: @8 D7 z4 Q+ e+ m' y
  3.     Dim Lng样条曲线拟合点数量 As Long, Lng相邻拟合点间计算分段数量 As Long5 ]" J" C( j( e6 Y, q9 s  e  X9 i2 ]7 c
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant. k* G! U2 p- ?; z! M4 ]
  5.     Dim Lng拟合点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double
    " Z% h$ Z, S: l6 n; C2 }0 b! ~* T
  6.     Dim DblArr样条曲线拟合点() As Double, DblArr样条曲线起点切向(2) As Double, DblArr样条曲线端点切向(2) As Double( |* ~2 d( M2 [: y
  7.    
    : j/ m- |7 ^. |2 X2 N6 G& y
  8.     '已知条件- z' ]& c* U1 P$ t2 k8 t
  9.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 45: d1 ~) r, V( h
  10.    
    $ m" ^5 t6 Y4 L  Y, j2 x# x
  11.     '设定曲线拟合点数量,通常不大于500,可根据情况自行更改
    4 [# U" O) O8 E+ ?' ~! S
  12.     Lng样条曲线拟合点数量 = 101
    ' b9 m2 G6 L8 y
  13.     '设定相邻拟合点间计算分段数量,可根据情况自行更改( X" ]  ?5 y6 }  y* K
  14.     Lng相邻拟合点间计算分段数量 = 502 W& j# b0 l  c$ c/ I8 y
  15.     '数值越大,曲线精度相对越高,但运行时间越长% Z* Y" v- I, c  k6 R
  16.     # T4 F) h* C8 B" ^6 {
  17.       X. ?- `' q# q% e% m2 x
  18.    
    * r9 Q: _; R* i8 |
  19.     '按拟合点数量重定义数组
    ; B! j# [. p2 c) L
  20.     ReDim DblArr样条曲线拟合点(Lng样条曲线拟合点数量 * 3 - 1)
    7 ~, _0 X9 l5 \3 t9 f* N
  21.    
    9 Z8 k3 R; i! S+ W2 ]# O2 N
  22.     With ThisDrawing
    5 n- c% n, [1 [$ d# p: \( D- Q
  23.    
    * O7 _- l+ F6 S3 [  ]2 @# ?! T8 D
  24.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改
    $ g# n* C  w( j6 @& n/ a  ]- |
  25.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)
      H4 A/ J8 U; t, q$ w  y; N
  26.         
    4 R- F  x0 U( s- C) J& f( B- o  x
  27.         '复制圆,做为结果显示) K5 U: `% D0 `. A1 G  D' Q
  28.         Obj圆.Copy8 j+ J4 G; ~* N5 U2 i% e5 W
  29.         
    , o1 i8 L  `) H
  30.         '圆心右侧最小半径长度处为曲线起点+ Q' f; d$ P2 w* r: U
  31.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)
    - V% @! r9 @' ^2 ?# {* _
  32.         " s) y5 E7 U  v5 {
  33.         '记录曲线的第一个拟合点(起点)坐标2 n; t* U' S$ c) ?, u
  34.         DblArr样条曲线拟合点(0) = Var点(0): DblArr样条曲线拟合点(1) = Var点(1)( A- C) H5 ^6 F1 J  |- p) D7 x
  35.         
    : |: i$ B/ A: G& x7 [6 ~0 ^
  36.         For Lng拟合点循环变量 = 0 To Lng样条曲线拟合点数量 - 2* k% u2 L$ z0 S, _2 h0 h; I
  37.             For Lng计算分段循环变量 = 1 To Lng相邻拟合点间计算分段数量
    4 Z" ?/ t. e) z" l# B
  38.             
    9 l1 `0 v$ f! ]% w' Y- _9 N" n
  39.                 '按半径计算夹角
    - Y8 e8 j' |: B+ V2 D
  40.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _8 X- U. X$ K3 i. x2 F- Y
  41.                   + Dbl最小夹角, `7 K: L) q3 T& R" _0 Q, u& E
  42.                
    ) L0 i+ U/ _: {) r* Z) i; m
  43.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点4 o' ]* }% H- D  Q" \; c
  44.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线  b' V1 ]# h, v9 Z5 t! n* ~
  45.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _6 z  [* Q; s' F1 J
  46.                   .Utility.PolarPoint(Var点, _
    & T; N1 q% {5 c3 C5 F2 b" F
  47.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))4 R# a  L7 a  p8 A' z. _$ `
  48.                            
    & K8 k! H1 ]6 K6 X/ k% G
  49.                 '辅助圆半径增大一个增量单位& N. h0 g2 Y) A# C& A' ?  O" M
  50.                 Obj圆.Radius = (Lng相邻拟合点间计算分段数量 * Lng拟合点循环变量 + Lng计算分段循环变量) _
    , Q5 O1 T* f" ^: M" c) W* I
  51.                   / ((Lng样条曲线拟合点数量 - 1) * Lng相邻拟合点间计算分段数量) _# O( B8 u6 m4 R  K$ c8 z0 I
  52.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径+ r$ g  n& y  }
  53.                   z9 b8 T. z" ?9 P$ A2 E
  54.                 '获得辅助直线与辅助圆的交点
    7 I6 R; m1 B; n: }
  55.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)
    9 e  \3 N9 e9 O* P8 o' X$ ^: X
  56.                 ( T% @0 I& f: n# k
  57.                 '删除辅助直线
    ) o4 \/ P* ?/ w& e
  58.                 Obj直线.Delete                        
    $ x" n- e7 B* ^7 t  Q. b
  59.             Next
    / t8 F, [: U- A' |
  60.             & ^; v+ F" Y3 N3 _  p7 v
  61.             '记录拟合点坐标! \' `, V5 n: O+ @4 K7 u8 s
  62.             DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 3) = Var点(0): DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 4) = Var点(1)
    " Z! I0 F7 `+ A5 y5 m! I, k
  63.         Next8 {( }4 }) A& ?
  64.                 * ]# m5 N! x' w4 h
  65.         '计算起点切向
    % S' j* G6 A3 m
  66.         DblArr样条曲线起点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))" N1 U/ v. G* ~) V9 z0 G
  67.         DblArr样条曲线起点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))4 v  H2 y. b! S% P9 y. q
  68.         8 t  s5 R, f, I$ u: b
  69.         '计算端点切向
      \7 i2 y' Q1 u
  70.         DblArr样条曲线端点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))6 D3 w0 d% ], U- W- f
  71.         DblArr样条曲线端点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))9 E! d0 G, d1 r# ^+ T9 i. S
  72.         # F8 ~9 g1 t" H- O& B: x" {2 g
  73.         '画曲线
    8 ~+ _  l( D9 u$ l0 ?
  74.         .ModelSpace.AddSpline DblArr样条曲线拟合点, DblArr样条曲线起点切向, DblArr样条曲线端点切向9 B1 \' G) O5 R2 K3 m
  75.     End With
    ( m1 @) m: e/ \3 x7 k) K' O
复制代码
 楼主| 发表于 2009-5-24 10:13:07 | 显示全部楼层 来自: 中国江苏苏州
首先非常感谢版主的解答!
: n) v2 U5 j. V9 o如果改成多段线,该代码又如何修改呢?
发表于 2009-5-24 14:45:56 | 显示全部楼层 来自: 中国辽宁营口

回复 3# benwang 的帖子

  1. * C8 t. U& u% F! K: k. j! D
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double, m+ a" h, I: n8 N% K6 I& H9 h
  3.     Dim Lng优化多段线顶点数量 As Long, Lng相邻顶点间计算分段数量 As Long
    : W1 g7 `' r8 c9 F
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant. n0 V4 R( C! k- n; X$ [
  5.     Dim Lng顶点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double
    2 T, c6 s* T1 `7 x6 V' |# K8 m
  6.     Dim DblArr优化多段线顶点() As Double
    / _  V  m, k1 o- \
  7.    
    # [& `& I+ F5 x0 O4 k4 o
  8.     '设定优化多段线顶点数量,通常不大于5001 N3 S+ N6 x5 m0 ?* F- R2 x
  9.     Lng优化多段线顶点数量 = 101: G/ x$ d0 q% n3 c* L7 [% F
  10.     '设定相邻顶点间计算分段数量
    . n8 V8 v8 b- q9 ^: r' |
  11.     Lng相邻顶点间计算分段数量 = 5; P, F6 S6 k' G" B) t1 |7 n
  12.     '数值越大,优化多段线精度相对越高,但运行时间越长
    5 p0 E( [$ o8 j6 X2 j3 H7 V6 J
  13.     . `) Z3 V( d* r7 N8 E  ?* d. U2 x: y. X
  14.     '按顶点数量重定义数组
    5 w# S5 d/ ~2 q( Q% o+ x& r8 m
  15.     ReDim DblArr优化多段线顶点(Lng优化多段线顶点数量 * 2 - 1)8 C) Y% C1 f" M! O+ D
  16.     0 k- Z. h! U/ T
  17.     '已知条件
    : h' \, \5 i5 i, |
  18.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 45! x5 X7 x) D! V7 [5 q: [
  19.    
    7 X6 R: f0 F# `2 n' V* H6 ^
  20.     With ThisDrawing
    . q: a# H7 v8 G2 _
  21.    
    # b8 t/ l8 Z" I
  22.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改
    ! j% P8 m- }- h! B: ]8 R2 `" m6 e
  23.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)/ Y* _' `6 v6 W) `4 z+ h% Q  X
  24.         
    7 m: \- L( N1 B9 t' Y
  25.         '复制圆,做为结果显示% m$ @5 W% [, ?. y! O. _# O
  26.         Obj圆.Copy
    - S6 k. I, t2 A( }  }
  27.         
    + e5 Z; a6 x) J9 L
  28.         '圆心右侧最小半径长度处为优化多段线起点
    $ }. p9 O% b* ~$ ^0 E, p) ^6 d
  29.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)
    " R) h3 ^; E7 G* b7 u$ n
  30.         
    5 l" ~) f! h6 {- I
  31.         '记录优化多段线的第一个顶点(起点)坐标
    * @* F$ Q' ?- P, R
  32.         DblArr优化多段线顶点(0) = Var点(0): DblArr优化多段线顶点(1) = Var点(1); s. n2 a- `+ T# P/ g& W( O! Z
  33.         / J, r: H4 `, ?% K7 p
  34.         For Lng顶点循环变量 = 0 To Lng优化多段线顶点数量 - 27 F1 @2 ~: h' V2 A2 i
  35.             For Lng计算分段循环变量 = 1 To Lng相邻顶点间计算分段数量/ p* z) s# k2 ?1 w0 B, \1 B
  36.             
    . L) h* N7 {& ^0 {  |
  37.                 '按半径计算夹角
    * G6 C1 W/ Q: Y4 Z% M3 p4 p
  38.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _
    + \3 e& k$ g) A7 L0 g
  39.                   + Dbl最小夹角( i( p: U, h2 c/ Q, l* @9 K$ ]
  40.                
    9 ~5 p  K, {; K  B# d: i
  41.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点
    ( P3 B9 D1 |2 K% q8 h( Q- a; t
  42.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线
    ( K* P0 K, r% I9 i8 z( z) s7 F- l
  43.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _4 L# v3 ~9 `; t  T+ f  H8 w! m  y
  44.                   .Utility.PolarPoint(Var点, _( u, p/ x: w+ \" p9 s
  45.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))
    3 k' A/ o$ G: r. h& ]3 u
  46.                             * Y" v# E+ g5 I6 W: K0 J
  47.                 '辅助圆半径增大一个增量单位+ E* C( d, ]1 p
  48.                 Obj圆.Radius = (Lng相邻顶点间计算分段数量 * Lng顶点循环变量 + Lng计算分段循环变量) _
    ) r$ S4 h0 h/ e8 |. ]! `- ?% E
  49.                   / ((Lng优化多段线顶点数量 - 1) * Lng相邻顶点间计算分段数量) _
    " y& J. l# g. L9 j2 W) e  [, x
  50.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径
    & q- P' n& `/ L# d% r* J* R
  51.                
      n5 z; b8 X$ u+ I0 t
  52.                 '获得辅助直线与辅助圆的交点,即为本次循环要找的取样点
    1 k- W1 p- S4 N
  53.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)
    : z& Z8 C! o5 G* l
  54.                 - C. _. s+ W4 f$ W
  55.                 '删除辅助直线8 A0 u# f3 @1 E( L
  56.                 Obj直线.Delete
    7 h& N! ^0 z. S3 x4 F3 F) D" L
  57.             Next
    # c7 }- l2 z2 }
  58.             . g$ @% y6 ^  @& P3 E& M8 v: o3 d
  59.             '记录顶点坐标+ Q" T5 \! i1 D- Y" Q
  60.             DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 2) = Var点(0): DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 3) = Var点(1)4 R( c9 ~; d, }  I+ \7 p: }, E
  61.         Next
    6 Y7 b( w/ c. T8 _% D" l. m" s
  62.         
    : A' Z4 f$ p' W! f7 l
  63.         '画多段线
    3 Z$ \6 W  u3 w+ i" {% K) T
  64.         .ModelSpace.AddLightWeightPolyline DblArr优化多段线顶点
    * C+ o. a0 [) K
  65.     End With
      F% ]( H8 B6 x$ 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 )

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