QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 唐昕晨 于 2016-1-27 21:17 编辑 0 g3 U' ^7 e2 @- z. H( ?

4 c+ {; e8 m$ L7 Y 2.png . h5 n  M' J: R; {) n, h
凸面镜反射,已知入射光线上一点与反射光线上一点,如何作入射光线与反射光线
, F" b! k) r$ r, p) |ttachimg]2272051[/attachimg]
image012.jpg
发表于 2015-12-25 04:29:33 | 显示全部楼层 来自: 中国黑龙江伊春
本帖最后由 woaishuijia 于 2015-12-25 08:04 编辑 9 c- f# W2 e% P  O1 s
  1.     Dim P1 As Variant, P2 As Variant, P3 As Variant, R As Double3 ?+ z5 @1 V: ~' L8 }8 w4 e' \" S
  2.     Dim B As AcadBlock, C As AcadCircle, L1 As AcadLine, L2 As AcadLine, L3 As AcadLine
    - p$ s# @$ q# h* n' [. O5 o" O
  3.     Dim A As Double, A1 As Double, A2 As Double, A3 As Double, A4 As Double, s" s, E- |  W
  4.     With ThisDrawing2 j7 n; F2 f9 K1 t; v$ T8 a
  5. '操作者屏幕输入参数  U4 [% Z5 o% W( ^) z% o& ?: Q
  6.         On Error GoTo 10
    ( x# R/ {- l8 E: N5 N9 c  m. C( @
  7.         With .Utility7 \& x& u0 F3 i  ]* {9 F1 u
  8.             P1 = .GetPoint(, "指定圆外第一点")' G; o% ~5 ^6 ?3 l3 B: l
  9.             P2 = .GetPoint(, "指定圆外同侧第二点")
      n4 h: h0 W* x
  10.             P3 = .GetPoint(, "指定圆心")
    2 o* |- p8 N  f& J3 T9 c
  11.             R = .GetDistance(P3, "指定半径")& c, j3 T. P. |6 K
  12.         End With5 |1 P# I3 N* x( b
  13. '检查输入的参数,如果有一点或两点在圆内部,则退出宏
    $ H6 {& Z9 T9 x' w, ]
  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, E( b$ d7 `& s9 C0 p+ t8 w* [. _
  15. '判断作图空间
    0 l. O- U# M- x: J+ U+ h1 t
  16.         If .ActiveSpace = acModelSpace Then7 y$ X2 J  P( l: t7 N, M. U
  17.             Set B = .ModelSpace
    0 K3 Q( o4 y- t8 ~: I4 H9 y
  18.         Else
    : A4 s! {$ u( e" \" n
  19.             Set B = .PaperSpace3 t( G) Z5 N( H
  20.         End If
    - S, a1 z" I4 E$ k# |9 Y/ ^% @9 `! R! n
  21. '按输入参数画圆* G4 `) A3 z4 w' m% J, m8 g
  22.         Set C = B.AddCircle(P3, R)
    6 J" a9 i2 F8 @& [8 D
  23. '在输入的圆外两点间连线& y0 ?) |6 q8 q/ \; S- h
  24.         Set L1 = B.AddLine(P2, P1)
    - I) d5 h* V% s* y5 T
  25. '检查连线与圆是否相交,如不相交则继续;如相交则删除圆和连线并结束宏
    2 s+ f( i( ~7 b
  26.         P3 = C.IntersectWith(L1, acExtendNone)6 F) V; s2 h2 a3 E5 h. K, F( t
  27.         If UBound(P3) = -1 Then
    / {) `, ~; Q. Y
  28. '将直线L1的起点改到圆心! G7 H9 m+ r0 F7 S5 P
  29.             L1.StartPoint = C.Center
    * \8 X) j3 ^; N5 \- c
  30. '从圆心到输入的第二点画直线L2
    , _4 s, |2 Y2 u) V4 J+ C
  31.             Set L2 = B.AddLine(C.Center, P2)
    ; p' n+ ]2 A7 C1 X" A$ K4 n" J' i
  32. '用两直线的角度计算迭代运算的边界' ~* G$ ~! J" d1 v! i
  33.             If L1.Angle - L2.Angle > 0 Then
    ) ^1 V/ D/ M, f$ V
  34.                 If L1.Angle - L2.Angle < .Utility.AngleToReal(180, acDegrees) Then
      j/ @! Q- G# `+ W6 @
  35.                     A1 = L1.Angle' U1 l, n, I4 y$ c, v0 N
  36.                     A2 = L2.Angle4 z6 T; w& m: z# j
  37.                 Else
    / n; Y' i) Y/ C" I
  38.                     L1.EndPoint = P2
    # F6 ~$ O! |2 c3 w# I: E
  39.                     L2.EndPoint = P1% S9 D* e+ y7 \# }) D
  40.                     A1 = L1.Angle# q' a. t. {6 A9 E5 \
  41.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees)
    . y6 ]/ R# I6 u+ T' n
  42.                 End If/ P2 S6 t  U. c/ G- [
  43.             Else
    0 }6 z4 s1 J( y3 N( N$ }4 G
  44.                 If L2.Angle - L1.Angle < .Utility.AngleToReal(180, acDegrees) Then7 I# L, |! q$ W2 A3 k6 o+ K3 }
  45.                     L1.EndPoint = P2
    ( F# C9 J6 B/ G# h7 I8 k
  46.                     L2.EndPoint = P1
    3 d% `  W! j" p) A% R) W+ x
  47.                     A1 = L1.Angle
    8 G0 K1 K- y1 k5 w6 B
  48.                     A2 = L2.Angle
    7 b9 [; O1 _5 M
  49.                 Else
    4 t/ i$ q) P2 Y& u- ?
  50.                     A1 = L1.Angle! g6 L: B8 u4 `0 |9 J! K
  51.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees)4 b2 B! W) T: [5 \( U
  52.                 End If
    : V+ @/ D9 n. ^+ e9 ]* |9 x5 P8 W
  53.             End If
    % ~6 _# e4 a4 d/ t' O7 F
  54. '以圆心为起点画第直线L3
    $ J1 Y, `3 ?1 H
  55.             Set L3 = B.AddLine(C.Center, C.Center)
    + p/ N- ?* _6 R% [) H8 P
  56. '循环,迭代运算9 e1 |( {9 q' T: `" ~& `7 y
  57.             Do
    % _8 D$ \- w) ?% z' m
  58. '简单的插值法1 R5 Z" y& A" |6 m# ~$ L  f% i
  59.                 A = (A1 + A2) / 21 F: I0 g$ P; S$ ^5 ^
  60. '直线L3和入射和反射线的端点改到圆上尝试的点' n  D9 }2 u* L: I& [$ u
  61.                 L3.EndPoint = .Utility.PolarPoint(C.Center, A, R)
    % i5 }! d. I( Z' J1 H
  62.                 L1.StartPoint = L3.EndPoint9 y9 r& j, ~/ e- q, ?
  63.                 L2.StartPoint = L3.EndPoint3 I; |5 |  S2 s1 o$ [/ k. j% ]
  64. '计算入射和反射线分别与直线L3的夹角" i+ g4 H1 m! l3 l$ Z& e
  65.                 A3 = L1.Angle - L3.Angle
    5 s  p/ ?& a% o+ Y
  66.                 If A3 < 0 Then A3 = A3 + 2 * .Utility.AngleToReal(180, acDegrees)
    ( ~! F) u8 L; u
  67.                 A4 = L3.Angle - L2.Angle
    5 n* u: v' ]* _0 {9 v
  68.                 If A4 < 0 Then A4 = A4 + 2 * .Utility.AngleToReal(180, acDegrees)
    / i7 b. s7 A* |# h  _2 O& B/ u
  69. '如果两夹角相等或已运算到浮点数的最高精度则退出循环9 M4 _- H* C9 N5 {' _4 V8 m2 V- W
  70. '否则将当前尝试点作为新的边界继续循环运算
    , f/ G: I3 b7 E& E! F* A1 z
  71.                 If A3 = A4 Or A = A1 Or A = A2 Then8 T/ L" S1 z/ ]/ Y, R1 X
  72.                     Exit Do7 Q' |# A' `8 e& R" U; p. [
  73.                 ElseIf A3 > A4 Then' @& h2 t6 H' A' p  s. o9 u
  74.                     A2 = A
    2 i5 ~8 K+ h- z5 _
  75.                 Else
    ! D$ ~  T8 [( q1 Z) \) J. ~6 Q
  76.                     A1 = A
    # C6 E8 \9 F, {5 j7 e
  77.                 End If  O+ m$ I1 e$ R8 p1 k8 y
  78.             Loop
      n; P* ~. ?0 V8 O5 \" M
  79.         Else
    / a2 d, R+ ^6 J  Z! U1 j2 E
  80.             C.Delete
    + ~3 P) w+ m2 B8 Y- t) B; w: l; W
  81.             L1.Delete
    2 Z; E9 G" V! n% n/ v
  82.             Exit Sub
    . m9 R9 G) z' G9 i6 N2 C
  83.         End If) ?! e0 n  o: @6 H) V
  84.     End With& \! @9 F  v) j, u1 G
  85. 10:
复制代码

评分

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

查看全部评分

 楼主| 发表于 2015-12-30 00:09:55 | 显示全部楼层 来自: 中国广东惠州
' t  K/ o# y" V0 f0 g0 E
来晚了,接收了,版主什么多会。
 楼主| 发表于 2016-1-16 21:20:29 | 显示全部楼层 来自: 中国广东惠州
本帖最后由 明天你好吗 于 2016-1-16 21:23 编辑 2 B: h, o% k4 X/ ^: Y
2 ?! ~( _9 t* c8 k) c
版主大大,发现一个规律。只要以底边两端点为焦点作椭圆与圆相切,那么切点就是所求点。不知这个椭圆能否作出来? 2.png
$ P3 Q3 b1 ?4 w+ C, B
发表于 2016-1-17 02:34:53 | 显示全部楼层 来自: 中国辽宁营口
高次方程,常规作图方法无能为力: g- [  }2 u: v3 `
死了这条心吧
 楼主| 发表于 2016-1-17 12:54:24 | 显示全部楼层 来自: 中国广东惠州
woaishuijia 发表于 2016-1-17 02:34
" i$ {4 _+ O2 i( k: f: W7 B高次方程,常规作图方法无能为力& t; u/ i" y1 H: Y
死了这条心吧
6 `! Q  \8 D) N6 o2 v) L
还想着经常见到的现象能有常规解就好了
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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