QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
6天前
查看: 2572|回复: 5
收起左侧

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

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

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

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

x
本帖最后由 唐昕晨 于 2016-1-27 21:17 编辑 1 D- M$ @6 J! ?* i' t% R
  r( S. v& Z" [2 n
2.png
! ~6 B5 S1 `' p6 r% |4 ?# m凸面镜反射,已知入射光线上一点与反射光线上一点,如何作入射光线与反射光线
. M0 {7 r7 t: o! u  t  H/ httachimg]2272051[/attachimg]
image012.jpg
发表于 2015-12-25 04:29:33 | 显示全部楼层 来自: 中国黑龙江伊春
本帖最后由 woaishuijia 于 2015-12-25 08:04 编辑 # M7 A, M( p! M, f
  1.     Dim P1 As Variant, P2 As Variant, P3 As Variant, R As Double( d/ D1 @8 p- X: O7 @# e4 Q" Q
  2.     Dim B As AcadBlock, C As AcadCircle, L1 As AcadLine, L2 As AcadLine, L3 As AcadLine1 v) |2 |# C1 i2 N( N  ~
  3.     Dim A As Double, A1 As Double, A2 As Double, A3 As Double, A4 As Double
    5 @! Y+ u% I8 v! t" m+ F0 ]; S7 u% m
  4.     With ThisDrawing* D9 L! B- f. G2 D
  5. '操作者屏幕输入参数/ e+ [6 c6 R6 Y
  6.         On Error GoTo 10
    5 R  M/ {5 u0 R1 E* l% ?
  7.         With .Utility
    : e/ t+ j0 Z$ @. @
  8.             P1 = .GetPoint(, "指定圆外第一点")# K1 F' w* N/ e; g
  9.             P2 = .GetPoint(, "指定圆外同侧第二点")* c! o1 C* w9 g- l: m  ^
  10.             P3 = .GetPoint(, "指定圆心")  c; Z6 T9 H0 Z; {$ k6 P( L
  11.             R = .GetDistance(P3, "指定半径")" h5 H& \& h; \/ H
  12.         End With
    3 R; h4 U5 Q, r6 V( h8 Y& Z! }
  13. '检查输入的参数,如果有一点或两点在圆内部,则退出宏8 G. r4 k5 K' h; C3 U. c; l
  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
    ; H+ b8 r2 p3 Q0 O# j' ]
  15. '判断作图空间
    ' c0 A2 n+ [7 K0 y% y3 U" T% ^7 x
  16.         If .ActiveSpace = acModelSpace Then
    7 f  j/ x) F+ }* i/ \% v
  17.             Set B = .ModelSpace
    : n- G; ?* o6 x& F
  18.         Else
      a( K7 D* ~9 H" w6 C
  19.             Set B = .PaperSpace
    7 k6 p3 G& v% U$ l) h& W
  20.         End If4 {: \( {. n. D; Z# b6 g
  21. '按输入参数画圆) r1 k& h$ t$ i# q* H, ?
  22.         Set C = B.AddCircle(P3, R)$ `, t% T3 O. ]  ?
  23. '在输入的圆外两点间连线1 O4 \# y5 O, h" V- n
  24.         Set L1 = B.AddLine(P2, P1)
    % Y- y* k1 d5 ^
  25. '检查连线与圆是否相交,如不相交则继续;如相交则删除圆和连线并结束宏
    6 y' ^  W! e# t# n) B, {: ?# g
  26.         P3 = C.IntersectWith(L1, acExtendNone)
    7 y3 b& n, \. ^  u# j$ `( K4 U
  27.         If UBound(P3) = -1 Then  c/ _3 r1 e: N! j. `, G
  28. '将直线L1的起点改到圆心/ E) G/ Q; S2 @, Y# T7 K
  29.             L1.StartPoint = C.Center+ j3 L) X1 y! [" K# Z; t0 E
  30. '从圆心到输入的第二点画直线L21 `, }# A- E! e5 Y2 W+ _0 K
  31.             Set L2 = B.AddLine(C.Center, P2)5 ?4 a1 e7 G4 `% L  g
  32. '用两直线的角度计算迭代运算的边界) _3 L; a, ]9 t7 ?
  33.             If L1.Angle - L2.Angle > 0 Then
    $ Q4 K' S0 e8 l7 t
  34.                 If L1.Angle - L2.Angle < .Utility.AngleToReal(180, acDegrees) Then
    , G' [! F; u. C
  35.                     A1 = L1.Angle, N9 V- H1 z; }# v2 n
  36.                     A2 = L2.Angle$ J- N3 K0 u& D, s
  37.                 Else
    0 r$ f( t* \  {# }. N0 Q% ]0 ]( y
  38.                     L1.EndPoint = P2
    & \" P! c1 l, R! f5 u% Q/ y* k
  39.                     L2.EndPoint = P1
    0 ^" }; B0 a" ~8 z. i4 L
  40.                     A1 = L1.Angle
    & j# H1 r6 [: M8 V7 m; O
  41.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees); ?6 F4 ^  |0 }+ I* q
  42.                 End If
    * e, p+ u3 H- A, ^+ ?2 `  q$ i! y
  43.             Else
    8 L* u$ l2 x4 y0 L1 @
  44.                 If L2.Angle - L1.Angle < .Utility.AngleToReal(180, acDegrees) Then  h" m! ?& {5 b/ K0 p
  45.                     L1.EndPoint = P2
    - d, v. J# j7 \0 f, p' u
  46.                     L2.EndPoint = P1
    8 i: ]" q1 n3 a9 l* x
  47.                     A1 = L1.Angle
    / }9 D1 D, G! l+ D
  48.                     A2 = L2.Angle
    " W: M6 O; R# i# g& S; r$ D
  49.                 Else9 N3 _4 D2 q+ u* _" E
  50.                     A1 = L1.Angle, S" i# C7 i. W+ C7 W0 b. m+ W5 D
  51.                     A2 = L2.Angle - 2 * .Utility.AngleToReal(180, acDegrees): }+ J9 g) ~) T9 k! h. Q
  52.                 End If
    - B" o* c. o& }8 l
  53.             End If) G* h% P4 e/ v+ J
  54. '以圆心为起点画第直线L3
      w1 ^; U$ A7 W# H% c
  55.             Set L3 = B.AddLine(C.Center, C.Center)
    6 ^, q6 k: r3 l+ I( u1 y
  56. '循环,迭代运算
    " L& L7 e! W# V9 @8 r! j
  57.             Do% e  a) a4 o- _9 v2 j6 `
  58. '简单的插值法
    % \/ |; \/ ]1 n) y7 U0 W' r4 K
  59.                 A = (A1 + A2) / 2
    # K( c& |1 n4 Q% b3 ]9 ]
  60. '直线L3和入射和反射线的端点改到圆上尝试的点
    * j% |) H8 f2 u& o# e$ i
  61.                 L3.EndPoint = .Utility.PolarPoint(C.Center, A, R)+ P' `9 Y9 G+ y# `* d7 i3 ^' N
  62.                 L1.StartPoint = L3.EndPoint, G! t# ?! K9 f5 p
  63.                 L2.StartPoint = L3.EndPoint
    6 |9 f0 D: @5 I
  64. '计算入射和反射线分别与直线L3的夹角5 D, Y2 V3 A* f2 a; J
  65.                 A3 = L1.Angle - L3.Angle
    # H9 F$ s4 s3 x0 R) z8 ?8 O
  66.                 If A3 < 0 Then A3 = A3 + 2 * .Utility.AngleToReal(180, acDegrees)
    6 L2 `! Q& A/ L3 [3 J5 o
  67.                 A4 = L3.Angle - L2.Angle: b' ?" ?& [7 _) g, {7 U6 |
  68.                 If A4 < 0 Then A4 = A4 + 2 * .Utility.AngleToReal(180, acDegrees)
    8 Y4 E& G  t/ D' b7 U
  69. '如果两夹角相等或已运算到浮点数的最高精度则退出循环4 D7 A- L! x9 v1 g. ?
  70. '否则将当前尝试点作为新的边界继续循环运算. X: v1 P# j  }2 }$ Q
  71.                 If A3 = A4 Or A = A1 Or A = A2 Then
    2 W  d2 V8 w3 h
  72.                     Exit Do" {! G4 ?4 t+ }3 ]  L( H
  73.                 ElseIf A3 > A4 Then4 G9 C: j3 S7 B; y
  74.                     A2 = A) W1 M  q: B% Q) `
  75.                 Else- r+ W  H$ Y& N8 a+ q1 B
  76.                     A1 = A0 H& H2 U5 M& O* H: d
  77.                 End If
    . ?  t& _+ d. r% L& t5 k
  78.             Loop
    7 P6 {$ t( A; B! _8 K- g
  79.         Else
    ' d: O- N) J/ A7 r" `$ I7 ^* j" p
  80.             C.Delete
    % U# A9 L( [) Q, f# m% ^- M, Q
  81.             L1.Delete% o" [' ?3 j8 }! u- v! }2 W- I
  82.             Exit Sub6 A, L( w4 c- S4 t/ t: q
  83.         End If0 d! x6 Z" b1 `( R+ K5 U0 Q
  84.     End With
    2 f! J8 b, a' R; u! y% I
  85. 10:
复制代码

评分

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

查看全部评分

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

2 T7 R9 L( `$ n0 ~来晚了,接收了,版主什么多会。
 楼主| 发表于 2016-1-16 21:20:29 | 显示全部楼层 来自: 中国广东惠州
本帖最后由 明天你好吗 于 2016-1-16 21:23 编辑 ' L+ s& C3 D& F- m5 E1 F

1 l- z. P( l: a0 O8 M" [9 {- ^" |5 f( \版主大大,发现一个规律。只要以底边两端点为焦点作椭圆与圆相切,那么切点就是所求点。不知这个椭圆能否作出来? 2.png # O' T, Z+ s1 ^8 w4 y+ O* x
发表于 2016-1-17 02:34:53 | 显示全部楼层 来自: 中国辽宁营口
高次方程,常规作图方法无能为力
; J. r1 Y. _# j  h+ x死了这条心吧
 楼主| 发表于 2016-1-17 12:54:24 | 显示全部楼层 来自: 中国广东惠州
woaishuijia 发表于 2016-1-17 02:34
6 R9 \; o) i0 u# @# w- y7 \7 v高次方程,常规作图方法无能为力
/ n- }! j2 \1 o& t死了这条心吧
8 O" I( j3 h  b' [: E# ~5 V# _  N
还想着经常见到的现象能有常规解就好了
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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