QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
goto3d 说: 此次SW竞赛获奖名单公布如下,抱歉晚了,版主最近太忙:一等奖:塔山817;二等奖:a9041、飞鱼;三等奖:wx_dfA5IKla、xwj960414、bzlgl、hklecon;请以上各位和版主联系,领取奖金!!!
2022-03-11
全站
goto3d 说: 在线网校新上线表哥同事(Mastercam2022)+虞为民版大(inventor2022)的最新课程,来围观吧!
2021-06-26
查看: 4285|回复: 5
收起左侧

[讨论] 水泵叶线画法

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

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

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

x
如图,中间红色线与内圆切线夹角为27度,与外圆切线夹角为45度,随R增大,夹角均匀增大,求其曲线画法!
1111.JPG
发表于 2009-5-23 15:00:45 | 显示全部楼层
  1. . d6 z; y% }5 A3 F. ], t/ X
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double
    8 e& B- k% G; a1 S
  3.     Dim Lng样条曲线拟合点数量 As Long, Lng相邻拟合点间计算分段数量 As Long
    0 @/ V, L2 W' v* z; c% _1 @% q
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant
    ) c" K% d) _2 G# C3 J2 ]' X$ _% [. j7 X
  5.     Dim Lng拟合点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double
    ) |; K. f5 T+ f6 E: o- u
  6.     Dim DblArr样条曲线拟合点() As Double, DblArr样条曲线起点切向(2) As Double, DblArr样条曲线端点切向(2) As Double7 G; ~  K# m, c4 b
  7.    
    4 G7 X6 k) U: H2 B! J0 e
  8.     '已知条件  z$ F% e$ f- B! g$ S% s
  9.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 45& Q: Y9 l+ _7 D& k7 y& y# H' P
  10.    
    / p' R  E& F4 K* m3 Z$ m
  11.     '设定曲线拟合点数量,通常不大于500,可根据情况自行更改- z5 W8 U# j) F* |- q
  12.     Lng样条曲线拟合点数量 = 101
    + M5 {! [6 R5 b+ k! A+ Q" M
  13.     '设定相邻拟合点间计算分段数量,可根据情况自行更改/ ]- V: h6 L; ~: P4 r; D6 M. `# V
  14.     Lng相邻拟合点间计算分段数量 = 50, v3 y( G& @. v( [' k; \
  15.     '数值越大,曲线精度相对越高,但运行时间越长
    : U3 O4 D, i* h# [, u" U, M
  16.     % C  \2 I5 A2 n* _/ c  b
  17.     0 P8 Q3 l+ q+ w' t
  18.    
    2 t- \; ~3 F# l" o+ O
  19.     '按拟合点数量重定义数组
    * m' Y  ?# ]$ |/ H
  20.     ReDim DblArr样条曲线拟合点(Lng样条曲线拟合点数量 * 3 - 1)
    / [# M( O0 ]/ \! j) G: q
  21.    
    ) p2 r$ z) ~( K& N* N
  22.     With ThisDrawing& _, V/ J1 e  R- d) C
  23.     * o7 \0 ?' }: B- k' r: ?% z; B3 C
  24.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改- C' W+ K2 X  P* i1 A
  25.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)
    $ P8 z3 I6 o2 g9 I
  26.         
    % c) r$ M( k* u4 ~3 g5 X% M# ]
  27.         '复制圆,做为结果显示
      T" ?) K6 V. m9 q2 h. [/ i6 _0 ]
  28.         Obj圆.Copy4 F2 ~# M4 B) g$ B0 P% V* W; s
  29.         
    8 f- r# P+ f. U# j4 V" R
  30.         '圆心右侧最小半径长度处为曲线起点4 @* s! k& b' K
  31.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)
    & I5 ~- b& s+ G" z2 D# ^, H% f1 ]
  32.         ! k8 Y! d  J1 O
  33.         '记录曲线的第一个拟合点(起点)坐标; W+ u/ R4 N; f7 U- B9 V7 U6 ~* T7 q3 J
  34.         DblArr样条曲线拟合点(0) = Var点(0): DblArr样条曲线拟合点(1) = Var点(1)
    : g  a; }4 X5 z2 h  W, d4 @, F
  35.         
    * I0 M6 p8 ]. m/ X. V" ~/ u
  36.         For Lng拟合点循环变量 = 0 To Lng样条曲线拟合点数量 - 2
      \6 E  F) j8 u: |5 T" ]
  37.             For Lng计算分段循环变量 = 1 To Lng相邻拟合点间计算分段数量
    ! v. U# t7 p' W$ C( x
  38.             4 c5 P8 Q# V7 ^8 F
  39.                 '按半径计算夹角, z- p6 Y, `, ~! P% j! Q
  40.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _
    6 r! z/ t9 H" y7 S5 V
  41.                   + Dbl最小夹角
    1 ^3 Z* y8 T6 \4 C; K, Y' _+ y
  42.                 3 _$ L3 {, C5 S
  43.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点1 o8 b, B  H0 y- O3 C% D# A& r
  44.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线
    . L" u3 m* z1 V' z0 W( m, z
  45.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _
    0 R4 s" y( q! V% {# G$ i
  46.                   .Utility.PolarPoint(Var点, _# }6 c, c0 r- |+ `, {8 H$ J
  47.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))7 e' A) p2 E$ j/ y' N% C
  48.                             " \: }, h6 b( {% C5 ?' S
  49.                 '辅助圆半径增大一个增量单位+ v. U0 S- h6 c1 i2 h* i2 A0 W
  50.                 Obj圆.Radius = (Lng相邻拟合点间计算分段数量 * Lng拟合点循环变量 + Lng计算分段循环变量) _
    2 X9 k( h/ K7 s
  51.                   / ((Lng样条曲线拟合点数量 - 1) * Lng相邻拟合点间计算分段数量) _. k( B" O1 ~/ P( k/ \. X
  52.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径
    2 K2 e3 _' F0 O+ B7 K
  53.                 8 P. y5 v4 [' P( j4 {0 n
  54.                 '获得辅助直线与辅助圆的交点
    . R' f7 B) o. V' A: B
  55.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)- T) N5 v$ V* s
  56.                
    7 I1 ~# t4 c! r) D6 v+ Y
  57.                 '删除辅助直线( v" r9 H+ ~) z% h
  58.                 Obj直线.Delete                          ^/ s1 k) h; ]" x2 m9 a
  59.             Next. [7 ]' W  u& k# y3 D
  60.             & \$ d* ~6 p: t  {- |, c( _  n% T
  61.             '记录拟合点坐标
    # w( R+ r# k" c# k" N7 ?# s. z' [* w
  62.             DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 3) = Var点(0): DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 4) = Var点(1)5 o' O5 J6 ^- v5 X* F2 ^
  63.         Next
    : r6 q- {: E- \/ J) Q
  64.                
    1 `& u  P, [! ?2 ^( S$ k+ [) ^
  65.         '计算起点切向% X8 D9 m( O! C! M" R; ^9 p
  66.         DblArr样条曲线起点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))
    ; e1 H" x6 J* {$ o% T
  67.         DblArr样条曲线起点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))# `8 L9 G& J4 m1 M0 `7 {
  68.         
    / I# V, m1 X& X, Y
  69.         '计算端点切向! g, l* G6 C8 X' ]
  70.         DblArr样条曲线端点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))& d7 e9 O& P' q2 a1 N3 ]( P
  71.         DblArr样条曲线端点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点)). Z7 |; ?# U. o3 u* z
  72.         
    3 J5 ~$ X& E4 W7 M- t( a- i" D
  73.         '画曲线* \9 X. l, {3 ~& {; B6 @$ g$ n
  74.         .ModelSpace.AddSpline DblArr样条曲线拟合点, DblArr样条曲线起点切向, DblArr样条曲线端点切向; M9 ]2 d, F# t$ A$ i. ^
  75.     End With
    ' \: M6 ^4 S% k+ S3 k
复制代码
 楼主| 发表于 2009-5-24 10:13:07 | 显示全部楼层
首先非常感谢版主的解答!
: ~1 D8 w: `/ g- K$ t# g' u# e如果改成多段线,该代码又如何修改呢?
发表于 2009-5-24 14:45:56 | 显示全部楼层

