QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 唐昕晨 于 2016-1-27 21:17 编辑 4 ?% F: g$ y( \4 W. ?, N; T* O
, v/ [$ o" i5 O6 H7 L/ b. k6 i
2.png - E" l- g9 |* [! q7 e3 O
凸面镜反射,已知入射光线上一点与反射光线上一点,如何作入射光线与反射光线' B8 r/ h* @/ d( ]
ttachimg]2272051[/attachimg]
image012.jpg
发表于 2015-12-25 04:29:33 | 显示全部楼层 来自: 中国黑龙江伊春
本帖最后由 woaishuijia 于 2015-12-25 08:04 编辑
" d& A* i8 {- {8 u( ?) @. z
  1.     Dim P1 As Variant, P2 As Variant, P3 As Variant, R As Double
    % U6 i+ c4 r& t0 _4 P$ W/ u
  2.     Dim B As AcadBlock, C As AcadCircle, L1 As AcadLine, L2 As AcadLine, L3 As AcadLine, p; q9 ?+ ~6 s8 b" ^
  3.     Dim A As Double, A1 As Double, A2 As Double, A3 As Double, A4 As Double
    9 R4 q) Y) v9 E
  4.     With ThisDrawing5 }3 n. [; h9 d: t4 H8 s: S
  5. '操作者屏幕输入参数
    6 l% d% x1 ^7 ~* a8 v% m" a
  6.         On Error GoTo 10
    " d% c6 [5 k9 Z
  7.         With .Utility
    % W9 |. A( B7 T: J
  8.             P1 = .GetPoint(, "指定圆外第一点")/ y! R% s0 q" k
  9.             P2 = .GetPoint(, "指定圆外同侧第二点")4 T8 d' K  ]3 c2 g$ z
  10.             P3 = .GetPoint(, "指定圆心")7 F  E1 ^* R+ P& g: x% L7 W8 n
  11.             R = .GetDistance(P3, "指定半径")/ f2 a& Q' r$ k! P3 B
  12.         End With) ~- r. u$ }2 R$ R
  13. '检查输入的参数,如果有一点或两点在圆内部,则退出宏
      s- }' a0 s; N; v% w- U) 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 103 a1 }& X) D9 }  v
  15. '判断作图空间. W& U, o) N8 a+ E: u# X; R" U
  16.         If .ActiveSpace = acModelSpace Then
    % c% K7 n  ~" t. @' g+ f4 W
  17.             Set B = .ModelSpace
    9 C8 H9 ^4 d3 {6 L7 r. l8 p# a, N/ H
  18.         Else
    6 h) O$ Z+ I  b  N9 w7 ~" l2 n" c" {6 _% p
  19.             Set B = .PaperSpace% W( E9 v* {6 O* t4 S' U
  20.         End If
    1 `. {6 U. |( D0 j# c
  21. '按输入参数画圆" ?2 u6 E6 O; T
  22.         Set C = B.AddCircle(P3, R)0 I  l" d7 q4 f& s; k8 o2 r
  23. '在输入的圆外两点间连线$ R* f6 V: G" @6 ]6 \
  24.         Set L1 = B.AddLine(P2, P1); v5 D+ v' b6 j. N5 X
  25. '检查连线与圆是否相交,如不相交则继续;如相交则删除圆和连线并结束宏: `- j* k  Q: b" p5 X
  26.         P3 = C.IntersectWith(L1, acExtendNone)4 t& }3 V2 Z0 k# h0 r
  27.         If UBound(P3) = -1 Then
      b; l, Y$ O/ W' ^
  28. '将直线L1的起点改到圆心" r8 c( S2 |6 L, V# e# u
  29.             L1.StartPoint = C.Center
    & C) ]3 n6 `& w) c
  30. '从圆心到输入的第二点画直线L2
    4 L' ?3 T  J. d) ]9 T( o) L  b
  31.             Set L2 = B.AddLine(C.Center, P2)
    $ Y6 f0 t3 y  m5 f8 I+ [
  32. '用两直线的角度计算迭代运算的边界
    2 ?3 e# G. L; K  M
  33.             If L1.Angle - L2.Angle > 0 Then% T! Q2 y, F0 [
  34.                 If L1.Angle - L2.Angle < .Utility.AngleToReal(180, acDegrees) Then% c( L( \. A7 s+ W
  35.                     A1 = L1.Angle% j! |+ a0 T0 |3 |2 c6 Q1 l2 W2 `% K
  36.                     A2 = L2.Angle
    * h  V6 X& b; C
  37.                 Else
    % @* b0 q; S8 N! k8 P0 v+ q! d6 v
  38.                     L1.EndPoint = P2
    5 I- I) V+ U2 t9 ^+ E& N
  39.                     L2.EndPoint = P1: l6 \( N2 P3 V. G0 c- x* N: p
  40.                     A1 = L1.Angle5 g3 p' {* d- |  Z
  41.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees)
    * v  X' k% u0 m/ X+ S$ y' S1 o
  42.                 End If' B' a9 i% n5 N3 z- \
  43.             Else6 B% ~- Q5 U2 B4 D" e
  44.                 If L2.Angle - L1.Angle < .Utility.AngleToReal(180, acDegrees) Then
    9 k, I7 ~2 B, C! s9 T
  45.                     L1.EndPoint = P2- G( h, F) v, w2 a$ \7 o1 u3 D
  46.                     L2.EndPoint = P1( Y/ Y) p6 Z8 s$ ~8 `: P
  47.                     A1 = L1.Angle2 O$ q( x) \( |4 r1 {8 e) q* ~0 X
  48.                     A2 = L2.Angle
    : Q& y' ~' A/ W: X# K6 K/ I4 Q0 c+ u
  49.                 Else
    " i; O, l9 U3 C, g+ Z3 u
  50.                     A1 = L1.Angle
    ! W& I0 ?" y( y1 e
  51.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees)' x) X; {4 ~% k/ I$ C
  52.                 End If; ^* r" L- L9 I1 {. |5 @
  53.             End If
    % Y! a# K$ s" p' p; n
  54. '以圆心为起点画第直线L3  M* X% M* T& A  d% l" S3 E
  55.             Set L3 = B.AddLine(C.Center, C.Center)
    : c) e; Y4 [, D8 A+ V) a6 F
  56. '循环,迭代运算
    , U  U/ S- g2 D/ ~8 k3 T
  57.             Do
    4 F' L; w! j0 O/ y2 s* n" ?6 i/ B  ?
  58. '简单的插值法
    1 P1 c  S# D' @; \1 S
  59.                 A = (A1 + A2) / 2
    9 F) o; d# V! ]( k; `. h
  60. '直线L3和入射和反射线的端点改到圆上尝试的点
    ( z* ~6 r2 H( `9 O8 ]9 L+ l
  61.                 L3.EndPoint = .Utility.PolarPoint(C.Center, A, R)
    : \% c" S# g( V# x. |) a
  62.                 L1.StartPoint = L3.EndPoint+ `9 J7 H$ Y6 P# I9 E* I: k
  63.                 L2.StartPoint = L3.EndPoint( G$ c! R2 v7 G# N4 m
  64. '计算入射和反射线分别与直线L3的夹角
    , e1 s: W0 E# i: }
  65.                 A3 = L1.Angle - L3.Angle( _6 h2 K2 e; a" W9 _7 W
  66.                 If A3 < 0 Then A3 = A3 + 2 * .Utility.AngleToReal(180, acDegrees)5 \& L$ T+ o# Y
  67.                 A4 = L3.Angle - L2.Angle4 d6 ?5 }( v0 ~' \- `. R
  68.                 If A4 < 0 Then A4 = A4 + 2 * .Utility.AngleToReal(180, acDegrees)
    & {- q: V6 Y, i5 E* v8 ~+ C% Z* [1 y7 e
  69. '如果两夹角相等或已运算到浮点数的最高精度则退出循环
    & |1 V! [' p! E
  70. '否则将当前尝试点作为新的边界继续循环运算& d( ]: k* c5 `5 f
  71.                 If A3 = A4 Or A = A1 Or A = A2 Then$ a+ h5 L# D0 E# F# ?0 ^& S
  72.                     Exit Do4 j8 k. c/ E/ C" y' _0 e
  73.                 ElseIf A3 > A4 Then
    . l7 H3 H: z! ^# O. R% |
  74.                     A2 = A; B  ^) u; u: u# S8 {
  75.                 Else
    . o- F5 Y8 [% N( v9 z4 J  D4 g( L7 r
  76.                     A1 = A% C" `" o( @* y: v( ^
  77.                 End If% V. k* k. o9 i: ]8 w% e) X
  78.             Loop
    0 d) D$ C$ C1 u3 t' j7 G
  79.         Else) b( v0 I! I, b! Q
  80.             C.Delete
    9 \! E4 {  y: O3 M* `
  81.             L1.Delete9 ^4 C2 e+ z) U1 M% S
  82.             Exit Sub& q5 D# O2 f6 X9 ^. ~# V  j
  83.         End If8 m: w) n9 U% K& M
  84.     End With
    9 P  I& o  a$ |( U, |8 k
  85. 10:
复制代码

评分

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

查看全部评分

 楼主| 发表于 2015-12-30 00:09:55 | 显示全部楼层 来自: 中国广东惠州
7 W5 A6 _, g/ x" q* K8 k4 P/ v
来晚了,接收了,版主什么多会。
 楼主| 发表于 2016-1-16 21:20:29 | 显示全部楼层 来自: 中国广东惠州
本帖最后由 明天你好吗 于 2016-1-16 21:23 编辑 $ H8 [4 l9 X, z% T& S5 l4 s9 e
" ?) s) v8 i7 g7 @  Y, u) t- u/ X) c
版主大大,发现一个规律。只要以底边两端点为焦点作椭圆与圆相切,那么切点就是所求点。不知这个椭圆能否作出来? 2.png
7 T* V9 @  J7 C2 K+ n- k; p
发表于 2016-1-17 02:34:53 | 显示全部楼层 来自: 中国辽宁营口
高次方程,常规作图方法无能为力
  y6 ]) S: p3 B死了这条心吧
 楼主| 发表于 2016-1-17 12:54:24 | 显示全部楼层 来自: 中国广东惠州
woaishuijia 发表于 2016-1-17 02:34* F) o( v9 u; R
高次方程,常规作图方法无能为力
/ A4 F% X( t5 D$ F* {. ^- M死了这条心吧
1 Y' U- {) W7 O  A
还想着经常见到的现象能有常规解就好了
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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