QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

[讨论] 水泵叶线画法

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

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

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

x
如图,中间红色线与内圆切线夹角为27度,与外圆切线夹角为45度,随R增大,夹角均匀增大,求其曲线画法!
1111.JPG
发表于 2009-5-23 15:00:45 | 显示全部楼层
  1. 1 a8 E( v4 }4 n
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double1 d; `# s. x( D
  3.     Dim Lng样条曲线拟合点数量 As Long, Lng相邻拟合点间计算分段数量 As Long
    ' k( T* y3 H& Y) {  w2 A
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant" _8 |  X; Z$ }% \$ y/ z/ U: O
  5.     Dim Lng拟合点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double0 @" N% J* N2 t
  6.     Dim DblArr样条曲线拟合点() As Double, DblArr样条曲线起点切向(2) As Double, DblArr样条曲线端点切向(2) As Double. h# G3 K0 k3 y% A4 U
  7.    
    , l5 B1 _! u- z3 q4 r$ z! a
  8.     '已知条件
    ' t% R, a( g1 N( g% o
  9.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 45. ~' D( {* P& V8 n
  10.    
    # V2 ~, P' p) n
  11.     '设定曲线拟合点数量,通常不大于500,可根据情况自行更改. D6 M2 Y. G: l( k+ ]  c
  12.     Lng样条曲线拟合点数量 = 1015 Y& y# ~5 y1 y5 t+ G
  13.     '设定相邻拟合点间计算分段数量,可根据情况自行更改1 T- H$ x/ k0 d+ B! W' {5 I
  14.     Lng相邻拟合点间计算分段数量 = 50
    ) X4 M7 S* I- s3 h% u! p  o. o
  15.     '数值越大,曲线精度相对越高,但运行时间越长
    & V! I5 R8 i# `  N: A* j6 j: o$ @; u
  16.     1 [3 n$ k- F& m1 Z9 F
  17.    
    9 I8 f9 _; T9 T7 n
  18.    
    7 F3 b+ ]8 f- ~" E5 U
  19.     '按拟合点数量重定义数组
    1 w, v. i' `" T6 f% L( L8 b
  20.     ReDim DblArr样条曲线拟合点(Lng样条曲线拟合点数量 * 3 - 1), g3 ]+ @4 Q( V& `
  21.    
    ! \- v) [8 L. v4 V+ O2 [* h; q
  22.     With ThisDrawing9 ]% V, }" R6 f& }1 ~+ W  v
  23.     ! Y# E6 l0 M6 L9 Y, Q' ~
  24.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改% x0 m5 m7 D% }/ l" C$ ]+ {
  25.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径): H; P0 C( P  B2 k! u, K
  26.         ! V7 c# L; a5 |
  27.         '复制圆,做为结果显示
    " V. h( X* Q. c
  28.         Obj圆.Copy
    # s5 B' m% [; U4 z
  29.         * A6 \# k* b! z- |
  30.         '圆心右侧最小半径长度处为曲线起点: `3 ^3 S1 L) J9 R. {
  31.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)
    - \, z1 U% ?) S4 |4 y, }" j/ I+ W/ H
  32.         / {1 X% I3 r5 Z$ d# w! |. B$ Y! y0 j
  33.         '记录曲线的第一个拟合点(起点)坐标* X# h: a+ Q( W" @" c
  34.         DblArr样条曲线拟合点(0) = Var点(0): DblArr样条曲线拟合点(1) = Var点(1). j$ o! ~! e. z% U5 o# `
  35.         5 F: M- n1 N/ k
  36.         For Lng拟合点循环变量 = 0 To Lng样条曲线拟合点数量 - 2) t( V) _! e/ O* Z) [) |: M2 }
  37.             For Lng计算分段循环变量 = 1 To Lng相邻拟合点间计算分段数量6 }# v/ C+ n2 A  X8 a0 c: H3 V
  38.             
    0 I! w1 ?3 g' t3 m% U
  39.                 '按半径计算夹角
    5 g+ g; {, b* }3 D/ S/ G
  40.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _. @& g6 Z  h9 \# ^* _9 q- e, [0 R
  41.                   + Dbl最小夹角% P& Z0 `$ |9 m3 i( y/ W
  42.                 * ?3 v7 O* _2 U  z
  43.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点
    8 F) z0 v8 A/ t) p9 x+ c% l5 d8 f8 S
  44.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线
    & F+ J7 c' J! S" @. r! j, E6 _9 I
  45.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _
    , D2 W# c0 V5 b* q
  46.                   .Utility.PolarPoint(Var点, _; D  G2 y1 }, W/ }  j* h+ y
  47.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))6 h: `: ]$ _6 H2 A  i7 }
  48.                            
    % O4 ^- i& W: C( n; b/ r& i
  49.                 '辅助圆半径增大一个增量单位5 r; y) B6 T4 ?- I
  50.                 Obj圆.Radius = (Lng相邻拟合点间计算分段数量 * Lng拟合点循环变量 + Lng计算分段循环变量) _: |$ x& m7 M( o3 }9 E0 i% ~
  51.                   / ((Lng样条曲线拟合点数量 - 1) * Lng相邻拟合点间计算分段数量) _
    # p9 W8 _! A1 A0 a, l( ]
  52.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径
    " T* Z, V9 u1 s/ P, S3 t
  53.                
    4 F9 K% |: ?3 d$ y9 e! ^9 J- Z% n
  54.                 '获得辅助直线与辅助圆的交点
    $ k! C; ]# M! v, W+ E
  55.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)
    9 {6 x, ^+ L& q0 D# a% h- H6 x/ Y% \
  56.                 " p+ t: ?- t& g
  57.                 '删除辅助直线
    6 S% `+ r8 p" w, @
  58.                 Obj直线.Delete                        ' Q/ p2 f8 \7 E9 X) P
  59.             Next6 n7 N- x2 l2 v5 q2 T  M
  60.             
    : m! j, j& s# `
  61.             '记录拟合点坐标
      G/ @' j- R" |9 W) j
  62.             DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 3) = Var点(0): DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 4) = Var点(1)* e+ _1 `, d: q3 |3 @$ g) S
  63.         Next" A# k0 C* T% P7 n: j8 T
  64.                 : y3 [2 B# n$ t* ?. W( F( P
  65.         '计算起点切向
    7 d: ?% e0 V7 u# G2 v0 b
  66.         DblArr样条曲线起点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))
    6 e: n: u  w/ i/ K
  67.         DblArr样条曲线起点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))
    + A# k5 h7 K% k9 Y
  68.         ) W. l' F' M# c+ D% D: }) l
  69.         '计算端点切向
    , [7 q7 i; @7 N! l, @* l
  70.         DblArr样条曲线端点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))/ b' [% t: K2 D. W5 ^
  71.         DblArr样条曲线端点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))
    6 W$ |+ X2 [/ u3 p2 f9 J' j& l  P
  72.         ' [/ f  o8 t/ t/ D* u4 p6 r
  73.         '画曲线
    + n1 m# K" }% D- N! ~/ X
  74.         .ModelSpace.AddSpline DblArr样条曲线拟合点, DblArr样条曲线起点切向, DblArr样条曲线端点切向* f0 J1 d4 _5 Q* m7 X% ~
  75.     End With2 G0 U1 Y: v0 a" [
复制代码
 楼主| 发表于 2009-5-24 10:13:07 | 显示全部楼层
首先非常感谢版主的解答!
( ~" I3 G% Z! N; k7 {+ v5 G' ?& U如果改成多段线,该代码又如何修改呢?
发表于 2009-5-24 14:45:56 | 显示全部楼层

回复 3# benwang 的帖子

  1. ! M5 q1 u( X( K. I  l4 U% c
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double
    / n0 P* f7 z7 a# j0 y# u3 M  M3 B
  3.     Dim Lng优化多段线顶点数量 As Long, Lng相邻顶点间计算分段数量 As Long, j; f) R* P/ M1 I% F
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant
    7 {* I* l: z( D6 G
  5.     Dim Lng顶点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double
    0 ~+ _- I1 w4 q/ {1 D7 [' m, g
  6.     Dim DblArr优化多段线顶点() As Double; L; a  B$ b8 [/ J: D
  7.    
    " T6 L% g2 h" P! Q) y
  8.     '设定优化多段线顶点数量,通常不大于5003 ]: P/ z9 I, I# |
  9.     Lng优化多段线顶点数量 = 101! @( J, Y; g/ o! n
  10.     '设定相邻顶点间计算分段数量
    8 p! H0 d# i# w+ N) ]
  11.     Lng相邻顶点间计算分段数量 = 5  U* X0 u& u! F6 m: a
  12.     '数值越大,优化多段线精度相对越高,但运行时间越长9 x4 Q& M8 @+ ^, Q, e& A
  13.    
    0 \4 r, U9 o. m4 i5 y
  14.     '按顶点数量重定义数组5 p$ p1 s5 K8 q" h
  15.     ReDim DblArr优化多段线顶点(Lng优化多段线顶点数量 * 2 - 1)
    . ]. M6 k( b$ V" C
  16.    
    2 k3 h7 e- X! N1 l* i0 C% b9 ?7 T
  17.     '已知条件5 t: N/ }. x; ~: H
  18.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 45
      f4 M3 X+ B: n5 F3 i& Q
  19.     % T. _, w, J. |7 M7 v; N1 [
  20.     With ThisDrawing* i1 u  Y0 M2 w9 \, Y
  21.     ) H5 l* L7 P7 O' k8 O7 _
  22.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改
    . ]) f  k0 ]) v5 i5 m4 X
  23.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)+ P; \' K2 J0 u1 P- Q* j
  24.           a7 ?6 G4 j$ V9 }
  25.         '复制圆,做为结果显示6 L& [  r+ G3 Y4 n
  26.         Obj圆.Copy
    5 I0 a7 K  K) n  e! A4 H' ~4 Z
  27.         
    ! R9 f' @: e, p* N
  28.         '圆心右侧最小半径长度处为优化多段线起点1 M1 G* |+ q5 X7 q: U# g) u! c
  29.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)
    ( d/ y6 N1 W, D8 n; z
  30.         7 R4 P7 U" }. ^3 N  l
  31.         '记录优化多段线的第一个顶点(起点)坐标" a+ D" Q0 L8 w, s! T
  32.         DblArr优化多段线顶点(0) = Var点(0): DblArr优化多段线顶点(1) = Var点(1)
    6 Z( v9 V9 O1 S. K
  33.         & M  ]/ t3 }1 G; F( N
  34.         For Lng顶点循环变量 = 0 To Lng优化多段线顶点数量 - 2
    2 ~! v" `3 d0 d
  35.             For Lng计算分段循环变量 = 1 To Lng相邻顶点间计算分段数量
    ) C' d$ w0 ^* f( z* u# J3 R
  36.             
    : A+ j8 e- v( G
  37.                 '按半径计算夹角# Q3 T. G0 l4 a! F( P* v: g7 r7 O! X, h9 A
  38.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _
    / r0 u/ Q+ j3 P0 c! A* Z
  39.                   + Dbl最小夹角5 S- ]$ ~6 c7 W# n8 o  D! M# H
  40.                 # ~8 q; w& c; Y- ?* }1 }) ~, W
  41.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点2 w8 v% W3 I& \6 `
  42.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线
    # [; o2 z5 x1 d" @0 `* Z
  43.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _
    2 }' P, G4 r9 ^7 M8 J
  44.                   .Utility.PolarPoint(Var点, _
    9 T; n" ^! M% \2 f
  45.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))9 ^8 d: V. z1 u5 L6 O
  46.                             & z$ J( u% ~2 |8 |5 D$ V+ ?
  47.                 '辅助圆半径增大一个增量单位3 `% m% H9 U4 o% D' y) p; H+ k7 b
  48.                 Obj圆.Radius = (Lng相邻顶点间计算分段数量 * Lng顶点循环变量 + Lng计算分段循环变量) _
    9 J( D$ K# x' h* S* S- A
  49.                   / ((Lng优化多段线顶点数量 - 1) * Lng相邻顶点间计算分段数量) _
    5 L  ?. G2 ?( B- u; ^
  50.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径
    / g5 w1 K1 @, F
  51.                 / ]) Y) M# d& B" {8 j5 I
  52.                 '获得辅助直线与辅助圆的交点,即为本次循环要找的取样点
    9 b$ z/ k# m7 f: Z6 Y4 {
  53.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)
    & `* K: V4 O4 z3 Q0 q
  54.                
    ( i8 ?8 j; |7 W* T6 E. K3 ?
  55.                 '删除辅助直线: _. q& w1 W  W5 Q6 j( h, X
  56.                 Obj直线.Delete* y* \4 M! v5 V/ O
  57.             Next& Z* u! M- y/ Q
  58.             
    5 a1 m2 g$ o2 c  U6 h& i1 a6 t
  59.             '记录顶点坐标* F  `% F+ e1 |$ Y; ^
  60.             DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 2) = Var点(0): DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 3) = Var点(1)& q" ^+ N, Q/ b3 s$ A
  61.         Next
    . d: \% s$ @% |' Y, _; f
  62.         
    # R* @9 [" |3 |
  63.         '画多段线
    , T5 U) x! P7 }; L
  64.         .ModelSpace.AddLightWeightPolyline DblArr优化多段线顶点
    . W) E+ S0 e2 ~) c7 I/ ?5 p* u6 G
  65.     End With' q+ s" N# ?/ j5 F# G7 ^% H5 F7 \- q2 @) ~
复制代码
发表于 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 )

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