QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 唐昕晨 于 2016-1-27 21:17 编辑
8 [; U- `7 j  c, G& c5 u6 i" e% P' Q
2.png
6 D; F  R; T2 n8 l5 b# h8 ~3 s: k- E$ o凸面镜反射,已知入射光线上一点与反射光线上一点,如何作入射光线与反射光线
4 d/ c' u5 p: k6 U0 S  @" u0 pttachimg]2272051[/attachimg]
image012.jpg
发表于 2015-12-25 04:29:33 | 显示全部楼层 来自: 中国黑龙江伊春
本帖最后由 woaishuijia 于 2015-12-25 08:04 编辑
' y/ i6 p9 N$ }
  1.     Dim P1 As Variant, P2 As Variant, P3 As Variant, R As Double
    8 N% Z& P; V. p1 X2 N( w7 r
  2.     Dim B As AcadBlock, C As AcadCircle, L1 As AcadLine, L2 As AcadLine, L3 As AcadLine
    ' |9 r6 @+ f/ D* m1 n: n2 ]
  3.     Dim A As Double, A1 As Double, A2 As Double, A3 As Double, A4 As Double! U/ T0 k# Y) g3 s5 o" D$ e
  4.     With ThisDrawing
    4 J5 o6 M/ L3 k
  5. '操作者屏幕输入参数3 E$ T$ T$ }, G, m' Y
  6.         On Error GoTo 10
    * K) l) P, O1 W1 P) p3 \
  7.         With .Utility
    ) q. e/ M( Z& S0 r9 }7 L
  8.             P1 = .GetPoint(, "指定圆外第一点")$ Z- w* c0 O) J$ x( P: t
  9.             P2 = .GetPoint(, "指定圆外同侧第二点")% C" p! ]. T2 V; v5 m+ [  w" k
  10.             P3 = .GetPoint(, "指定圆心")
    7 _% p, I! b& Z" s
  11.             R = .GetDistance(P3, "指定半径")* J, ~& S% T5 O& P+ C. g) z( S- x
  12.         End With% j! O( L8 G& V2 N( i8 v
  13. '检查输入的参数,如果有一点或两点在圆内部,则退出宏
    ; c' {  ^2 c2 {. F! s5 ]( z
  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 100 r" [  k0 q/ _, H7 A& g
  15. '判断作图空间2 Q" ?1 A9 A* K" C  b; Q1 z1 I/ n
  16.         If .ActiveSpace = acModelSpace Then5 H1 N$ `2 [# S/ ?# O
  17.             Set B = .ModelSpace0 ]9 n; v* W7 C
  18.         Else
    % F" i$ y$ c& s5 t7 o
  19.             Set B = .PaperSpace
    * A: k* e" u9 e+ C- O3 w
  20.         End If& `0 F1 O5 m) I( e: \. a/ i
  21. '按输入参数画圆
    4 B  Y/ @6 L/ k; e/ k) m+ O; G
  22.         Set C = B.AddCircle(P3, R)! o9 A9 d! f* G" {/ Q3 `
  23. '在输入的圆外两点间连线
    & C% F2 ~# R, V5 b( Y, S; X' p
  24.         Set L1 = B.AddLine(P2, P1)
    - d5 M, ^6 `9 D1 M) _5 n0 `
  25. '检查连线与圆是否相交,如不相交则继续;如相交则删除圆和连线并结束宏1 t/ W3 x0 H3 o6 X& `2 [
  26.         P3 = C.IntersectWith(L1, acExtendNone). k$ y  a9 r# [0 n# u' O9 c
  27.         If UBound(P3) = -1 Then% N) z7 b4 ]0 S, |$ c7 I% K4 P% |
  28. '将直线L1的起点改到圆心
    - A7 x2 D1 x! N) h( R9 o
  29.             L1.StartPoint = C.Center0 l/ r3 W; T$ u7 `
  30. '从圆心到输入的第二点画直线L2
    1 n& h( \' D4 c: M+ Q
  31.             Set L2 = B.AddLine(C.Center, P2)
    8 ~2 l2 r3 w- j& R1 D+ w2 m; W
  32. '用两直线的角度计算迭代运算的边界! k: R+ g' e; _& K) k! j6 R
  33.             If L1.Angle - L2.Angle > 0 Then
    % Z& j2 R6 j% Y$ Z4 D( f
  34.                 If L1.Angle - L2.Angle < .Utility.AngleToReal(180, acDegrees) Then
    , i1 A7 y0 h: Y8 |
  35.                     A1 = L1.Angle
    8 P* k0 |0 B. O3 N' U% n
  36.                     A2 = L2.Angle
    3 ]7 u1 w3 U0 _4 z; n- X2 T% K
  37.                 Else
    4 D0 `5 i6 {1 U2 U9 z; [+ O
  38.                     L1.EndPoint = P2
    " R5 S2 d0 j, q: b* p. S! L
  39.                     L2.EndPoint = P1
    ( t' f2 o" r) }" C/ n
  40.                     A1 = L1.Angle/ }' X. x. l/ D
  41.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees)3 E% W% x2 i6 t3 b3 J( ~5 Q% y
  42.                 End If7 w, |2 E0 ]) R% O8 \1 j- d# r
  43.             Else
    % z+ M- z; j1 @
  44.                 If L2.Angle - L1.Angle < .Utility.AngleToReal(180, acDegrees) Then! I% B( W3 a+ w, n) L6 ~
  45.                     L1.EndPoint = P28 K# J, Y% m+ t8 L
  46.                     L2.EndPoint = P1
    & S" V7 y( c3 A+ }3 a- }! N4 l
  47.                     A1 = L1.Angle* S9 J; I! e2 k( j
  48.                     A2 = L2.Angle
    & a$ D# N# z$ q' l: b3 {
  49.                 Else! S! h. `1 |" m" \3 g& Y' u) n
  50.                     A1 = L1.Angle9 I0 Q  k" P+ W4 r1 g
  51.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees)1 q% y. ]% Q  Z' x9 q
  52.                 End If
    2 R0 t" d% ?9 E3 N$ J5 b
  53.             End If2 w0 N8 R3 H" H; ^3 s  o' E
  54. '以圆心为起点画第直线L35 j; D8 t: f5 I: \# c
  55.             Set L3 = B.AddLine(C.Center, C.Center)( o! k$ c( s) d9 W  @
  56. '循环,迭代运算
    : t9 J: E8 c9 _" x$ j% e% ]+ d
  57.             Do4 U5 q: `6 U6 m# s
  58. '简单的插值法" a0 F, o5 v" I( }2 i
  59.                 A = (A1 + A2) / 2* i- V: V- k1 S4 e# o% h
  60. '直线L3和入射和反射线的端点改到圆上尝试的点/ i$ t+ z6 K! ~) [& k
  61.                 L3.EndPoint = .Utility.PolarPoint(C.Center, A, R)0 ~! A+ d0 x2 H7 N
  62.                 L1.StartPoint = L3.EndPoint
    % b. k* d( r# b3 ]5 r3 n
  63.                 L2.StartPoint = L3.EndPoint2 l- a( D) H5 X6 ?! f; |
  64. '计算入射和反射线分别与直线L3的夹角% V+ e5 f, e( H. [. R# j
  65.                 A3 = L1.Angle - L3.Angle
    # b) n& t9 D! x2 H, U
  66.                 If A3 < 0 Then A3 = A3 + 2 * .Utility.AngleToReal(180, acDegrees)
    1 n& b" o2 G) N  S% f. I
  67.                 A4 = L3.Angle - L2.Angle3 ?, M$ b+ h3 L$ ^3 k
  68.                 If A4 < 0 Then A4 = A4 + 2 * .Utility.AngleToReal(180, acDegrees)* ?( v, B% h* T: ^4 }
  69. '如果两夹角相等或已运算到浮点数的最高精度则退出循环) R* J* t6 p, T$ W' i, s( ]
  70. '否则将当前尝试点作为新的边界继续循环运算
    7 o3 }( U- S7 \) y; g3 W! E  Y
  71.                 If A3 = A4 Or A = A1 Or A = A2 Then
    % Q' I( d/ S8 ?: K3 \
  72.                     Exit Do% E: |' Z2 \  g3 ?& S
  73.                 ElseIf A3 > A4 Then
    1 O& V9 H( e- R% v
  74.                     A2 = A  D  ^: `/ L; T+ `" c' W
  75.                 Else
    ; K; C3 m) e, Y" X! O1 `
  76.                     A1 = A
    , `: P. m5 ]& {/ O3 @
  77.                 End If3 a4 k6 b* V% q0 c; S
  78.             Loop6 {& \9 i/ q0 M# \( |8 a
  79.         Else
    : ]/ G, T0 ~( x5 X- j
  80.             C.Delete
    . ?: A! p+ e7 x3 X8 x. q
  81.             L1.Delete/ q6 Q' ?. z: H3 ?
  82.             Exit Sub5 t- `0 \1 n8 F& ^; x- ?" P0 e
  83.         End If+ M* {+ o2 @2 [7 @
  84.     End With1 R) r; f( q3 h( |1 d- J
  85. 10:
复制代码

评分

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

查看全部评分

 楼主| 发表于 2015-12-30 00:09:55 | 显示全部楼层 来自: 中国广东惠州
% S9 `; f8 Q  F. W- [3 B
来晚了,接收了,版主什么多会。
 楼主| 发表于 2016-1-16 21:20:29 | 显示全部楼层 来自: 中国广东惠州
本帖最后由 明天你好吗 于 2016-1-16 21:23 编辑 ) P5 Q9 t# ]* t/ t
% |3 R+ C, u  \8 Z$ m1 |
版主大大,发现一个规律。只要以底边两端点为焦点作椭圆与圆相切,那么切点就是所求点。不知这个椭圆能否作出来? 2.png
) u) i7 a' L6 j
发表于 2016-1-17 02:34:53 | 显示全部楼层 来自: 中国辽宁营口
高次方程,常规作图方法无能为力
( _3 q# K7 O) o: _& P死了这条心吧
 楼主| 发表于 2016-1-17 12:54:24 | 显示全部楼层 来自: 中国广东惠州
woaishuijia 发表于 2016-1-17 02:34$ V2 n9 l6 m. I1 X- t  a! P
高次方程,常规作图方法无能为力
, L0 D- @, ^; Q* G3 b死了这条心吧

; A, g+ O6 ^, l7 Z5 i0 E还想着经常见到的现象能有常规解就好了
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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