QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

[讨论] 水泵叶线画法

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

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

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

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

  1. & L; J7 y; F# d: @9 t
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double3 G+ ?0 U: k8 d2 h
  3.     Dim Lng样条曲线拟合点数量 As Long, Lng相邻拟合点间计算分段数量 As Long8 ^: y$ B+ I/ d* t- J" c* Z" V2 y$ A
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant" Q& g, {" S& {# g0 P# v
  5.     Dim Lng拟合点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double
      i8 o9 o) P# `' z6 \
  6.     Dim DblArr样条曲线拟合点() As Double, DblArr样条曲线起点切向(2) As Double, DblArr样条曲线端点切向(2) As Double
    : ?# v3 o, l" r% |5 P6 m" J
  7.    
    + ?0 G8 U1 Y  y- u2 {" u4 a
  8.     '已知条件
    ' @  ]" E* {' Z, V! H
  9.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 45
    ' W8 H3 @- l: @7 N8 X
  10.    
    7 _0 W3 x; `) }& Z5 d; C7 y  P" X' R
  11.     '设定曲线拟合点数量,通常不大于500,可根据情况自行更改; \/ N4 w6 F1 |* ~5 t! I
  12.     Lng样条曲线拟合点数量 = 101
    / l/ W/ G. }( J0 X
  13.     '设定相邻拟合点间计算分段数量,可根据情况自行更改
      ?8 j# c% a7 }: v
  14.     Lng相邻拟合点间计算分段数量 = 50
    * w. u4 ]* X; S7 ]3 d; c* m4 o
  15.     '数值越大,曲线精度相对越高,但运行时间越长
    ( @. h8 m/ {; U3 `2 L) v  z( g, v
  16.    
    ' d3 ^7 h6 {  N* x: W
  17.    
    % w3 V* v, R& [0 @% P
  18.    
    . F7 s  Y" d+ d! K
  19.     '按拟合点数量重定义数组/ m' f$ Z8 N- q- t- S; a3 u- v
  20.     ReDim DblArr样条曲线拟合点(Lng样条曲线拟合点数量 * 3 - 1); U* O; y' P" A2 _/ |4 L8 ?8 f2 V7 g
  21.     , G; `5 n! U% I5 [/ f
  22.     With ThisDrawing
    3 C0 H  Y8 Y; A/ C
  23.    
    : v; j7 B- c  d. _
  24.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改
    % ~9 {: C3 A4 Q* L, H. x& H# Q+ y
  25.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)9 q, \4 z4 N* ^* a" B+ @
  26.         
    9 Q* U& w! q) H" i7 p2 U* k
  27.         '复制圆,做为结果显示
    ; B- Y! x: ~9 C
  28.         Obj圆.Copy1 K* g) }* E( k4 A. j* {5 r
  29.         
    & h/ g, e: \- b+ j; i( z
  30.         '圆心右侧最小半径长度处为曲线起点1 b1 r( w1 d! \/ W
  31.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径). J( n* ?1 ]: J
  32.         9 ^" ]* L' T7 z& b0 ~: t6 f$ M
  33.         '记录曲线的第一个拟合点(起点)坐标
    / [" \8 A8 e' D" A% T. f
  34.         DblArr样条曲线拟合点(0) = Var点(0): DblArr样条曲线拟合点(1) = Var点(1)# A- h& \. U, Y# o" \) z2 Q
  35.         
    . \6 x# E, G# ~8 W! A9 _
  36.         For Lng拟合点循环变量 = 0 To Lng样条曲线拟合点数量 - 2
    6 Y: \4 K! L7 g1 d# K1 W) M9 e
  37.             For Lng计算分段循环变量 = 1 To Lng相邻拟合点间计算分段数量
    * h' j- N4 Y% f. X% j
  38.             ' J- ~9 ]- Z8 v0 ^% `" v$ y
  39.                 '按半径计算夹角
    8 ?( T& A1 h1 A; x* v8 m
  40.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _
    9 D8 E) U* f. X
  41.                   + Dbl最小夹角
    # B2 p- A; P# M! H$ I  v9 N
  42.                
    ; Y# O: {( v% n5 U# c* x  ]! ~
  43.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点
    7 G- u! p  M, @2 G8 \/ q+ b6 w
  44.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线0 x* M" i8 h6 f9 k+ l) J
  45.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _
    4 p& e3 }1 t4 \9 P  X7 d
  46.                   .Utility.PolarPoint(Var点, _! a. `8 Q( a5 G
  47.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))
    ) p: b* i0 o" t% Z" {* _- _
  48.                            
    , N% k# i/ L* k4 C3 U1 f
  49.                 '辅助圆半径增大一个增量单位
    . l+ X% K4 j. X+ a5 T7 v
  50.                 Obj圆.Radius = (Lng相邻拟合点间计算分段数量 * Lng拟合点循环变量 + Lng计算分段循环变量) _
    - E  H. a( r5 Q- o# g8 I
  51.                   / ((Lng样条曲线拟合点数量 - 1) * Lng相邻拟合点间计算分段数量) _7 U- {* W, b- \
  52.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径
    ) g( ]- |4 I7 H3 B* \
  53.                 ) I6 d: @' @& r7 c
  54.                 '获得辅助直线与辅助圆的交点$ |! C9 r6 j- q. ~
  55.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)& F5 F6 N  q3 c2 h
  56.                
    7 u5 A8 l! h0 G" f* B+ q2 |
  57.                 '删除辅助直线0 h* _1 J" F- o4 J% c1 G: K
  58.                 Obj直线.Delete                        
    ; N: r, N: G, ?
  59.             Next0 A7 G  x& v1 {4 R, O
  60.             " A' A% {; l# Z% X
  61.             '记录拟合点坐标
    / x, K$ W. R: e0 ?7 Z
  62.             DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 3) = Var点(0): DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 4) = Var点(1): A: k( _4 y  o- p0 Y% r8 |! \
  63.         Next0 k: u( s3 h3 o- ]
  64.                 , L4 X5 V8 A9 B1 \/ m
  65.         '计算起点切向
    8 `2 _3 C7 V# m- U
  66.         DblArr样条曲线起点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))
    4 C* k! X5 @3 X7 L5 `* V! k
  67.         DblArr样条曲线起点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))
    2 F: w; ^5 o' l5 `+ Q
  68.         
    4 O0 z! e% R9 d
  69.         '计算端点切向
    0 }. R3 L, E; F/ b" D2 ]. F) K' I
  70.         DblArr样条曲线端点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))
    - l( V2 q, `4 U* d9 l% s  F
  71.         DblArr样条曲线端点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))
    3 b. b; W5 o1 F6 |/ O
  72.         
    ( B  g  M( t0 {& h5 ], s
  73.         '画曲线
    ! Q) T: {8 B' }. A
  74.         .ModelSpace.AddSpline DblArr样条曲线拟合点, DblArr样条曲线起点切向, DblArr样条曲线端点切向; L7 C. W0 _# d- h1 _& V, ?+ d
  75.     End With
    7 U8 ~. ~! M- r5 @6 Q. p
复制代码
 楼主| 发表于 2009-5-24 10:13:07 | 显示全部楼层 来自: 中国江苏苏州
首先非常感谢版主的解答!% ?; P3 k( F. [$ p0 v
如果改成多段线,该代码又如何修改呢?
发表于 2009-5-24 14:45:56 | 显示全部楼层 来自: 中国辽宁营口

回复 3# benwang 的帖子

  1. ! B, S1 J/ j0 d
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double& N" x+ |3 Q( r" c$ c# `  w: X9 M) p
  3.     Dim Lng优化多段线顶点数量 As Long, Lng相邻顶点间计算分段数量 As Long
    8 |2 [, x9 u6 J9 S: G
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant
    4 x! p- Q# ^4 |
  5.     Dim Lng顶点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double! _* M+ b+ m  M4 d+ B1 {+ k
  6.     Dim DblArr优化多段线顶点() As Double
    # [7 e: i0 A; f8 D, K
  7.     ; D+ L3 ?* n/ n3 N0 X+ G
  8.     '设定优化多段线顶点数量,通常不大于500
    8 Q6 S! ?2 l+ t% C+ x; b
  9.     Lng优化多段线顶点数量 = 101
    7 R8 L7 B. U1 E
  10.     '设定相邻顶点间计算分段数量
    # B- |6 S, q$ a, }6 o
  11.     Lng相邻顶点间计算分段数量 = 5
    + X8 v1 L8 ?" R) _! v
  12.     '数值越大,优化多段线精度相对越高,但运行时间越长2 X- v) j- F" K
  13.     ! K3 F* u+ b+ a  j  a2 s4 R$ E- M
  14.     '按顶点数量重定义数组0 l+ Y* L% L" d. s# [
  15.     ReDim DblArr优化多段线顶点(Lng优化多段线顶点数量 * 2 - 1)5 e. Q8 ?8 J) r) K: J2 n1 D
  16.     $ Q; |, K! J9 L" }$ ], }, [0 w
  17.     '已知条件
      n7 t6 k+ I# I* O' |: D
  18.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 45
    % l. `3 X  T( ]
  19.    
    3 r* g" f$ Q' X% y9 V8 O3 x2 P: y6 p
  20.     With ThisDrawing1 q" ]- L0 p9 |, T2 d' b4 M2 R' H
  21.    
    0 u) u& L7 ^4 j0 o! X
  22.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改( o5 F' O; _" c. [$ I* z
  23.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)' @* ^, X, s1 q
  24.         * r9 O2 J( R! b8 J: N
  25.         '复制圆,做为结果显示5 i" f! p* W  {
  26.         Obj圆.Copy2 K2 m- \: L/ t) K8 c
  27.         
    ; b4 {3 w+ `/ I5 T. Q
  28.         '圆心右侧最小半径长度处为优化多段线起点
    9 J4 u3 \# k' P% m* E% v
  29.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)
    ) G4 B" m1 ]* y* f! b4 ?& \# y0 G
  30.         
    % {  D3 X7 M# a) F) j" _3 Y
  31.         '记录优化多段线的第一个顶点(起点)坐标( n' ~5 g' [  `, P  H9 E
  32.         DblArr优化多段线顶点(0) = Var点(0): DblArr优化多段线顶点(1) = Var点(1)
    ' i! \( w; ?, L' Y0 n
  33.         : I; N) k2 t6 c  H6 g0 h  A$ Y
  34.         For Lng顶点循环变量 = 0 To Lng优化多段线顶点数量 - 2
    & Y' P' c+ {- G
  35.             For Lng计算分段循环变量 = 1 To Lng相邻顶点间计算分段数量
    + @5 c* p4 {+ w9 S5 Y  b
  36.             
    $ u6 X, @. x2 X& \6 a9 a' {" B
  37.                 '按半径计算夹角
    7 }5 [+ @4 A4 @8 J
  38.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _3 r* z5 X9 d9 v9 F- W" L
  39.                   + Dbl最小夹角
    : k7 c  T, {2 P8 Q. ~3 M; P% n! D$ }
  40.                 7 M/ Q! |3 c* ?5 w7 a  I' x7 M6 T
  41.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点
    * I6 C/ y# Q( Z
  42.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线
    - O4 m- V) I4 e/ N% G2 K6 h
  43.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _- w& j6 g6 b: P4 {2 I
  44.                   .Utility.PolarPoint(Var点, _. p# l, D4 b; |
  45.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))7 m; e4 E! W! L- A5 o7 v
  46.                             , U, V: i) h, N9 L/ ?$ i
  47.                 '辅助圆半径增大一个增量单位
    ) l# K  n( A# X/ i% @+ V
  48.                 Obj圆.Radius = (Lng相邻顶点间计算分段数量 * Lng顶点循环变量 + Lng计算分段循环变量) _$ f7 e/ H. h4 g% V: Y5 \
  49.                   / ((Lng优化多段线顶点数量 - 1) * Lng相邻顶点间计算分段数量) _5 |4 W0 i. W' n
  50.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径( o; [- Q. x- B; j
  51.                 1 o# u& V/ e- A
  52.                 '获得辅助直线与辅助圆的交点,即为本次循环要找的取样点% [4 J6 \( T! H+ v
  53.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)( L. D& |1 N- D9 L1 W. l2 M
  54.                 " ~& y: A8 ^5 Z, R" f  ?
  55.                 '删除辅助直线9 f, J, ~: p: Q+ D+ C0 `; W
  56.                 Obj直线.Delete' @+ q  t5 ]& z1 v8 u: N
  57.             Next
    # }! {5 Y  R" t+ }6 y% |' v
  58.             5 B' v  _* w& u
  59.             '记录顶点坐标" S& E7 F! I1 t( i* D
  60.             DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 2) = Var点(0): DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 3) = Var点(1)
    ( u0 c9 Y7 f* N
  61.         Next
    7 }) V0 Y/ P& ~, [1 H0 ]0 z+ S
  62.         & Z/ ?1 T# k+ I5 v! F7 v
  63.         '画多段线' H, f# t+ e8 k# N
  64.         .ModelSpace.AddLightWeightPolyline DblArr优化多段线顶点
    8 Z. T; T- O! \) I+ |" x5 ^) d' F
  65.     End With
    ; V2 K1 n: V1 b8 d/ L7 @
复制代码
发表于 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 )

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