QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 唐昕晨 于 2016-1-27 21:17 编辑
: v, ]: i" l. ^/ }  N( [
( @& j' [  v. Q% g% [ 2.png - b8 z/ n) v1 L0 [5 e
凸面镜反射,已知入射光线上一点与反射光线上一点,如何作入射光线与反射光线: B$ }' C, K% @' p2 x# P+ r
ttachimg]2272051[/attachimg]
image012.jpg
发表于 2015-12-25 04:29:33 | 显示全部楼层 来自: 中国黑龙江伊春
本帖最后由 woaishuijia 于 2015-12-25 08:04 编辑
. s" k8 ^9 f7 K4 m& f
  1.     Dim P1 As Variant, P2 As Variant, P3 As Variant, R As Double: k$ F) W- Y( E: T1 k3 e
  2.     Dim B As AcadBlock, C As AcadCircle, L1 As AcadLine, L2 As AcadLine, L3 As AcadLine
    1 X: W! \4 E, ]- ^, n# G
  3.     Dim A As Double, A1 As Double, A2 As Double, A3 As Double, A4 As Double2 S! C$ l% o" ]( q" O
  4.     With ThisDrawing
    & h, v: k. i0 F) b2 B7 j
  5. '操作者屏幕输入参数
    7 y( h1 H! @, y
  6.         On Error GoTo 10& Q" Q  I% K3 \. @  b
  7.         With .Utility- j- h; d" [9 S) c9 s3 P
  8.             P1 = .GetPoint(, "指定圆外第一点")
    ; k3 V0 z9 {  J( ]5 g# M. Z; C1 Y. V
  9.             P2 = .GetPoint(, "指定圆外同侧第二点"), O/ N- b" ^$ C! _9 M7 A
  10.             P3 = .GetPoint(, "指定圆心")
    4 Q9 k6 {* i% J+ f+ B
  11.             R = .GetDistance(P3, "指定半径")+ \6 l, L9 A) X. I
  12.         End With
    1 o- \! f: F$ t3 h
  13. '检查输入的参数,如果有一点或两点在圆内部,则退出宏/ F4 y) \) h( E6 x0 \$ N
  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% U* x' q' ^* f' z2 Y2 z
  15. '判断作图空间% x8 ~7 f. I+ c6 A# m5 l) t
  16.         If .ActiveSpace = acModelSpace Then2 k# r7 j5 G0 l9 |
  17.             Set B = .ModelSpace2 L) ]" C0 O: L% L$ Q
  18.         Else+ J% s' E! [7 k! z- u" i$ T
  19.             Set B = .PaperSpace
    - m2 o" h6 O9 r+ }
  20.         End If1 V0 W% l, r* L7 e8 |  K
  21. '按输入参数画圆, C9 h5 C/ Z' u8 V" x2 J
  22.         Set C = B.AddCircle(P3, R)' N# V3 S- F+ H3 w5 `  \0 W+ `7 A9 r
  23. '在输入的圆外两点间连线
    - L" y# p, m$ D( ^' o7 B
  24.         Set L1 = B.AddLine(P2, P1)( W( c- s; i" N6 Y
  25. '检查连线与圆是否相交,如不相交则继续;如相交则删除圆和连线并结束宏
    6 s8 V- h9 x; P' ~' x) j
  26.         P3 = C.IntersectWith(L1, acExtendNone)
    7 }* K4 |# l. @
  27.         If UBound(P3) = -1 Then+ }+ K% K$ ~$ Z3 T1 I6 m- u6 w
  28. '将直线L1的起点改到圆心2 e+ Y) d5 ]) Y- v
  29.             L1.StartPoint = C.Center4 F, D2 u7 W! v! B% G, a
  30. '从圆心到输入的第二点画直线L2. Q# v5 D2 v& r! m& F
  31.             Set L2 = B.AddLine(C.Center, P2)2 V5 F# H  {( b
  32. '用两直线的角度计算迭代运算的边界4 R& j( x0 N' ~0 G% C: X
  33.             If L1.Angle - L2.Angle > 0 Then* n  x8 c! d7 Y! |* p  L
  34.                 If L1.Angle - L2.Angle < .Utility.AngleToReal(180, acDegrees) Then' k; B7 }. M- m
  35.                     A1 = L1.Angle% l# d$ x0 `7 Y4 c4 [$ y- o
  36.                     A2 = L2.Angle; z- A/ }4 R4 `9 C
  37.                 Else
    6 }* F- s. J3 D$ Y. g4 e9 p8 |2 ?9 i7 q
  38.                     L1.EndPoint = P2
    & @% ]: u) K7 x
  39.                     L2.EndPoint = P19 R/ K4 t( h; e* ]
  40.                     A1 = L1.Angle' k, }- N9 T; q# A. R& f) _2 j
  41.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees); b1 r7 [, |8 U
  42.                 End If$ U4 l+ a# v7 ~5 e  c  F
  43.             Else/ y' |! {1 R' y
  44.                 If L2.Angle - L1.Angle < .Utility.AngleToReal(180, acDegrees) Then  h# \5 N7 N' t6 w) \% h3 A# E
  45.                     L1.EndPoint = P25 O1 B5 P9 e: q: z# P0 w  t! i4 _
  46.                     L2.EndPoint = P1. b2 F# e& @: Q* x: N1 b9 Y
  47.                     A1 = L1.Angle
    0 ~* V  f+ {$ u6 X0 C1 c
  48.                     A2 = L2.Angle
    : Z& X1 z3 S9 [6 E7 ~8 x5 Q8 Y
  49.                 Else
    6 V  |  o+ v; b/ g) c  e9 q
  50.                     A1 = L1.Angle. C4 y3 V8 v* x0 b3 `( P
  51.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees)# o1 e: G; D5 R  D9 q
  52.                 End If
    9 U6 U  K" Z& o2 Q+ i
  53.             End If
    : q( {8 Z. l6 f7 d% X
  54. '以圆心为起点画第直线L3/ b! u1 i: ^- S
  55.             Set L3 = B.AddLine(C.Center, C.Center)
    ' @9 a, `" K1 O) g& ]' O5 }. y: P
  56. '循环,迭代运算( V( m( ~* v/ @& |5 Q$ v$ X9 a
  57.             Do9 N# w! L5 ^, U: p2 A, p5 G* R
  58. '简单的插值法
    / U! d6 v! s' h2 t
  59.                 A = (A1 + A2) / 2
    - U* f' A3 U5 s7 s* Z
  60. '直线L3和入射和反射线的端点改到圆上尝试的点) n2 U/ i, A4 l
  61.                 L3.EndPoint = .Utility.PolarPoint(C.Center, A, R)
    , M$ |: W7 c0 C$ e6 m! }
  62.                 L1.StartPoint = L3.EndPoint6 H, Z3 G* w) Y$ s# ~: d) v
  63.                 L2.StartPoint = L3.EndPoint) }9 W1 t; W. G/ S* H3 j
  64. '计算入射和反射线分别与直线L3的夹角
    ' h  U  G, R- W2 G
  65.                 A3 = L1.Angle - L3.Angle: a. @2 g6 K  ^: y& I! {# o! M
  66.                 If A3 < 0 Then A3 = A3 + 2 * .Utility.AngleToReal(180, acDegrees)
    / @+ {+ O1 Q: m( C! ?: q% l
  67.                 A4 = L3.Angle - L2.Angle
    2 I) ^$ G* i; L! c8 Q1 o; p
  68.                 If A4 < 0 Then A4 = A4 + 2 * .Utility.AngleToReal(180, acDegrees)
    6 n3 a3 t2 H9 D4 q$ w
  69. '如果两夹角相等或已运算到浮点数的最高精度则退出循环. x: |& M$ d% S) D8 d6 L8 C% X5 [
  70. '否则将当前尝试点作为新的边界继续循环运算7 \* i- y; E) c7 S0 J
  71.                 If A3 = A4 Or A = A1 Or A = A2 Then
    , T& X0 o5 J1 I( }+ C
  72.                     Exit Do( r+ v& K" Q4 n- c% K
  73.                 ElseIf A3 > A4 Then- ]; E, R* P# n# f' M
  74.                     A2 = A" V) f  I7 G; g1 S+ w9 I) A
  75.                 Else
    1 W5 Q: ?: g: y2 S& `7 {& M
  76.                     A1 = A
    % e# i# s5 Z7 |5 R
  77.                 End If
    1 L! B, b$ Z1 [' D, C( z
  78.             Loop
    . s/ x  R3 Z; `) l6 q
  79.         Else
    3 i) S0 b! j! ]8 t$ T9 }" i: I; I
  80.             C.Delete
    $ x6 C/ [/ B  G  M. N$ ?6 F9 ~% ^
  81.             L1.Delete
      G( V, U& {( [& w+ D
  82.             Exit Sub
    3 ^/ X+ @) Y( Q& s# W8 A
  83.         End If
    3 ]" T% C( K+ i: M& K5 I5 `
  84.     End With
    & Q4 }4 N- }! {# i  q
  85. 10:
复制代码

评分

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

查看全部评分

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

& {& C1 }5 P) H2 A7 y: E0 w4 _5 ?来晚了,接收了,版主什么多会。
 楼主| 发表于 2016-1-16 21:20:29 | 显示全部楼层 来自: 中国广东惠州
本帖最后由 明天你好吗 于 2016-1-16 21:23 编辑
* I6 k  L# h5 l6 [8 o: H* e6 D
- ^1 Z+ d; {1 e版主大大,发现一个规律。只要以底边两端点为焦点作椭圆与圆相切,那么切点就是所求点。不知这个椭圆能否作出来? 2.png
$ }4 K2 K# ?; b$ y, H/ n
发表于 2016-1-17 02:34:53 | 显示全部楼层 来自: 中国辽宁营口
高次方程,常规作图方法无能为力
5 L  t7 A5 j; E, q死了这条心吧
 楼主| 发表于 2016-1-17 12:54:24 | 显示全部楼层 来自: 中国广东惠州
woaishuijia 发表于 2016-1-17 02:34
# M0 e  k* U& I. {$ ]* @高次方程,常规作图方法无能为力: e3 j# ~/ L# W% J7 x5 f! w  |; a
死了这条心吧

7 C5 a/ ^% ^" _还想着经常见到的现象能有常规解就好了
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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