QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
6天前
查看: 4409|回复: 5
收起左侧

[讨论] 水泵叶线画法

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

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

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

x
如图,中间红色线与内圆切线夹角为27度,与外圆切线夹角为45度,随R增大,夹角均匀增大,求其曲线画法!
1111.JPG
发表于 2009-5-23 15:00:45 | 显示全部楼层 来自: 中国辽宁营口
  1. 0 X4 n9 {( c& c# ~. n
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double
    ) n1 C9 W* J0 k6 N! f' ?, [
  3.     Dim Lng样条曲线拟合点数量 As Long, Lng相邻拟合点间计算分段数量 As Long( I' G( x# _& @: @9 M
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant  E$ }! P! H1 |* @# f; C% K
  5.     Dim Lng拟合点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double0 J% T, K( V* Z$ C' h) ^. G
  6.     Dim DblArr样条曲线拟合点() As Double, DblArr样条曲线起点切向(2) As Double, DblArr样条曲线端点切向(2) As Double( F! _3 O. Y1 T3 e+ N, T0 L
  7.    
    . J& F, w: V/ I! {8 H
  8.     '已知条件0 W. z/ O. Y) L0 ]. w, h/ P
  9.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 45
    ' y8 H* b: w" U8 d8 ^/ `( `
  10.    
    , h1 Z  f; K/ o* F
  11.     '设定曲线拟合点数量,通常不大于500,可根据情况自行更改7 M: h% f! P" }" @& X" z- d
  12.     Lng样条曲线拟合点数量 = 101) K. `# g  y* v7 @. k/ ^
  13.     '设定相邻拟合点间计算分段数量,可根据情况自行更改
    3 F* x- p# O7 r) m4 k, Y6 R2 r
  14.     Lng相邻拟合点间计算分段数量 = 509 u4 Y/ F7 c8 H4 m6 S# V4 Z
  15.     '数值越大,曲线精度相对越高,但运行时间越长5 t; V# s3 f9 Z
  16.     / ^$ Z) X% j  G2 t; x9 a+ H
  17.    
    9 @! W! G& V  E* c5 |# j# N
  18.    
      V* l+ e9 |7 T& j& M/ \8 g
  19.     '按拟合点数量重定义数组0 _2 E$ S6 S) J0 Z# D! i8 k
  20.     ReDim DblArr样条曲线拟合点(Lng样条曲线拟合点数量 * 3 - 1)
    0 N$ R, V" W* B/ P  |) y  w* ^# Y5 U& [
  21.    
      P( {4 y6 m4 `8 C
  22.     With ThisDrawing" \2 T: i. L6 [
  23.     1 `; x& T( n1 I& V
  24.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改( I" y2 C$ q- e, y" o0 H' n+ c
  25.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)
    # B' G. J: Y3 g2 F" G- c$ r
  26.         2 }6 f5 q& h; A8 O( n+ T
  27.         '复制圆,做为结果显示0 \5 ~; f( S8 Y3 |2 ]- J' t8 L
  28.         Obj圆.Copy, y: D. [% `9 l
  29.         % m! X! }2 K$ h* c7 y5 m, y! R' y
  30.         '圆心右侧最小半径长度处为曲线起点" W" a" D0 ?$ y2 ~
  31.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)
    ' c5 ]: B$ S$ Q5 k0 Y& ]3 Z3 L
  32.         2 l( m2 t2 p! p
  33.         '记录曲线的第一个拟合点(起点)坐标
    5 [* m0 ^$ l3 U% y7 C& v1 [5 A
  34.         DblArr样条曲线拟合点(0) = Var点(0): DblArr样条曲线拟合点(1) = Var点(1)
    3 Z- c2 @7 z; j8 y( M% V4 o/ H4 t
  35.         / ^' V+ r5 \4 ?) n" m- _4 U' d
  36.         For Lng拟合点循环变量 = 0 To Lng样条曲线拟合点数量 - 2
    - ?3 T% Y! v5 N8 A8 m% {
  37.             For Lng计算分段循环变量 = 1 To Lng相邻拟合点间计算分段数量
    6 I4 F' f  P4 k0 \+ }8 \5 ^7 s
  38.             % G% J$ W5 B% G: O* b7 ?( F6 B4 j
  39.                 '按半径计算夹角; `1 S( u% h' e$ e
  40.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _; q% f; i! ~  W8 B- Z7 n
  41.                   + Dbl最小夹角
    3 n# s6 V1 A5 F( L! J- S% Z6 Z6 X$ s
  42.                
    " m" _9 c  y: k7 U: k0 |; H0 m
  43.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点  N4 Z+ I  B$ p- P
  44.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线
    4 T. `# Z% `, T; u2 j. }) K& x
  45.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _! L0 n( |( B3 `3 \+ I
  46.                   .Utility.PolarPoint(Var点, _
    6 G* F- w5 D4 ^4 j2 \& a' Y; B0 V
  47.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))# e5 e: w: D0 y) R$ F! x
  48.                            
    0 B7 T2 c/ ?# \! m* R& v) i+ _
  49.                 '辅助圆半径增大一个增量单位
    $ L* e; p! [* [+ P
  50.                 Obj圆.Radius = (Lng相邻拟合点间计算分段数量 * Lng拟合点循环变量 + Lng计算分段循环变量) _
    5 O% l  K; K+ c6 p/ ^
  51.                   / ((Lng样条曲线拟合点数量 - 1) * Lng相邻拟合点间计算分段数量) _$ \* p2 \4 V4 @: C/ Y
  52.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径
    1 c9 c) G4 L7 Z6 o9 O$ C
  53.                 3 Z$ I+ n* n0 r- K  m4 ]/ Q
  54.                 '获得辅助直线与辅助圆的交点
    + F1 g2 \/ ^4 r4 R
  55.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)( ^/ B7 ]. y9 y' ^  ]
  56.                 5 N, {  h. k/ X' Z
  57.                 '删除辅助直线
    ( \  Y0 `0 ?/ x6 R, J; o- U
  58.                 Obj直线.Delete                        , I7 s9 N. C2 W
  59.             Next
    . L- m; b% u! L8 d/ @) c$ U! y+ }2 @
  60.             5 G( E, f+ w* ^
  61.             '记录拟合点坐标# G" t3 l3 g# e" c" L
  62.             DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 3) = Var点(0): DblArr样条曲线拟合点(Lng拟合点循环变量 * 3 + 4) = Var点(1)
    . D5 {8 {7 z1 T8 x+ p: E% L
  63.         Next+ c$ L$ I3 _# |" M$ b3 n% g
  64.                
    . m9 e3 W7 B8 [& |5 D: _
  65.         '计算起点切向+ R: E, R6 y7 @5 o5 c5 Q9 {2 k# Y2 c- B
  66.         DblArr样条曲线起点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))6 I9 }' F. d, D0 v
  67.         DblArr样条曲线起点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最小夹角, acDegrees))
    ) _. T1 r& X# n) _$ D5 `8 H
  68.         
    2 X* K. I9 U: E2 g
  69.         '计算端点切向" u0 Y7 q( x: s1 t
  70.         DblArr样条曲线端点切向(0) = Cos(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))- X, t6 `  _& k" u1 f, M
  71.         DblArr样条曲线端点切向(1) = Sin(.Utility.AngleToReal(90 - Dbl最大夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点))
    9 h0 i: z. V; p% B* [4 x4 `" p
  72.         
    # y' a- X5 K$ V" J* P. U0 J) `, T2 c
  73.         '画曲线1 b. V# K$ x2 Z% E! H! S
  74.         .ModelSpace.AddSpline DblArr样条曲线拟合点, DblArr样条曲线起点切向, DblArr样条曲线端点切向; e/ f8 @' @1 c, K, y: _7 V
  75.     End With
    ' K( k3 \2 k3 s8 ?6 k
复制代码
 楼主| 发表于 2009-5-24 10:13:07 | 显示全部楼层 来自: 中国江苏苏州
首先非常感谢版主的解答!
( i& G( f0 s# R8 g, a如果改成多段线,该代码又如何修改呢?
发表于 2009-5-24 14:45:56 | 显示全部楼层 来自: 中国辽宁营口

回复 3# benwang 的帖子


  1. 0 ^7 p0 v5 \. X4 L  |' o$ l
  2.     Dim Dbl最小半径 As Double, Dbl最大半径 As Double, Dbl最小夹角 As Double, Dbl最大夹角 As Double- E" V0 b& w# s/ ]
  3.     Dim Lng优化多段线顶点数量 As Long, Lng相邻顶点间计算分段数量 As Long- j$ s+ V. U' Z" M
  4.     Dim Obj圆 As AcadCircle, Obj直线 As AcadLine, DblArr圆心(2) As Double, Var点 As Variant
    + ~# P6 ?( T& B( n2 ^
  5.     Dim Lng顶点循环变量 As Long, Lng计算分段循环变量 As Long, Dbl夹角 As Double7 z# N. D9 m' w5 p' y7 e  M7 b
  6.     Dim DblArr优化多段线顶点() As Double) L* g6 {$ i% o- t
  7.    
    4 M+ J- z% d8 j3 C7 b0 U4 H3 i5 Q
  8.     '设定优化多段线顶点数量,通常不大于500
    % e5 s) C* ^; X) Y! A) v
  9.     Lng优化多段线顶点数量 = 1018 y% Y! m0 U6 Y/ D7 `- T  ~% S
  10.     '设定相邻顶点间计算分段数量
    3 x# S; |4 ]( g- @
  11.     Lng相邻顶点间计算分段数量 = 5
    ; M; g6 `! {5 [  X
  12.     '数值越大,优化多段线精度相对越高,但运行时间越长
    6 D) P1 X) W2 f8 O; Q& Z; @4 x
  13.    
    / j0 n2 z. Z: M7 G# r1 s' W  K# M
  14.     '按顶点数量重定义数组
    8 }2 j5 Y) D/ V. C
  15.     ReDim DblArr优化多段线顶点(Lng优化多段线顶点数量 * 2 - 1)
    , g* T# X: n% |3 Y5 g
  16.    
    * i  {4 P4 S% l( s
  17.     '已知条件3 d* G' ^) p$ S, r9 M
  18.     Dbl最小半径 = 250: Dbl最大半径 = 700: Dbl最小夹角 = 27: Dbl最大夹角 = 45
    ' ~& M/ w' P% ^5 c' X
  19.     ! U6 @6 W4 D; b5 |, N7 g1 n
  20.     With ThisDrawing
    8 o  s* U  U6 a2 u) ?0 C' R3 e& @' E
  21.    
    7 J4 C) C3 T& F9 q- [5 J' r
  22.         '以坐标原点为圆心,最小半径为半径画一个辅助圆,其半径做为变量在以后计算中还要逐步更改
    # j5 B7 c/ V+ M: E
  23.         Set Obj圆 = .ModelSpace.AddCircle(DblArr圆心, Dbl最小半径)' O& F  `  P  o% J! y& e
  24.         
    ( n# Q/ e) z7 j. e% a8 k
  25.         '复制圆,做为结果显示
    ' P# H' \8 ]  f: ~2 H
  26.         Obj圆.Copy
    ( P: @9 n8 Y9 w& g) y- V
  27.         
    % l& T4 V/ N7 Y8 `5 k: K: c, W
  28.         '圆心右侧最小半径长度处为优化多段线起点
    6 B: v: Z! ^4 T( o
  29.         Var点 = .Utility.PolarPoint(DblArr圆心, 0, Dbl最小半径)
    3 G: ^( q" @$ b) J1 _- P# t
  30.         $ ?. a* H8 u( `7 `4 e
  31.         '记录优化多段线的第一个顶点(起点)坐标
    / Q* N8 T' D" s% k" `
  32.         DblArr优化多段线顶点(0) = Var点(0): DblArr优化多段线顶点(1) = Var点(1)7 I6 ~: k7 W5 A
  33.         
    , {3 K; [0 X4 S& z1 x) j
  34.         For Lng顶点循环变量 = 0 To Lng优化多段线顶点数量 - 2
    * u! F* \' t( b6 [# B, q
  35.             For Lng计算分段循环变量 = 1 To Lng相邻顶点间计算分段数量
    & o0 p7 c* k% b0 h% s4 @
  36.             " F7 H# ?- M0 g, a, U
  37.                 '按半径计算夹角
    * k* I' P/ @8 D
  38.                 Dbl夹角 = (Obj圆.Radius - Dbl最小半径) / (Dbl最大半径 - Dbl最小半径) * (Dbl最大夹角 - Dbl最小夹角) _
    6 ^: s8 w! M& \% _( i
  39.                   + Dbl最小夹角7 U* h0 Z3 Q- K3 j# ?3 ?9 h
  40.                
    : {7 m# y+ t% |4 \3 s
  41.                 '以曲线上一个计算点为基点,用极坐标方法在规定角度和适当长度(按500,保证与圆相交)取点# m% _0 s& s: u7 z
  42.                 '以曲线上一个取样点为起点,上面取到的点为端点画辅助直线( F8 K4 q3 D' h2 g% ?
  43.                 Set Obj直线 = .ModelSpace.AddLine(Var点, _; p) k& i" P- d6 P7 O, j2 Q
  44.                   .Utility.PolarPoint(Var点, _
    9 w" C$ o+ C8 c
  45.                     .Utility.AngleToReal(90 - Dbl夹角, acDegrees) + .Utility.AngleFromXAxis(DblArr圆心, Var点), 500))  `/ N1 q* ~% m& O" J
  46.                            
    2 S  o6 J$ p7 F
  47.                 '辅助圆半径增大一个增量单位
    . F2 C5 @( W6 @7 b
  48.                 Obj圆.Radius = (Lng相邻顶点间计算分段数量 * Lng顶点循环变量 + Lng计算分段循环变量) _& k7 y, {. j2 u% `3 r4 V0 k
  49.                   / ((Lng优化多段线顶点数量 - 1) * Lng相邻顶点间计算分段数量) _; C0 L' L) ^/ Q4 m5 u) F. G3 F
  50.                   * (Dbl最大半径 - Dbl最小半径) + Dbl最小半径
    ; Z! V$ ]& S3 S, S
  51.                
    / q$ b% |( O1 Z" S* ^
  52.                 '获得辅助直线与辅助圆的交点,即为本次循环要找的取样点
    2 F& L) A6 E1 I+ H( {5 w7 d
  53.                 Var点 = Obj直线.IntersectWith(Obj圆, acExtendNone)6 D3 E/ S8 `# J, }. }4 w
  54.                
    9 R  [: i- P: ?: B- p
  55.                 '删除辅助直线
    . p9 u- c- m' U1 o" D
  56.                 Obj直线.Delete
    0 Q! o! }. ?( N& A( I( o, d, R( }
  57.             Next+ c6 M- n6 w3 `1 `3 b9 J% {
  58.             
    : f  D+ R/ ?& b" q$ ]" c
  59.             '记录顶点坐标
    ! p; k: ]! ^2 c
  60.             DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 2) = Var点(0): DblArr优化多段线顶点(Lng顶点循环变量 * 2 + 3) = Var点(1)
    # _% w& V7 m3 E% f+ Q# t0 A# {& L
  61.         Next6 @/ i3 G9 N. g( x% u
  62.         
    / E% ^- N& a* F! i. p  m1 Z" v  D
  63.         '画多段线8 B6 x; e0 f; a  i4 u* H" N
  64.         .ModelSpace.AddLightWeightPolyline DblArr优化多段线顶点
    4 B/ v1 V5 P! q9 X- Z$ V+ r! i
  65.     End With. Q# f/ d. `5 n: J
复制代码
发表于 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 )

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