QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
7天前
查看: 2573|回复: 5
收起左侧

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

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

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

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

x
本帖最后由 唐昕晨 于 2016-1-27 21:17 编辑 $ H+ s7 ^+ }3 ~$ }& g" N
& D- T) H- L# r/ j5 V8 ]
2.png 4 {9 \& H+ P2 i# R4 J
凸面镜反射,已知入射光线上一点与反射光线上一点,如何作入射光线与反射光线
9 O$ L  u2 g  Y  _! R1 M2 Xttachimg]2272051[/attachimg]
image012.jpg
发表于 2015-12-25 04:29:33 | 显示全部楼层 来自: 中国黑龙江伊春
本帖最后由 woaishuijia 于 2015-12-25 08:04 编辑 * O. Y2 i3 z! s2 b& z& J4 K6 K! E0 ~
  1.     Dim P1 As Variant, P2 As Variant, P3 As Variant, R As Double1 ~5 B* l) G/ ~  ]& d5 D
  2.     Dim B As AcadBlock, C As AcadCircle, L1 As AcadLine, L2 As AcadLine, L3 As AcadLine
      Z9 Z7 ^# x( Y" a. }$ u
  3.     Dim A As Double, A1 As Double, A2 As Double, A3 As Double, A4 As Double+ H4 h! P; J' x# v
  4.     With ThisDrawing
    & e+ Q/ F! L+ ?8 g% x" E
  5. '操作者屏幕输入参数
    9 p2 T6 I. v. N* z8 R  }
  6.         On Error GoTo 10
    * N% L3 m( ~+ s* `$ l0 |
  7.         With .Utility
    , C& f' o! G/ x  y9 t; @. A
  8.             P1 = .GetPoint(, "指定圆外第一点")( W' G8 I# K' V7 {5 H
  9.             P2 = .GetPoint(, "指定圆外同侧第二点")% r: h# f3 ^& J$ K/ w
  10.             P3 = .GetPoint(, "指定圆心"). {- G( T. g! Z3 h5 i% B5 s8 T7 K
  11.             R = .GetDistance(P3, "指定半径")
    * l6 `, K7 q* n1 K2 M
  12.         End With2 t4 r5 R/ K# G' M& `6 j
  13. '检查输入的参数,如果有一点或两点在圆内部,则退出宏
    ) K* D) @9 h7 y6 s
  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
    * P6 [$ o  f7 \+ I7 F3 \( Z
  15. '判断作图空间; n0 Q, [6 M/ z
  16.         If .ActiveSpace = acModelSpace Then, s) U5 |% \5 `6 w$ O) T
  17.             Set B = .ModelSpace
    + {8 o" O6 d( K2 j( _+ a8 y
  18.         Else
    & P7 s  @. A7 D. z, y8 v6 w+ q
  19.             Set B = .PaperSpace
    5 v+ P, w3 B3 c% R8 |8 V( Q
  20.         End If9 |" q+ \, R) Y% |- {% [) U
  21. '按输入参数画圆0 [# q: A" T3 K& N
  22.         Set C = B.AddCircle(P3, R)
    9 d9 i) f3 I, Q8 O
  23. '在输入的圆外两点间连线& a( T4 o! q* O$ F6 H+ W# d& x/ V
  24.         Set L1 = B.AddLine(P2, P1)
    3 w# q; h; q5 d! W
  25. '检查连线与圆是否相交,如不相交则继续;如相交则删除圆和连线并结束宏
    4 d4 x) v* a+ L1 V. q8 P& X: D8 ~
  26.         P3 = C.IntersectWith(L1, acExtendNone)
    + B( G! F1 k3 h& R/ [1 Q" T2 c
  27.         If UBound(P3) = -1 Then* R. r- a0 J0 K; z1 Y3 V
  28. '将直线L1的起点改到圆心
    7 D( o" V9 {; M+ L2 Z  W: B
  29.             L1.StartPoint = C.Center  ]+ J' P" }2 B
  30. '从圆心到输入的第二点画直线L2- x4 D; S+ F& q' t) }
  31.             Set L2 = B.AddLine(C.Center, P2)) ^8 P& ~5 [" g& g; E# H* `9 A
  32. '用两直线的角度计算迭代运算的边界
    : i$ L& m& n# t) k( h: m( X& I0 g
  33.             If L1.Angle - L2.Angle > 0 Then6 G% O( L8 @2 h8 g& l
  34.                 If L1.Angle - L2.Angle < .Utility.AngleToReal(180, acDegrees) Then
    1 U2 d3 Z& ]) q( p0 Z
  35.                     A1 = L1.Angle5 N  r0 ^/ N# z- L
  36.                     A2 = L2.Angle# V3 n+ z/ d2 |% k' S# v5 N
  37.                 Else
    ! f7 E- {( j8 Q0 C- y
  38.                     L1.EndPoint = P2+ u/ I  E, s' H4 f$ h) |' ~
  39.                     L2.EndPoint = P1/ ]3 {6 T4 A1 U  h5 S$ _6 w
  40.                     A1 = L1.Angle4 }# R& h7 X" E9 S  q6 G: I% B
  41.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees)
    . a& ^+ i/ ]- P) h4 k
  42.                 End If. H5 i' L& L% v* X
  43.             Else+ V. J" ^6 q1 {, e. k* h( t
  44.                 If L2.Angle - L1.Angle < .Utility.AngleToReal(180, acDegrees) Then4 h. p: h2 f5 z( t& u' V7 p' f9 O
  45.                     L1.EndPoint = P2
    / a5 ~1 v# |7 C! U/ K4 F" \
  46.                     L2.EndPoint = P1/ F; ^) L  _" L  }7 q* d; v
  47.                     A1 = L1.Angle
    1 x* L4 |9 ]5 y
  48.                     A2 = L2.Angle
      p7 ~3 z, B. r/ {
  49.                 Else
    ; A! F2 n5 X6 P
  50.                     A1 = L1.Angle6 j# _6 e% S8 j& z( j/ D
  51.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees)
    0 E' B2 G  z; R" R2 Z/ `+ \
  52.                 End If
    ; e. f9 {. R' b1 A
  53.             End If3 ^+ N, j+ ^. e
  54. '以圆心为起点画第直线L36 M: N4 c: w% R( S5 R7 a+ D! U
  55.             Set L3 = B.AddLine(C.Center, C.Center)
    ' Q+ \; t8 V; @4 L$ o, A
  56. '循环,迭代运算
    . r! l, e0 R' {9 n$ `, P7 Z1 j  ]
  57.             Do
    ; ]: z' v2 S' c: G9 N7 X: m: N
  58. '简单的插值法6 |& X0 V: e5 l: O. _$ F
  59.                 A = (A1 + A2) / 2
    % V1 \5 o5 s1 L, b" C  m! Q
  60. '直线L3和入射和反射线的端点改到圆上尝试的点+ W2 m" A" X, m
  61.                 L3.EndPoint = .Utility.PolarPoint(C.Center, A, R)) u0 r7 ]% |! X/ c5 b! V# d
  62.                 L1.StartPoint = L3.EndPoint8 m# U# s1 U' g* u" N( K
  63.                 L2.StartPoint = L3.EndPoint
    ) d3 Z8 @0 ^/ y2 L7 l
  64. '计算入射和反射线分别与直线L3的夹角
    9 w3 i' v9 Y; ~. g
  65.                 A3 = L1.Angle - L3.Angle; h% v4 s& v6 t' p1 S+ P
  66.                 If A3 < 0 Then A3 = A3 + 2 * .Utility.AngleToReal(180, acDegrees)
    : b1 p* |2 x$ ~9 O8 P( e
  67.                 A4 = L3.Angle - L2.Angle9 G; s' w; P. J0 Q: G
  68.                 If A4 < 0 Then A4 = A4 + 2 * .Utility.AngleToReal(180, acDegrees)2 y6 U  n- E: b* H# P
  69. '如果两夹角相等或已运算到浮点数的最高精度则退出循环
    " B( G8 L$ v% a4 ~/ e3 P
  70. '否则将当前尝试点作为新的边界继续循环运算
    % Y& T/ K4 n# i
  71.                 If A3 = A4 Or A = A1 Or A = A2 Then
    9 |# n% C, Y1 T
  72.                     Exit Do: K; N$ U  G* |( r- L9 ?
  73.                 ElseIf A3 > A4 Then  R  H- h! P( v: Y" U' \
  74.                     A2 = A3 D# B( |2 e7 d
  75.                 Else
    ; z9 N3 q7 ]7 B9 I
  76.                     A1 = A: Y0 x: d6 b! K7 q9 B
  77.                 End If' x+ }$ ~) h: n* {% ]3 X; h  G
  78.             Loop2 W' g" X9 c" c5 O1 [6 y( S
  79.         Else
    ) G0 a) C8 D% A3 c
  80.             C.Delete
    ; ]/ {' I! D+ O7 J) _
  81.             L1.Delete/ D  y7 D  a5 u0 @
  82.             Exit Sub1 ~  U; t7 d, {8 r; i
  83.         End If
    2 I+ s* r4 E/ _- X6 w, o# U2 p
  84.     End With
    4 ^, z9 t7 b; C8 J6 X2 ~! A4 w
  85. 10:
复制代码

评分

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

查看全部评分

 楼主| 发表于 2015-12-30 00:09:55 | 显示全部楼层 来自: 中国广东惠州

( r) Y/ v# P" Y. j来晚了,接收了,版主什么多会。
 楼主| 发表于 2016-1-16 21:20:29 | 显示全部楼层 来自: 中国广东惠州
本帖最后由 明天你好吗 于 2016-1-16 21:23 编辑 0 Y& n; _5 {+ u4 |

; ?4 N0 q* [7 G+ X% ^+ q$ ?版主大大,发现一个规律。只要以底边两端点为焦点作椭圆与圆相切,那么切点就是所求点。不知这个椭圆能否作出来? 2.png
0 j7 d& t' M  d: G
发表于 2016-1-17 02:34:53 | 显示全部楼层 来自: 中国辽宁营口
高次方程,常规作图方法无能为力
) R! o% m8 s% k死了这条心吧
 楼主| 发表于 2016-1-17 12:54:24 | 显示全部楼层 来自: 中国广东惠州
woaishuijia 发表于 2016-1-17 02:34
( w; h, P' h# X# B6 V, ~7 \, r高次方程,常规作图方法无能为力) Y# w$ _8 K* `% X" a
死了这条心吧

% C$ ?! q: F  z# @0 L. F! l, _还想着经常见到的现象能有常规解就好了
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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