QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

[已解决] 又来求救了,一道实际问题提炼出的作图题,sos

[复制链接]
发表于 2015-12-23 07:38:17 | 显示全部楼层 |阅读模式 来自: 中国广东惠州

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

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

x
本帖最后由 唐昕晨 于 2016-1-27 21:17 编辑
6 r0 o# U2 W* R) V" v1 \  r1 T3 H$ X4 A4 W; f, q
2.png
+ j) }9 A6 @# Q8 R  t/ k  Q凸面镜反射,已知入射光线上一点与反射光线上一点,如何作入射光线与反射光线2 {  o% Q4 {, G/ _' ?& a5 B5 u! A
ttachimg]2272051[/attachimg]
image012.jpg
发表于 2015-12-25 04:29:33 | 显示全部楼层 来自: 中国黑龙江伊春
本帖最后由 woaishuijia 于 2015-12-25 08:04 编辑
' x5 X' u+ D, H
  1.     Dim P1 As Variant, P2 As Variant, P3 As Variant, R As Double
    & t6 C# f) s7 }
  2.     Dim B As AcadBlock, C As AcadCircle, L1 As AcadLine, L2 As AcadLine, L3 As AcadLine
    , g2 m( h# h: y0 I) T4 ]
  3.     Dim A As Double, A1 As Double, A2 As Double, A3 As Double, A4 As Double* J* O8 {' A$ l3 n+ j
  4.     With ThisDrawing6 M( ]7 j0 U# O/ A
  5. '操作者屏幕输入参数8 T" f, ]2 R. A) Y
  6.         On Error GoTo 10& n: O0 D1 D% E+ s) f/ `, I) f
  7.         With .Utility9 V& H1 k" Z5 M  F# K
  8.             P1 = .GetPoint(, "指定圆外第一点"): I+ N3 }% L3 A5 H, L. E
  9.             P2 = .GetPoint(, "指定圆外同侧第二点")
    9 X" e: b) J* k3 c, t
  10.             P3 = .GetPoint(, "指定圆心")
    " g! ^8 J; B4 j- E5 r  Y6 u
  11.             R = .GetDistance(P3, "指定半径")
    ) `* I: K; j8 e# o
  12.         End With
    6 R0 g9 t1 K$ U! W! n
  13. '检查输入的参数,如果有一点或两点在圆内部,则退出宏
    ; f1 u4 v+ Z2 @
  14.         If (P3(0) - P1(0)) ^ 2 + (P3(1) - P1(1)) ^ 2 < R ^ 2 Or (P3(0) - P2(0)) ^ 2 + (P3(1) - P2(1)) ^ 2 < R ^ 2 Then GoTo 10
    : j" x8 V7 H/ V9 @+ {
  15. '判断作图空间* Y; \7 l$ ~, c. h" ]7 r
  16.         If .ActiveSpace = acModelSpace Then
    8 T' l- Z. f% l' p1 s$ H& \: X
  17.             Set B = .ModelSpace
    . p: [3 w- n  e8 |2 A
  18.         Else8 M% x; g  m7 `
  19.             Set B = .PaperSpace$ f" q. h% S4 K$ \& r1 o7 R
  20.         End If
    8 g$ M. m& x$ R
  21. '按输入参数画圆, K: ~# Y0 _; Q9 ~* w: x: z
  22.         Set C = B.AddCircle(P3, R)
    , n3 B3 ^0 s4 y1 k! p0 g9 M! f. ]
  23. '在输入的圆外两点间连线# h+ [  j+ U' Z! S( u' ^
  24.         Set L1 = B.AddLine(P2, P1)
    1 F9 f' {0 H9 j0 b. C1 v) B$ [
  25. '检查连线与圆是否相交,如不相交则继续;如相交则删除圆和连线并结束宏
    0 q( R+ ~6 o- L9 H, {. e
  26.         P3 = C.IntersectWith(L1, acExtendNone)# e# t4 U3 }# G$ {) H4 {9 L( M* ]
  27.         If UBound(P3) = -1 Then
    ' }; d; ]( y3 n1 ^4 n4 O$ v
  28. '将直线L1的起点改到圆心
    1 z6 g8 O  w# P& T
  29.             L1.StartPoint = C.Center
    ) l, [* p9 T! t/ l: _
  30. '从圆心到输入的第二点画直线L2
    4 |+ g/ ?; B* [0 I
  31.             Set L2 = B.AddLine(C.Center, P2)+ E+ G7 M7 @! H7 D
  32. '用两直线的角度计算迭代运算的边界/ v5 I6 c/ a# r% P" G/ |
  33.             If L1.Angle - L2.Angle > 0 Then  h. v! z. k) w1 g+ S5 I6 r
  34.                 If L1.Angle - L2.Angle < .Utility.AngleToReal(180, acDegrees) Then
    : Y% u8 G) K% g- `2 `% z* i
  35.                     A1 = L1.Angle0 \2 K5 d1 G. x- J! Q9 i
  36.                     A2 = L2.Angle
    ( M1 Y7 L5 R; O3 I( k2 T6 {7 c  c
  37.                 Else
    " w6 k( h! F7 {0 V5 C
  38.                     L1.EndPoint = P2
    6 f. N& q. s+ F! A0 M% g
  39.                     L2.EndPoint = P12 N4 ^; f) X5 K  @$ v' l
  40.                     A1 = L1.Angle
    : J: [* w0 e2 G4 d/ @* a3 f! K# G
  41.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees); R& P1 B# q8 a; k$ e; ]
  42.                 End If4 p  Q! b" c. d0 G
  43.             Else
    : s  U: F; n% k
  44.                 If L2.Angle - L1.Angle < .Utility.AngleToReal(180, acDegrees) Then6 h$ T) ?+ J% I: H+ e$ w4 t2 n
  45.                     L1.EndPoint = P2
    ! Y: @& Y! b0 ?4 `0 a8 g" p8 ^
  46.                     L2.EndPoint = P19 `  g; j5 s+ h+ w, _
  47.                     A1 = L1.Angle
    6 t) S& L1 m: Q7 |
  48.                     A2 = L2.Angle
    7 e- f, N6 O% N$ k: [  O9 Y% i6 s
  49.                 Else
    ! {7 n- m) p9 g2 j7 N; j+ L
  50.                     A1 = L1.Angle
    * u7 f5 j  K# W$ {! P& g
  51.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees)7 y; S2 A- ^/ N( p) v( o
  52.                 End If4 n/ ]1 [5 K- v3 ?
  53.             End If: k. m6 A- |) A+ c, e
  54. '以圆心为起点画第直线L3
    7 E0 b: O3 v0 C
  55.             Set L3 = B.AddLine(C.Center, C.Center), H( m% N$ `% ]$ E; F+ p7 X
  56. '循环,迭代运算# I' H" p& r% s- f. T  |* N
  57.             Do
    8 L& d9 i/ e! o7 ]' m3 D+ ^
  58. '简单的插值法2 o& u  D, Z6 r3 v3 D% v
  59.                 A = (A1 + A2) / 2
    . ]- D4 a5 o& J: F( x. t
  60. '直线L3和入射和反射线的端点改到圆上尝试的点; j- e  C& V9 B3 d1 @2 q4 m& G
  61.                 L3.EndPoint = .Utility.PolarPoint(C.Center, A, R)
    ( s  x6 x2 I0 ]% c" |
  62.                 L1.StartPoint = L3.EndPoint( I1 E0 E! [; Z. M
  63.                 L2.StartPoint = L3.EndPoint
    & c7 ]# L  }) ?+ V0 N4 W) y1 n  J
  64. '计算入射和反射线分别与直线L3的夹角
    0 B3 k) ^8 [9 \7 ?- \+ H2 P9 x2 F' z
  65.                 A3 = L1.Angle - L3.Angle
    6 b, b; w6 S& _5 k6 x0 |7 I
  66.                 If A3 < 0 Then A3 = A3 + 2 * .Utility.AngleToReal(180, acDegrees)8 Y- g$ V/ c/ t8 O
  67.                 A4 = L3.Angle - L2.Angle
    7 l1 L; J/ O' z( o0 t  L5 P
  68.                 If A4 < 0 Then A4 = A4 + 2 * .Utility.AngleToReal(180, acDegrees)
    * R) X: S, X. z1 \" A8 |0 D
  69. '如果两夹角相等或已运算到浮点数的最高精度则退出循环) k/ T8 g* N. [) L) j
  70. '否则将当前尝试点作为新的边界继续循环运算6 {# m' A. M; }% S7 P; h+ _
  71.                 If A3 = A4 Or A = A1 Or A = A2 Then' R5 |9 v; S2 U2 @1 \8 W
  72.                     Exit Do
      ~5 Q$ _. a: r
  73.                 ElseIf A3 > A4 Then8 p- I$ m5 z" V3 V) g7 y: Y
  74.                     A2 = A
    - W8 C0 ?! c* {5 N  a: S
  75.                 Else
    / n  ~* X$ b" c
  76.                     A1 = A
      M% Y7 ?  ]- B
  77.                 End If
    5 B% z7 }/ n& M- m1 W( |9 T/ |+ D
  78.             Loop7 D3 c! k% k# S3 Z
  79.         Else( A+ \' O8 A# L! {# e1 D
  80.             C.Delete: q3 F9 H- W( b
  81.             L1.Delete
    - ?$ K& Q9 ?" a4 ^4 M
  82.             Exit Sub; T4 |+ R! w/ `
  83.         End If5 q* Q: l1 q& X' j# L- X' [! J: C
  84.     End With
    ! \3 v8 z* p; f. i# Z2 l+ V8 g
  85. 10:
复制代码

评分

参与人数 1三维币 +10 收起 理由
2005llnn + 10 应助

查看全部评分

 楼主| 发表于 2015-12-30 00:09:55 | 显示全部楼层 来自: 中国广东惠州
, R9 r& J8 |  ]% k. c
来晚了,接收了,版主什么多会。
 楼主| 发表于 2016-1-16 21:20:29 | 显示全部楼层 来自: 中国广东惠州
本帖最后由 明天你好吗 于 2016-1-16 21:23 编辑
9 ^. P8 v. z- J, O" J) a) a( q5 o6 ]! B* a- N
版主大大,发现一个规律。只要以底边两端点为焦点作椭圆与圆相切,那么切点就是所求点。不知这个椭圆能否作出来? 2.png 3 ?% z: r0 z+ D1 i) c2 k; h
发表于 2016-1-17 02:34:53 | 显示全部楼层 来自: 中国辽宁营口
高次方程,常规作图方法无能为力
4 ~- ]% V% P- @! `+ h  ~死了这条心吧
 楼主| 发表于 2016-1-17 12:54:24 | 显示全部楼层 来自: 中国广东惠州
woaishuijia 发表于 2016-1-17 02:34
" Z  k- L) `9 j* Y高次方程,常规作图方法无能为力3 x5 x6 l2 Z* W
死了这条心吧

1 _+ j4 G. P  t还想着经常见到的现象能有常规解就好了
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

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