QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 唐昕晨 于 2016-1-27 21:17 编辑
( `6 r. j" _8 \; W- c: L- b* j$ n+ o# _6 m  D0 {' N* D$ m
2.png ; O' S: x- {  @1 A/ l# B- l& G
凸面镜反射,已知入射光线上一点与反射光线上一点,如何作入射光线与反射光线' Q; {5 T7 e& S; r% H
ttachimg]2272051[/attachimg]
image012.jpg
发表于 2015-12-25 04:29:33 | 显示全部楼层 来自: 中国黑龙江伊春
本帖最后由 woaishuijia 于 2015-12-25 08:04 编辑 4 `. @& ^* e4 Q" d8 C9 [: J. P
  1.     Dim P1 As Variant, P2 As Variant, P3 As Variant, R As Double
    ! \; u4 B& @0 ]
  2.     Dim B As AcadBlock, C As AcadCircle, L1 As AcadLine, L2 As AcadLine, L3 As AcadLine% V& I2 `7 G+ k6 |! [. }+ `
  3.     Dim A As Double, A1 As Double, A2 As Double, A3 As Double, A4 As Double% X- ?4 F4 _7 ~
  4.     With ThisDrawing
      W; E( y  o2 K+ ]( r, H; \
  5. '操作者屏幕输入参数
    6 l% V% f* v9 U% C: U( V
  6.         On Error GoTo 101 _/ Q# Z1 r. M) v/ O2 c7 A
  7.         With .Utility
    4 w3 T( V% t! v( `9 }# }
  8.             P1 = .GetPoint(, "指定圆外第一点")0 V( Y. T% ^. x4 [7 ?
  9.             P2 = .GetPoint(, "指定圆外同侧第二点")
    , X8 s. a1 g. u) G* S2 {# x
  10.             P3 = .GetPoint(, "指定圆心"), x5 f9 ]; y. ]3 w& q: Q9 M
  11.             R = .GetDistance(P3, "指定半径")
    ' J2 Y+ N! K8 C; D& I  W* H6 {
  12.         End With
    3 J4 T+ T: j% w
  13. '检查输入的参数,如果有一点或两点在圆内部,则退出宏9 C5 g0 x& t2 s8 g$ L* l, y8 x8 X
  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 107 B( F9 X2 k, T2 n4 Y' e$ q
  15. '判断作图空间* g: f; F# E! c9 O
  16.         If .ActiveSpace = acModelSpace Then
    % a6 C" T1 p, ]% Z* y- Y$ [
  17.             Set B = .ModelSpace
    . G' x( T3 s% \% Y( E
  18.         Else
    9 v# I) p* G* _) V
  19.             Set B = .PaperSpace/ T4 U  L  _9 w8 H! A) T
  20.         End If; Y: S: K, ^6 ]( c! G
  21. '按输入参数画圆7 _- D& J" ]0 _9 h  m; c7 N
  22.         Set C = B.AddCircle(P3, R)5 O' _/ U; h' m
  23. '在输入的圆外两点间连线
    ' l% Q: `/ U3 ^+ m- w; f9 y
  24.         Set L1 = B.AddLine(P2, P1)
    # V3 j% `' ~1 s6 v" D/ r! ?% O
  25. '检查连线与圆是否相交,如不相交则继续;如相交则删除圆和连线并结束宏
    # G; t- q8 A8 t4 _
  26.         P3 = C.IntersectWith(L1, acExtendNone)' H- j  s3 u9 t6 f
  27.         If UBound(P3) = -1 Then  W' B# R- a4 x) z& ~, T
  28. '将直线L1的起点改到圆心5 k1 V4 Y3 B! {
  29.             L1.StartPoint = C.Center
    $ V* m: m6 ^0 z: h& G
  30. '从圆心到输入的第二点画直线L2
    4 k9 \0 _" o$ t- k' A3 j: w( t+ @6 Y
  31.             Set L2 = B.AddLine(C.Center, P2)2 }$ j: u8 d# R  @; R! Y
  32. '用两直线的角度计算迭代运算的边界0 v* x" m3 v; a9 H9 C
  33.             If L1.Angle - L2.Angle > 0 Then  m, j0 o! v: M) c
  34.                 If L1.Angle - L2.Angle < .Utility.AngleToReal(180, acDegrees) Then8 l( i4 p- W" @5 i  ~
  35.                     A1 = L1.Angle3 q3 a6 C4 c! @) F, p* o) T
  36.                     A2 = L2.Angle
    . n  B) p. G: e7 T7 K* M
  37.                 Else# S7 P. \( R0 X' a
  38.                     L1.EndPoint = P21 z+ d7 v$ N# k6 o) B" A/ g
  39.                     L2.EndPoint = P1+ ]9 i& ?0 J3 B/ X) P7 R4 N, V
  40.                     A1 = L1.Angle
    3 X- O& [9 M2 b6 ^: ^" z
  41.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees)
    ) w& k- j$ l7 v. s; X# M
  42.                 End If$ b8 n& B( |: l( e$ ^6 w
  43.             Else7 {+ N2 `+ T2 g( k; R0 I
  44.                 If L2.Angle - L1.Angle < .Utility.AngleToReal(180, acDegrees) Then- X3 X' }9 R+ D! K
  45.                     L1.EndPoint = P26 E6 ]( g4 w0 E! q
  46.                     L2.EndPoint = P1
    ' R8 |" n( q) ?+ b$ \6 F
  47.                     A1 = L1.Angle/ K$ u( J5 X5 W
  48.                     A2 = L2.Angle
    : U# S1 F, x, K& Z. n9 n
  49.                 Else
    : b5 w: ]0 o, l& z% q6 H
  50.                     A1 = L1.Angle
    9 O$ [+ c5 T  o. C& Q9 e
  51.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees)+ f" V! R! S; |7 ?4 M
  52.                 End If
    1 m6 f  M6 C7 l- A
  53.             End If
      T, r. a4 O: U
  54. '以圆心为起点画第直线L3
    2 B/ P4 ~' [6 C8 ?, A
  55.             Set L3 = B.AddLine(C.Center, C.Center)
    0 R2 l/ a7 A# [) L# e7 X
  56. '循环,迭代运算
    ; A5 H" E! h# ^2 B1 L
  57.             Do
    " b  Q2 Y1 p: Z3 {9 G! O
  58. '简单的插值法
    7 n& D9 i& l1 e) p2 b. ~
  59.                 A = (A1 + A2) / 2
    0 o+ f5 V/ L: t
  60. '直线L3和入射和反射线的端点改到圆上尝试的点  U% u7 A1 b! S
  61.                 L3.EndPoint = .Utility.PolarPoint(C.Center, A, R)) v  l9 L* L/ x' L1 v
  62.                 L1.StartPoint = L3.EndPoint
      H& F' Z/ ]$ |3 y7 d
  63.                 L2.StartPoint = L3.EndPoint
      E8 V$ i# W4 H
  64. '计算入射和反射线分别与直线L3的夹角
    0 h/ g5 P* l. D% Q) }5 T0 j
  65.                 A3 = L1.Angle - L3.Angle
      @" H  q1 R9 h  }
  66.                 If A3 < 0 Then A3 = A3 + 2 * .Utility.AngleToReal(180, acDegrees): X) Z5 T5 ]' F% d. ?0 L( |
  67.                 A4 = L3.Angle - L2.Angle7 Q  _4 z# y/ R7 j
  68.                 If A4 < 0 Then A4 = A4 + 2 * .Utility.AngleToReal(180, acDegrees)
    , x5 i. T# z+ F. L" R: Q
  69. '如果两夹角相等或已运算到浮点数的最高精度则退出循环
    0 ~* ^( n# P+ @9 N) v; d
  70. '否则将当前尝试点作为新的边界继续循环运算; g" r0 L! Z  c! |) c3 b, R, X6 s
  71.                 If A3 = A4 Or A = A1 Or A = A2 Then( r, P: |* S4 y$ H
  72.                     Exit Do( S/ T$ y" X5 b# O+ j% T
  73.                 ElseIf A3 > A4 Then% G5 [3 Z* s) w, k
  74.                     A2 = A) N/ m* ^8 l3 M1 t: F) M* ?: Y
  75.                 Else
    % ]0 m4 D& a8 W; @% v
  76.                     A1 = A0 g, `: o5 I7 y0 h% C
  77.                 End If3 {/ y$ W% H$ N. \6 w+ o0 P
  78.             Loop  w' [; r3 F7 K) H" L
  79.         Else
    4 E. e  a2 q( t
  80.             C.Delete- |4 M6 f. E+ N5 W- Z: }
  81.             L1.Delete' R7 ]3 j0 z) c
  82.             Exit Sub
    5 z  X1 t% i) ^: Y! V% f) _1 H  Z
  83.         End If2 g. ^" N5 v' c0 J* E
  84.     End With! ?9 T) h# D; V2 O0 Y
  85. 10:
复制代码

评分

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

查看全部评分

 楼主| 发表于 2015-12-30 00:09:55 | 显示全部楼层 来自: 中国广东惠州
3 e: k7 q3 V4 V( B" m
来晚了,接收了,版主什么多会。
 楼主| 发表于 2016-1-16 21:20:29 | 显示全部楼层 来自: 中国广东惠州
本帖最后由 明天你好吗 于 2016-1-16 21:23 编辑 6 l$ e" b4 B, o7 e( u3 ~

, F9 W3 N5 l+ A% b4 [$ x2 w* j版主大大,发现一个规律。只要以底边两端点为焦点作椭圆与圆相切,那么切点就是所求点。不知这个椭圆能否作出来? 2.png 0 X! s6 h  _" g# n  J& n- b5 O* ]
发表于 2016-1-17 02:34:53 | 显示全部楼层 来自: 中国辽宁营口
高次方程,常规作图方法无能为力* }0 G# a; q  G5 I/ s- Z* R0 O) x
死了这条心吧
 楼主| 发表于 2016-1-17 12:54:24 | 显示全部楼层 来自: 中国广东惠州
woaishuijia 发表于 2016-1-17 02:34$ ^- y: p+ H) ^* C1 A
高次方程,常规作图方法无能为力7 j% K3 \1 R( R9 R
死了这条心吧
  X( \6 k; \- d% }
还想着经常见到的现象能有常规解就好了
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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