QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 唐昕晨 于 2016-1-27 21:17 编辑
6 t9 j0 |# v! _7 U  u# n$ E  b+ x6 [/ l
2.png
2 E! V( U) p! i8 |& e凸面镜反射,已知入射光线上一点与反射光线上一点,如何作入射光线与反射光线+ z$ t8 P7 y/ v. Q0 n7 ^1 E7 n
ttachimg]2272051[/attachimg]
image012.jpg
发表于 2015-12-25 04:29:33 | 显示全部楼层 来自: 中国黑龙江伊春
本帖最后由 woaishuijia 于 2015-12-25 08:04 编辑
# Y( ?( D: P. }' d: w0 t* ?$ ]
  1.     Dim P1 As Variant, P2 As Variant, P3 As Variant, R As Double  q! A5 M3 X. k, [
  2.     Dim B As AcadBlock, C As AcadCircle, L1 As AcadLine, L2 As AcadLine, L3 As AcadLine
    " S/ u! ~$ U7 J! g+ I: j; D7 k
  3.     Dim A As Double, A1 As Double, A2 As Double, A3 As Double, A4 As Double
    2 ^3 w" x* b' ]7 Y) m! g
  4.     With ThisDrawing
    - {& D5 ~: g' ]8 A
  5. '操作者屏幕输入参数
    5 O4 R( U9 S( z" a' P% q
  6.         On Error GoTo 10/ o8 R9 F7 ^/ P2 x9 @  e
  7.         With .Utility; v8 t0 [6 ]  K: {1 q
  8.             P1 = .GetPoint(, "指定圆外第一点")& l, E$ x4 Z$ i3 q5 `' F& v) D4 L; b
  9.             P2 = .GetPoint(, "指定圆外同侧第二点")
    # h* }/ R( W! W8 `1 n8 a2 Q8 P
  10.             P3 = .GetPoint(, "指定圆心")
    8 ~1 V: m7 |+ v+ U3 [( Z: v# n" e! z
  11.             R = .GetDistance(P3, "指定半径")
    $ d0 D1 w; }# z, e
  12.         End With
    % W; f# q: V8 S2 |; G  T
  13. '检查输入的参数,如果有一点或两点在圆内部,则退出宏( H! A# J! E% S, [5 }
  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 106 m2 [) M7 E; c* k) u5 ^- a% y- z. g
  15. '判断作图空间( b( _  k' n* G4 g3 n* N" h
  16.         If .ActiveSpace = acModelSpace Then3 [! @6 \1 ]8 E5 {" z0 X1 f
  17.             Set B = .ModelSpace
    * I7 [2 o' W' `2 v0 f! y! }
  18.         Else% r& L6 c' e) T( A
  19.             Set B = .PaperSpace
    1 }- @& }! w7 L7 \
  20.         End If
    + l5 p2 B3 m$ s0 J* M0 `' r
  21. '按输入参数画圆8 D7 O, ]; b2 T* d; Q2 R1 Q
  22.         Set C = B.AddCircle(P3, R)
    ' c) t* h1 V; _; q7 P7 k4 {- l
  23. '在输入的圆外两点间连线: P& L. e  j0 P! K2 J
  24.         Set L1 = B.AddLine(P2, P1)
    2 A" x9 p, t& ?! F- F
  25. '检查连线与圆是否相交,如不相交则继续;如相交则删除圆和连线并结束宏) x$ n. o! O' o0 n5 Q1 ^
  26.         P3 = C.IntersectWith(L1, acExtendNone)
    * i/ r$ z$ ~. ^, k
  27.         If UBound(P3) = -1 Then5 Y* H$ m8 F( {/ t1 ~) B6 T) r4 @
  28. '将直线L1的起点改到圆心
    * Y9 c( R1 ^1 U- i& d+ ?, y
  29.             L1.StartPoint = C.Center
    7 J/ K2 l' {2 O! j
  30. '从圆心到输入的第二点画直线L2
    : p( i1 t0 l0 s4 m
  31.             Set L2 = B.AddLine(C.Center, P2)
    : }; K4 q" e8 y
  32. '用两直线的角度计算迭代运算的边界9 Y! ^1 r3 q1 q' S( t7 U
  33.             If L1.Angle - L2.Angle > 0 Then
      K4 T3 ]" u( S1 }4 d( D" i* I, a
  34.                 If L1.Angle - L2.Angle < .Utility.AngleToReal(180, acDegrees) Then
    $ ^3 m! k* J5 d2 ~
  35.                     A1 = L1.Angle
    8 F: s3 |& Q( s$ N! m- q/ u
  36.                     A2 = L2.Angle
      R6 r* o$ b" P: b  N
  37.                 Else
    : M- Q3 d) e0 a2 T: f
  38.                     L1.EndPoint = P2
      s6 B8 V2 d! {- W& z# d1 `  _) V9 H
  39.                     L2.EndPoint = P1
    , h" e/ {& E% |6 C2 ^6 E3 l
  40.                     A1 = L1.Angle" ~  _% l: I  N# f0 N
  41.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees)2 m5 \+ ~$ ]8 P" }# ^/ T5 d
  42.                 End If' u% w1 N9 G) o/ S; t; j6 n( [# v
  43.             Else
    ( D9 P1 r6 i6 Z: b+ H
  44.                 If L2.Angle - L1.Angle < .Utility.AngleToReal(180, acDegrees) Then5 Z( _. N; a0 k) z+ @( `
  45.                     L1.EndPoint = P22 W! Z* U, R$ v& ?# f0 ?
  46.                     L2.EndPoint = P1
    , a3 V; J3 @  D" Y
  47.                     A1 = L1.Angle
    0 c5 J& M& P9 U( @7 X% |
  48.                     A2 = L2.Angle
    , v6 k. q4 }# v: e; R/ d. {, s/ B
  49.                 Else5 Q. f8 H) t3 r6 U5 V% T) a" L
  50.                     A1 = L1.Angle9 R% d$ {- q' }- ~% t0 l
  51.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees)8 h% `- f0 C! w
  52.                 End If# o1 |, Q* c+ T. X" j
  53.             End If
    % O' {5 R0 {1 d" o. J" [4 l
  54. '以圆心为起点画第直线L3
      S  f' C9 q2 Y: `- A/ ]
  55.             Set L3 = B.AddLine(C.Center, C.Center)$ C% z9 L  o& @# L0 D
  56. '循环,迭代运算
    ( w! G$ ?: W- {$ M+ O8 h- K
  57.             Do
    , j/ l0 U& K5 d+ L' a
  58. '简单的插值法# }) Q1 Z6 R% ]( @3 l9 Z
  59.                 A = (A1 + A2) / 2. L5 |# s, Q% t0 O0 H
  60. '直线L3和入射和反射线的端点改到圆上尝试的点  I# Q; l( t& q' S9 n" {/ H! N$ I9 v
  61.                 L3.EndPoint = .Utility.PolarPoint(C.Center, A, R)
    * O2 `" ^8 E" Y) N! O% K
  62.                 L1.StartPoint = L3.EndPoint- t- `: K; d8 Y5 E, U
  63.                 L2.StartPoint = L3.EndPoint- y4 J, C0 R$ S+ J( A
  64. '计算入射和反射线分别与直线L3的夹角
    1 S0 q9 L2 X1 g0 ?  d; _& D, ?5 j
  65.                 A3 = L1.Angle - L3.Angle7 L; u0 x4 f1 \9 v; h
  66.                 If A3 < 0 Then A3 = A3 + 2 * .Utility.AngleToReal(180, acDegrees)
    ; S; h3 X7 c2 ~% l
  67.                 A4 = L3.Angle - L2.Angle, P6 |0 B9 z' o6 X6 O
  68.                 If A4 < 0 Then A4 = A4 + 2 * .Utility.AngleToReal(180, acDegrees)
    3 e9 Q) D: G; r- B5 ~
  69. '如果两夹角相等或已运算到浮点数的最高精度则退出循环
    . N; a2 y- X2 l, l
  70. '否则将当前尝试点作为新的边界继续循环运算' B3 ?" L5 c( l. D
  71.                 If A3 = A4 Or A = A1 Or A = A2 Then5 L2 Y* w7 a6 z1 u
  72.                     Exit Do
    1 R5 `. o! r1 B) R/ p+ O0 E: g8 C
  73.                 ElseIf A3 > A4 Then* C8 n! a' k- \- y0 ]
  74.                     A2 = A$ n9 ?: m' k$ s. U2 E( X, f1 R: H
  75.                 Else) k9 d! h1 t, _4 M. |
  76.                     A1 = A
    1 c$ |9 _: W) {" D
  77.                 End If
    $ @/ M; I% ~( U; \: S! `! I- v! y7 T
  78.             Loop: J& A" j' e/ b5 |- ~$ F+ ?0 J" y2 p
  79.         Else6 d' @2 |. X4 D- o; M" X
  80.             C.Delete
    & J! b" I$ s2 K8 @
  81.             L1.Delete
    " @, F+ E' t8 R$ A; m
  82.             Exit Sub8 k' H, u0 N$ o, g4 ]" Q9 ]( i
  83.         End If
    & S  t3 }# w+ @
  84.     End With
    - q; {- B3 |7 M* x& D8 t/ f/ G
  85. 10:
复制代码

评分

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

查看全部评分

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

6 Z0 \( {" g+ x: q0 U# j* I. N" k2 d来晚了,接收了,版主什么多会。
 楼主| 发表于 2016-1-16 21:20:29 | 显示全部楼层 来自: 中国广东惠州
本帖最后由 明天你好吗 于 2016-1-16 21:23 编辑
  T! M0 c0 Y9 a4 l& `4 L# M; i" q# U: M' W
版主大大,发现一个规律。只要以底边两端点为焦点作椭圆与圆相切,那么切点就是所求点。不知这个椭圆能否作出来? 2.png ! t0 N! o$ @3 E9 B
发表于 2016-1-17 02:34:53 | 显示全部楼层 来自: 中国辽宁营口
高次方程,常规作图方法无能为力
0 a3 t- q7 k8 h" O* ]- b死了这条心吧
 楼主| 发表于 2016-1-17 12:54:24 | 显示全部楼层 来自: 中国广东惠州
woaishuijia 发表于 2016-1-17 02:34
) h' h% @, ]5 k4 s* C6 {高次方程,常规作图方法无能为力! h* G3 ^7 d$ }- E8 {4 V/ x/ Z9 Z
死了这条心吧
9 @7 i" l: c9 K! c
还想着经常见到的现象能有常规解就好了
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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