回复 3# benwang 的帖子

  1. + Q& ^" d1 A2 h- V& c  _8 \* C
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double
    2 ^. N4 C7 t: |! a" p  h: k- _- P+ ]% q
  3.     Dim Lng优化多段线顶点数量 As Long, Lng相邻顶点间计算分段数量 As Long) ^8 R! s0 w5 r) B6 k6 t
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant0 M' Z+ @# [$ m
  5.     Dim Lng顶点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double; ~$ X: `% h" V2 _, S! U5 X
  6.     Dim DblArr优化多段线顶点() As Double- o0 O2 f& u4 o: B& D
  7.    
    " T7 Y8 c3 c4 |
  8.     '设定优化多段线顶点数量,通常不大于500
    $ G: K6 O) N3 w7 E0 K
  9.     Lng优化多段线顶点数量 = 101& h  f% |2 `" q: v6 {9 _
  10.     '设定相邻顶点间计算分段数量4 j0 }1 u; W0 V' ~+ n7 C
  11.     Lng相邻顶点间计算分段数量 = 5* A  u/ o; S: c+ ^( l+ k3 R
  12.     '数值越大,优化多段线精度相对越高,但运行时间越长- x+ r% X6 l) B- o8 Z
  13.     + a8 ^, N8 }- s' \
  14.     '按顶点数量重定义数组" _9 `! ~8 f3 ~( W2 y( y
  15.     ReDim DblArr优化多段线顶点(Lng优化多段线顶点数量 * 2 - 1)
    6 X2 V" F) k% w  R4 L* |
  16.     * r6 p# U0 b2 |, ?
  17.     '已知条件
    9 }( Y' o4 T! S
  18.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 45# S. `. V* ~/ m/ Y7 r2 u7 H2 E
  19.    
    + w2 M/ H8 s, }/ e' U) x- t- P- S
  20.     With ThisDrawing
    1 L3 ^* z8 t- |+ s
  21.     . Z) k: k/ g% }% l
  22.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改5 d/ u3 Z" |7 v- m$ a
  23.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)
    7 i7 F/ {" x7 a
  24.         6 M" g# d' I9 I7 [
  25.         '复制圆,做为结果显示
    ; c4 M" ]4 }) u
  26.         Obj圆.Copy$ u  }0 J) m8 K  a( }) |
  27.         / d% w; ?6 q% a. r% ?6 B% D! x
  28.         '圆心右侧最小半径长度处为优化多段线起点% i) m4 n9 g' o* r  A+ y: ~
  29.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)
    2 @: Y0 w/ u1 u% A1 _0 i
  30.         $ l/ N1 L& L6 [' R( J7 k4 }
  31.         '记录优化多段线的第一个顶点(起点)坐标7 g! o0 R) G" v7 p% z
  32.         DblArr优化多段线顶点(0) = Var点(0): DblArr优化多段线顶点(1) = Var点(1). _  D$ D- W4 ~
  33.         3 u5 g1 `1 X8 u7 I8 Q" Q
  34.         For Lng顶点循环变量 = 0 To Lng优化多段线顶点数量 - 2
    2 z( o# p8 [. I" A* Q
  35.             For Lng计算分段循环变量 = 1 To Lng相邻顶点间计算分段数量$ D0 D) ?7 v; ]# F7 ?! C: Y
  36.             2 \6 n; F7 ~- _* _
  37.                 '按半径计算夹角
    1 ~; v/ M0 r, D+ v6 L2 K* d" Y
  38.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _' G1 u* V5 D6 }$ w
  39.                   + Dbl最小夹角  t1 p# u$ l& L1 a
  40.                
    8 w- s( h4 ?5 [8 ^
  41.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点
      U# T$ F* ~% D0 e
  42.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线
    0 W/ L% x( z8 k! r" R9 c
  43.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _. q! M+ a( c4 ^% L7 J
  44.                   .Utility.PolarPoint(Var点, _
    ! ^, Q' J' q8 @" B8 N( J4 u
  45.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))+ y; X' O1 u* H
  46.                             / I9 t6 T" C! l: z3 I% }
  47.                 '辅助圆半径增大一个增量单位
      z% q6 P7 Y1 D1 @) n% C2 p- z/ c
  48.                 Obj圆.Radius = (Lng相邻顶点间计算分段数量 * Lng顶点循环变量 + Lng计算分段循环变量) _
    6 g% n, M5 M) t5 b2 s, @8 ]
  49.                   / ((Lng优化多段线顶点数量 - 1) * Lng相邻顶点间计算分段数量) _
    * u0 m+ v2 B" ^1 |3 z
  50.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径
    4 S( O8 L8 ]1 K. E! Q8 V
  51.                
    1 c: w6 C# N! _
  52.                 '获得辅助直线与辅助圆的交点,即为本次循环要找的取样点) F! T1 I' C" O$ Q& z
  53.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)! q" D: Y3 b8 s5 L" ?
  54.                
    0 w9 ^8 a+ M" @; ~5 i, Q
  55.                 '删除辅助直线# W( ~9 i7 G6 ]  i( H! ^
  56.                 Obj直线.Delete
    & I8 l1 S7 t6 O# X
  57.             Next
    # z; m- r" l" e* i& E; Z+ c+ Q
  58.             1 s* b& g5 D* W
  59.             '记录顶点坐标
    & ~1 t: K: Q3 t( @' ?
  60.             DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 2) = Var点(0): DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 3) = Var点(1)) \/ a- U  I1 E% V, S( {
  61.         Next
    3 h$ c9 M6 `0 x1 S7 ^4 U) ^  t- {$ F
  62.         - t3 F3 @# H0 a1 P, f/ T- x
  63.         '画多段线
    - A! I! S$ i) B9 G8 k2 ]
  64.         .ModelSpace.AddLightWeightPolyline DblArr优化多段线顶点
    " }# N! |4 ~+ X2 d% |5 X; ?9 z
  65.     End With
    $ N" _0 P- `4 l( c: q
复制代码
发表于 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 )

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