QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 唐昕晨 于 2016-1-27 21:17 编辑 * @! R: h. ^8 c% o3 u
/ x9 f! N0 B# B# x( j
2.png
* R, Z: S4 R+ P/ Y7 q凸面镜反射,已知入射光线上一点与反射光线上一点,如何作入射光线与反射光线( v/ ~: c$ h& \) f7 z) _2 p
ttachimg]2272051[/attachimg]
image012.jpg
发表于 2015-12-25 04:29:33 | 显示全部楼层 来自: 中国黑龙江伊春
本帖最后由 woaishuijia 于 2015-12-25 08:04 编辑
: g/ y5 o6 q; ^6 {0 P
  1.     Dim P1 As Variant, P2 As Variant, P3 As Variant, R As Double
    & e# K. \9 }# h: b# T0 e6 c# \5 G
  2.     Dim B As AcadBlock, C As AcadCircle, L1 As AcadLine, L2 As AcadLine, L3 As AcadLine
    ; \/ C7 B6 y* w
  3.     Dim A As Double, A1 As Double, A2 As Double, A3 As Double, A4 As Double
    3 a. V6 N; a$ _
  4.     With ThisDrawing: Y" ~/ A6 X1 x9 h: q
  5. '操作者屏幕输入参数) G/ M5 x: ~; E3 `: a1 k  ?* I
  6.         On Error GoTo 10: `  S3 a; g: L+ ]: q- _
  7.         With .Utility0 _  I' _' n6 N
  8.             P1 = .GetPoint(, "指定圆外第一点")
    ; o+ D, Z% f. |2 i$ p' J* N
  9.             P2 = .GetPoint(, "指定圆外同侧第二点")* {5 v5 U  P4 u& b
  10.             P3 = .GetPoint(, "指定圆心")
    - ]4 q! I! E7 ]5 |- v
  11.             R = .GetDistance(P3, "指定半径")) i1 F9 T. Z- [. G+ R
  12.         End With4 D8 W1 \. G5 k) K& k, H1 t2 g+ j
  13. '检查输入的参数,如果有一点或两点在圆内部,则退出宏
    1 n) n' C! v2 R$ I" }& N
  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
    5 m! i* d2 V# |4 G; T3 c) U
  15. '判断作图空间' w- {6 ?/ {% F. Z
  16.         If .ActiveSpace = acModelSpace Then
    , c" w' }# Y( e, j% L
  17.             Set B = .ModelSpace
    # S8 [' V6 y* p
  18.         Else
    , H2 e) |% ^* S2 i
  19.             Set B = .PaperSpace) t, f& A6 g. X' n7 r& n4 E
  20.         End If4 y, b* B- h8 J( B- j
  21. '按输入参数画圆2 F6 h. H- W  K  t; }. c
  22.         Set C = B.AddCircle(P3, R)) ?6 p6 e7 S3 m( o1 p6 I
  23. '在输入的圆外两点间连线/ q2 |7 [! ?1 b8 N
  24.         Set L1 = B.AddLine(P2, P1); ]# {8 b. ?+ O3 Q) i7 H
  25. '检查连线与圆是否相交,如不相交则继续;如相交则删除圆和连线并结束宏
    * {9 [7 T4 n+ K) U; `: X
  26.         P3 = C.IntersectWith(L1, acExtendNone)$ x6 t% a( A/ a) A  ?
  27.         If UBound(P3) = -1 Then
    , [8 z  h; H; e9 U3 @  v$ L
  28. '将直线L1的起点改到圆心
    4 }+ l/ m# s/ |5 E
  29.             L1.StartPoint = C.Center
    8 L/ |$ J. v# W) S
  30. '从圆心到输入的第二点画直线L2
    # y' U5 C) `/ X3 {4 X6 l% r- @/ o; T
  31.             Set L2 = B.AddLine(C.Center, P2)
    * L" \& D2 H6 I$ S4 \
  32. '用两直线的角度计算迭代运算的边界, `7 F5 ^; [; v, V( ]; t! G0 V: r
  33.             If L1.Angle - L2.Angle > 0 Then8 v, C0 U0 q1 R9 j" B1 f2 n
  34.                 If L1.Angle - L2.Angle < .Utility.AngleToReal(180, acDegrees) Then4 T0 M: d8 f$ ?' T6 r5 n0 a, Z1 u
  35.                     A1 = L1.Angle
    ( |/ {. ~! |+ y1 [6 l. l
  36.                     A2 = L2.Angle
    . a3 H6 N( S! y  b. \
  37.                 Else- J! J- |1 F' R  \8 \
  38.                     L1.EndPoint = P2+ [! E% e0 O$ c) y
  39.                     L2.EndPoint = P1* z: z+ r  l' ?6 [  g
  40.                     A1 = L1.Angle
      C$ P+ m! Q- j6 e1 v, ~
  41.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees)
    7 D3 f' n( _! l
  42.                 End If1 F8 m7 Z2 ~/ y
  43.             Else
    4 ~8 S, P5 W' Q5 t, {
  44.                 If L2.Angle - L1.Angle < .Utility.AngleToReal(180, acDegrees) Then
    ' z6 |! `8 d) g" u1 P, o0 E
  45.                     L1.EndPoint = P2
    - X, H! @% M4 y% T
  46.                     L2.EndPoint = P1) A/ |' v* L% K6 t" N( Q, G
  47.                     A1 = L1.Angle) _& {' K+ F# [
  48.                     A2 = L2.Angle
    6 D; h/ S0 I1 O; n# I
  49.                 Else
    % i* Z- G5 H. E  n3 a, ~
  50.                     A1 = L1.Angle
    ) O( j( W9 N) z, z7 O( V
  51.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees). M! D# N% f: D: \% a. p4 ?
  52.                 End If
    4 z  L# {# f* W: S' C) C4 j
  53.             End If4 m& @2 a$ q+ s* G6 Y! {! Y
  54. '以圆心为起点画第直线L3
    ' b  U5 o- `% b, Z/ A
  55.             Set L3 = B.AddLine(C.Center, C.Center)
    2 ~% w& r" n6 j4 s
  56. '循环,迭代运算
    7 j  ~' j4 r( j4 i8 v' a2 F2 g
  57.             Do/ F, m! z1 K- ?0 h( z
  58. '简单的插值法
    : {3 C6 u# O& [; `+ ]1 Q: X* S' g7 H
  59.                 A = (A1 + A2) / 2
    4 H2 Y* {9 x2 B+ {! C
  60. '直线L3和入射和反射线的端点改到圆上尝试的点
    " V7 B; U! g' J9 {, _1 {1 l
  61.                 L3.EndPoint = .Utility.PolarPoint(C.Center, A, R)
    / t* S! _5 h% B7 i+ I
  62.                 L1.StartPoint = L3.EndPoint
    . {* u+ L6 d! |5 i8 Y: h8 \
  63.                 L2.StartPoint = L3.EndPoint1 Z7 N# }% f, s4 F4 s. ?
  64. '计算入射和反射线分别与直线L3的夹角  a3 Z" C- {: I/ D4 h
  65.                 A3 = L1.Angle - L3.Angle( Q( T: P9 E$ f/ k0 D8 ]
  66.                 If A3 < 0 Then A3 = A3 + 2 * .Utility.AngleToReal(180, acDegrees)
    7 O2 I" \5 t2 e9 N7 ]% w9 ]
  67.                 A4 = L3.Angle - L2.Angle
    7 @0 X: w% V% N3 i* ?0 v8 p
  68.                 If A4 < 0 Then A4 = A4 + 2 * .Utility.AngleToReal(180, acDegrees)
    7 o# p9 l; A% s" {5 \' h
  69. '如果两夹角相等或已运算到浮点数的最高精度则退出循环# W5 h; l4 ~1 W
  70. '否则将当前尝试点作为新的边界继续循环运算) u5 u% f9 j1 h
  71.                 If A3 = A4 Or A = A1 Or A = A2 Then
    1 K2 d4 M" Z3 W# |, X: R
  72.                     Exit Do
    ' Q- Q( N8 [7 i2 t( P) x0 O
  73.                 ElseIf A3 > A4 Then
    ' f& N0 `% l: u/ ?
  74.                     A2 = A* O' E# e4 f  U
  75.                 Else9 K# [# _1 d- F6 Y1 p9 u9 O) {
  76.                     A1 = A
    7 _" v1 ?" t0 j5 M$ o3 o% U
  77.                 End If& _/ d7 Y$ C# e8 c: R, h* {2 m, w
  78.             Loop
    ' G8 g; z/ [9 U! T4 u2 A0 X: c
  79.         Else
    6 C# a+ O* k8 r% Q$ S- @
  80.             C.Delete
    " b, I7 q# @; a. ^% M# H
  81.             L1.Delete4 i/ L1 R+ M1 B4 F, q$ c2 C- K
  82.             Exit Sub; ]- j2 ]2 C& Y
  83.         End If* p5 W/ G# e( V' B( R
  84.     End With
    % {2 R# i, Y2 A  n6 E9 ^3 {
  85. 10:
复制代码

评分

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

查看全部评分

 楼主| 发表于 2015-12-30 00:09:55 | 显示全部楼层 来自: 中国广东惠州
/ C+ [0 z9 C, t  H" b) S
来晚了,接收了,版主什么多会。
 楼主| 发表于 2016-1-16 21:20:29 | 显示全部楼层 来自: 中国广东惠州
本帖最后由 明天你好吗 于 2016-1-16 21:23 编辑 & v: o  v( [+ H& H
6 V" d0 R2 k6 D
版主大大,发现一个规律。只要以底边两端点为焦点作椭圆与圆相切,那么切点就是所求点。不知这个椭圆能否作出来? 2.png
" ^+ `  }* c, L7 O6 X
发表于 2016-1-17 02:34:53 | 显示全部楼层 来自: 中国辽宁营口
高次方程,常规作图方法无能为力) R) l; N& k* [1 R, H* L; |! g, a$ }
死了这条心吧
 楼主| 发表于 2016-1-17 12:54:24 | 显示全部楼层 来自: 中国广东惠州
woaishuijia 发表于 2016-1-17 02:34
& S( h% D6 e# U高次方程,常规作图方法无能为力
/ \. i  c8 ~/ z5 L死了这条心吧
9 h3 ?& k# t- `, K% Q( N
还想着经常见到的现象能有常规解就好了
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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