QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 唐昕晨 于 2016-1-27 21:17 编辑
/ E5 ~' J/ ]( M2 U6 ?# {3 L; z+ M& t* p2 @2 A8 l: N' `7 \
2.png
0 r/ i2 X& I0 q! [凸面镜反射,已知入射光线上一点与反射光线上一点,如何作入射光线与反射光线& F$ X1 v% [! o# |
ttachimg]2272051[/attachimg]
image012.jpg
发表于 2015-12-25 04:29:33 | 显示全部楼层 来自: 中国黑龙江伊春
本帖最后由 woaishuijia 于 2015-12-25 08:04 编辑 ; i8 v; ]5 e1 P* [' N  t% A
  1.     Dim P1 As Variant, P2 As Variant, P3 As Variant, R As Double
    + s% _* F; @3 H3 F/ }' J
  2.     Dim B As AcadBlock, C As AcadCircle, L1 As AcadLine, L2 As AcadLine, L3 As AcadLine& N) y/ Q3 i+ `8 ]- w1 x+ |  h" F
  3.     Dim A As Double, A1 As Double, A2 As Double, A3 As Double, A4 As Double
      A+ J4 I" R; [  S9 q9 p1 |8 e
  4.     With ThisDrawing
    / N+ Q* O. y. ~# e1 h7 W7 z
  5. '操作者屏幕输入参数
    ; c$ c7 {7 k8 {0 m! J
  6.         On Error GoTo 102 z7 d% Y5 _+ \4 _. [
  7.         With .Utility! y& e9 y1 ~( w" e6 u1 i
  8.             P1 = .GetPoint(, "指定圆外第一点")
    $ u5 b1 t) E# ~, z+ _) g6 Y
  9.             P2 = .GetPoint(, "指定圆外同侧第二点")/ q7 A) ?' Y% Y% v4 j+ z) R, E
  10.             P3 = .GetPoint(, "指定圆心")
      l9 n7 R$ F! C. L% C5 h, p
  11.             R = .GetDistance(P3, "指定半径")
    / U: A! w% W7 M
  12.         End With+ \0 X; @* l! A  Z& x
  13. '检查输入的参数,如果有一点或两点在圆内部,则退出宏
    4 l5 D, m+ W1 i) A4 o0 ?  @* j
  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  D" L& y  p- J  O
  15. '判断作图空间5 T6 L$ k) t( J3 T9 W0 N
  16.         If .ActiveSpace = acModelSpace Then
    $ H) m$ ^+ J; ?1 U
  17.             Set B = .ModelSpace
    9 C& Y  g! `3 W! L8 P
  18.         Else
    ! Q1 I  Z& W9 _# ~3 Q
  19.             Set B = .PaperSpace
    4 _8 F" z3 `1 @% z* r
  20.         End If' F) v4 R0 F* p; J9 Z$ |! ^* n
  21. '按输入参数画圆
    1 p! g8 t' a( I
  22.         Set C = B.AddCircle(P3, R)9 a0 @8 S2 T" d+ V$ D, P8 F7 s
  23. '在输入的圆外两点间连线
    " W" \2 N2 E! [  ]
  24.         Set L1 = B.AddLine(P2, P1)
    8 s: P9 ^! }- m8 I! S. n, [7 J
  25. '检查连线与圆是否相交,如不相交则继续;如相交则删除圆和连线并结束宏3 k* L+ c$ t# [* i* r# o
  26.         P3 = C.IntersectWith(L1, acExtendNone)
    6 A7 Z  n$ |  l& H6 W9 e
  27.         If UBound(P3) = -1 Then
    ' |2 Q% D0 P5 `' o! ?
  28. '将直线L1的起点改到圆心8 [7 c- v: M9 V4 h/ }
  29.             L1.StartPoint = C.Center
    , v, j+ e7 R. B2 \/ v% T2 z
  30. '从圆心到输入的第二点画直线L25 k0 J6 }3 t1 x. H
  31.             Set L2 = B.AddLine(C.Center, P2)
    % E) a1 c& U$ X; \7 C
  32. '用两直线的角度计算迭代运算的边界
    2 s" R! o; `  t4 e
  33.             If L1.Angle - L2.Angle > 0 Then* N. R/ `  @9 r& j$ S8 U
  34.                 If L1.Angle - L2.Angle < .Utility.AngleToReal(180, acDegrees) Then
    - T* ?5 T  T. H& H( C5 Z
  35.                     A1 = L1.Angle* L# v" a/ X" }& B6 W
  36.                     A2 = L2.Angle* ?. \' `4 T  c% K) i" ~% R* z
  37.                 Else0 |$ d/ i0 v; @" m( l- m( \4 i
  38.                     L1.EndPoint = P2/ {3 Q8 o, X4 p+ H
  39.                     L2.EndPoint = P1" e) [2 Z; w' L: _$ Y( Z
  40.                     A1 = L1.Angle
    ! }6 r* G- i2 q8 _6 D+ Z3 S
  41.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees)3 G) _0 s# s1 g1 z/ T8 \1 `
  42.                 End If
    ) E% j/ b) E7 F. U5 ?+ Q
  43.             Else
    3 j$ p& V. H1 u( P" V. S9 s
  44.                 If L2.Angle - L1.Angle < .Utility.AngleToReal(180, acDegrees) Then
    8 ?8 I0 D6 v4 u  f
  45.                     L1.EndPoint = P2% C+ J. K8 D* |! x! `3 A3 @' p7 x
  46.                     L2.EndPoint = P1. g% T' v: m. T5 O# N+ P
  47.                     A1 = L1.Angle' |- d6 e; q; @2 D0 ^
  48.                     A2 = L2.Angle, Q# |5 q8 q+ {5 j* x# g
  49.                 Else
    1 s' n/ z: U/ f9 K, E% j
  50.                     A1 = L1.Angle# @8 {4 C$ Q: i
  51.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees)! t8 Q& ?0 N! n' z# N# k% _7 h
  52.                 End If' N$ [& ~- E  k& y4 N
  53.             End If' g  z+ n4 w- j! m5 }
  54. '以圆心为起点画第直线L3! P# p* j& Q0 v3 O+ W7 A
  55.             Set L3 = B.AddLine(C.Center, C.Center): x3 _3 a& m& L: v- _0 N5 K2 a* @
  56. '循环,迭代运算
    - v! U0 o  x- M$ q) a
  57.             Do4 l  d$ _7 ]) z+ B. {: w1 c
  58. '简单的插值法( l1 S! h0 f- d
  59.                 A = (A1 + A2) / 2
      X& R* a6 V+ V& }& `8 V7 c5 ?
  60. '直线L3和入射和反射线的端点改到圆上尝试的点: k: N: \) }9 w4 h' f# K1 x" o
  61.                 L3.EndPoint = .Utility.PolarPoint(C.Center, A, R)
    / [% x' o8 D8 c; K/ o4 G2 S
  62.                 L1.StartPoint = L3.EndPoint
    5 q) l$ w+ Z9 ^4 w4 P  H( a
  63.                 L2.StartPoint = L3.EndPoint. R. _0 G; }$ `' E
  64. '计算入射和反射线分别与直线L3的夹角
    / ]  X) n* J9 M5 ?# a
  65.                 A3 = L1.Angle - L3.Angle
    ; Q/ O/ \8 u: F1 \2 v+ [
  66.                 If A3 < 0 Then A3 = A3 + 2 * .Utility.AngleToReal(180, acDegrees)
    / q/ a4 y# H+ p, W
  67.                 A4 = L3.Angle - L2.Angle
    - N, I2 A) |; m
  68.                 If A4 < 0 Then A4 = A4 + 2 * .Utility.AngleToReal(180, acDegrees)
    5 i# O2 g& e2 d6 ?+ V3 E. |9 _
  69. '如果两夹角相等或已运算到浮点数的最高精度则退出循环7 C0 f& |8 O9 C7 z
  70. '否则将当前尝试点作为新的边界继续循环运算; k& \- a' _: x1 T
  71.                 If A3 = A4 Or A = A1 Or A = A2 Then
    7 l) F! n5 o* I3 t$ K5 H0 v
  72.                     Exit Do
    $ ~& }) C% d. E7 ?0 D- W0 ?1 m
  73.                 ElseIf A3 > A4 Then- |9 U# D5 C9 r, B- |
  74.                     A2 = A% r5 O3 D! `% X* O9 G
  75.                 Else: k+ s% _1 k: }8 R& F
  76.                     A1 = A
    1 G' P* X8 a- S# B, [
  77.                 End If
    # l7 \8 Q: F7 R6 `
  78.             Loop& F, C' Z7 m6 c* V: T8 B
  79.         Else
    $ `4 g1 B9 X/ _0 x% U* |2 R/ G
  80.             C.Delete
    1 {3 [; s. o" u3 r9 F8 H3 o1 {
  81.             L1.Delete
    * P( d2 a$ }6 N  |
  82.             Exit Sub
    ; v4 }: _  k- w  v# n0 R
  83.         End If, e, T& Y8 U. A9 \& l/ ^, G
  84.     End With
    , ^/ {2 x' D# F& Z. c2 o6 g
  85. 10:
复制代码

评分

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

查看全部评分

 楼主| 发表于 2015-12-30 00:09:55 | 显示全部楼层 来自: 中国广东惠州
  P1 S- A5 ]# F5 N$ x, J2 h/ x
来晚了,接收了,版主什么多会。
 楼主| 发表于 2016-1-16 21:20:29 | 显示全部楼层 来自: 中国广东惠州
本帖最后由 明天你好吗 于 2016-1-16 21:23 编辑
. S8 Q4 ]; |; g6 A% _  J/ B4 r9 f# [2 a4 B
版主大大,发现一个规律。只要以底边两端点为焦点作椭圆与圆相切,那么切点就是所求点。不知这个椭圆能否作出来? 2.png
7 Y! _9 G% L( }! f
发表于 2016-1-17 02:34:53 | 显示全部楼层 来自: 中国辽宁营口
高次方程,常规作图方法无能为力2 U8 L% S9 u* g  \2 J* V
死了这条心吧
 楼主| 发表于 2016-1-17 12:54:24 | 显示全部楼层 来自: 中国广东惠州
woaishuijia 发表于 2016-1-17 02:34
* N+ [- F1 j" |9 w% N2 I7 N+ M高次方程,常规作图方法无能为力
: L! o' o5 e& A' d: [死了这条心吧

) ^. p3 G! [6 k9 \8 c2 d5 j+ l还想着经常见到的现象能有常规解就好了
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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