找回密码
 快速注册
搜索
查看: 38|回复: 2

tkz-euclide作图精度

[复制链接]

413

主题

1558

回帖

1万

积分

积分
11498

显示全部楼层

abababa 发表于 2024-2-28 16:48 |阅读模式
如题。我现在做一个反演的题,题目如下:
$\odot O_1,\odot O_2,\odot O_3,\odot O_4$依次两两外切于点$A_1, A_2, A_3, A_4$,求证$A_1,A_2,A_3,A_4$四点共圆。
作图用了tkz-euclide,代码如下(以下代码中tkzGetPoints{}{}的第二个参数,多数都是没用的,只是要有个名字用来占个位置):
  1. \begin{tikzpicture}
  2. \tkzDefPoints{0/0/O_1,0/-2.5/O_2,3/0/O_4,1/0/A_4,0/-1/A_1,4/-4/X,4/-3/Y,1/2.5/Z}
  3. % 以$\odot(X,Y)$为反演圆,将$\odot O_2,\odot O_4$都反演,取得反形的一条外公切线PT_1'T_2'
  4. \tkzDefCircleBy[inversion = center X through Y](O_4,A_4)\tkzGetPoints{O_4''}{A_4''}
  5. \tkzDefCircleBy[inversion = center X through Y](O_2,A_1)\tkzGetPoints{O_2''}{A_1''}
  6. \tkzInterOCT(O_4'',A_4'')(O_2'',A_1'')\tkzGetPoint{P}
  7. \tkzDefTangent[from=P](O_2'',A_1'')\tkzGetPoints{T_1'}{T_1''}
  8. \tkzDefTangent[from=P](O_4'',A_4'')\tkzGetPoints{T_2'}{T_2''}
  9. % 将直线$PT_1'T_2'$按反演圆$\odot(X,Y)$反演,此圆过反演中心$X$,得到的反形$\odot O_3$与$\odot O_2,\odot O_4$都相切
  10. \tkzDefPointBy[inversion = center X through Y](T_1')\tkzGetPoint{T_1}
  11. \tkzDefPointBy[inversion = center X through Y](T_2')\tkzGetPoint{T_2}
  12. \tkzDefTriangleCenter[circum](X,T_1,T_2)\tkzGetPoint{O_3}
  13. \tkzInterCC(O_3,X)(O_2,A_1)\tkzGetPoints{A_2}{A_2'}
  14. \tkzInterCC(O_3,X)(O_4,A_4)\tkzGetPoints{A_3}{A_3'}
  15. % 以$\odot(A_4,Z)$为反演圆,将原图形反演
  16. \tkzDefCircleBy[inversion = center A_4 through Z](O_2,A_2)\tkzGetPoints{O_2'}{B_2'}
  17. \tkzDefCircleBy[inversion = center A_4 through Z](O_3,A_3)\tkzGetPoints{O_3'}{B_3'}
  18. \tkzDefPointBy[inversion = center A_4 through Z](A_1)\tkzGetPoint{A_1'}
  19. \tkzDefPointBy[inversion = center A_4 through Z](A_3)\tkzGetPoint{A_3'}
  20. \tkzInterCC(O_2',B_2')(O_3',B_3')\tkzGetPoints{C}{C'}
  21. \tkzDefTangent[at=A_1'](O_2')\tkzGetPoint{K_1}
  22. \tkzDefTangent[at=C](O_2')\tkzGetPoint{K_2}
  23. \tkzInterLL(A_1',K_1)(C,K_2)\tkzGetPoint{M}
  24. \tkzDefTangent[at=A_3'](O_3')\tkzGetPoint{K_1}
  25. \tkzDefTangent[at=C](O_3')\tkzGetPoint{K_2}
  26. \tkzInterLL(A_3',K_1)(C,K_2)\tkzGetPoint{N}
  27. \tkzDrawCircles(O_1,A_1 O_2,A_2 O_3,A_3 O_4,A_4)
  28. \tkzDrawCircles(O_2',C O_3',C)
  29. \tkzDrawSegments(M,N A_1',M A_3',N)
  30. \tkzLabelPoints[left](O_1)
  31. \tkzLabelPoints[below](O_2)
  32. \tkzLabelPoints[below right](O_3)
  33. \tkzLabelPoints[below left](O_4)
  34. \tkzLabelPoints[left](A_1)
  35. \tkzLabelPoints[below](A_2)
  36. \tkzLabelPoints[below right](A_3)
  37. \tkzLabelPoints[below left](A_4)
  38. \tkzLabelPoints[below left](C)
  39. \tkzLabelPoints[below left](A_1')
  40. \tkzLabelPoints[below left](A_3')
  41. \tkzDrawPoints(A_1,A_2,A_3,A_4,O_1,O_2,O_3,O_4)
  42. \tkzDrawPoints(A_1',A_3',C)
  43. \end{tikzpicture}
复制代码


其中tkzInterOCT是用来定义两个圆的两条外公切线的交点,定义如下:
  1. \def\tkzInterOCT(#1,#2)(#3,#4){
  2. \begingroup
  3. % 取得两圆的半径
  4. \tkzCalcLength(#1,#2)\tkzGetLength{r}
  5. \tkzCalcLength(#3,#4)\tkzGetLength{R}
  6. \pgfmathsetmacro{\K}{\r/(\r-\R)}
  7. \tkzDefPointWith[linear,K=\K](#1,#3)
  8. \endgroup
  9. }
复制代码


正常的在GeoGebra里画出来,点$A_1'$应该在$\odot O_2'$上,所以后面才能用\tkzDefTangent[at=A_1'](O_2')\tkzGetPoint{K_1}来得到过圆上一点的切线。但在tikz里画出来,$A_1'$就不在$\odot O_2'$上了,差了一点,导致整个图都有问题。这要怎么改才行?

3149

主题

8386

回帖

6万

积分

$\style{scale:11;fill:#eff}꩜$

积分
65391
QQ

显示全部楼层

hbghlyj 发表于 2024-2-28 17:35

413

主题

1558

回帖

1万

积分

积分
11498

显示全部楼层

 楼主| abababa 发表于 2024-2-28 21:26
hbghlyj 发表于 2024-2-28 17:35
Precision of \tkzCalcLength

可能就是那些计算时有问题。主楼的问题我解决了,换了个作法,不用两圆的切点(因为有精度问题,现在这两圆可能不相切而是相交,但两个交点距离也很近),而是用连心线与其中一圆的交点,这样就算两圆是相交于两点的,连心线与其中一圆的交点仍然位于正中间,看上去就没有那么大偏差了。最终的代码为:
  1. \begin{tikzpicture}[scale=0.8,label style/.style={font=\scriptsize}]
  2. \tkzDefPoints{0/0/O_1,0/-2.5/O_2,3/0/O_4,1/0/A_4,0/-1/A_1,4/-4/X,4/5/Y,1/2.5/Z}
  3. % 以$\odot(X,Y)$为反演圆,将$\odot O_2, \odot O_4$ 都反演,取得反形的一条外公切线PT_1'T_2'
  4. \tkzDefCircleBy[inversion = center X through Y](O_4,A_4)\tkzGetPoints{O_4''}{A_4''}
  5. \tkzDefCircleBy[inversion = center X through Y](O_2,A_1)\tkzGetPoints{O_2''}{A_1''}
  6. \tkzInterOCT(O_4'',A_4'')(O_2'',A_1'')\tkzGetPoint{P}
  7. \tkzDefTangent[from=P](O_2'',A_1'')\tkzGetPoints{T_1'}{T_1''}
  8. \tkzDefTangent[from=P](O_4'',A_4'')\tkzGetPoints{T_2'}{T_2''}
  9. % 将直线$PT_1'T_2'$按反演圆$\odot(X,Y)$反演,此圆过反演中心$X$,得到的反形$\odot O_3$与$\odot O_2, \odot O_4$都相切
  10. \tkzDefPointBy[inversion = center X through Y](T_1')\tkzGetPoint{T_1}
  11. \tkzDefPointBy[inversion = center X through Y](T_2')\tkzGetPoint{T_2}
  12. \tkzDefTriangleCenter[circum](X,T_1,T_2)\tkzGetPoint{O_3}
  13. \tkzInterLC[near](O_3,O_2)(O_2,A_1)\tkzGetPoints{A_2}{A_2'}
  14. \tkzInterLC[near](O_3,O_4)(O_4,A_4)\tkzGetPoints{A_3}{A_3'}
  15. %\tkzInterCC(O_3,X)(O_2,A_1)\tkzGetPoints{A_2}{A_2'}
  16. %\tkzInterCC(O_3,X)(O_4,A_4)\tkzGetPoints{A_3}{A_3'}
  17. % 以$\odot(A_4,Z)$为反演圆,将原图形反演
  18. \tkzDefCircleBy[inversion = center A_4 through Z](O_2,A_2)\tkzGetPoints{O_2'}{B_2'}
  19. \tkzDefCircleBy[inversion = center A_4 through Z](O_3,A_3)\tkzGetPoints{O_3'}{B_3'}
  20. \tkzDefPointBy[inversion = center A_4 through Z](A_1)\tkzGetPoint{A_1'}
  21. \tkzDefPointBy[inversion = center A_4 through Z](A_2)\tkzGetPoint{A_2'}
  22. \tkzDefPointBy[inversion = center A_4 through Z](A_3)\tkzGetPoint{A_3'}
  23. \tkzDefTangent[at=A_1'](O_2')\tkzGetPoint{K_1}
  24. \tkzDefTangent[at=A_2'](O_2')\tkzGetPoint{K_2}
  25. \tkzInterLL(A_1',K_1)(A_2',K_2)\tkzGetPoint{M}
  26. \tkzDefTangent[at=A_3'](O_3')\tkzGetPoint{K_1}
  27. \tkzDefTangent[at=A_2'](O_3')\tkzGetPoint{K_2}
  28. \tkzInterLL(A_3',K_1)(A_2',K_2)\tkzGetPoint{N}
  29. \tkzDrawCircles(O_1,A_1 O_2,A_2 O_3,A_3 O_4,A_4)
  30. \tkzDrawCircles(O_2',B_2' O_3',B_3')
  31. \tkzDrawLines[add = 0.3 and 0.1](A_1',M)
  32. \tkzDrawLines[add = 2.3 and 0.5](A_3',N)
  33. \tkzDrawSegments(M,N)
  34. \tkzLabelPoints[above](O_1)
  35. \tkzLabelPoints[below](O_2)
  36. \tkzLabelPoints[right](O_3)
  37. \tkzLabelPoints[above](O_4)
  38. \tkzLabelPoints[above](A_1)
  39. \tkzLabelPoints[shift=(150:7pt)](A_2)
  40. \tkzLabelPoints[below](A_3)
  41. \tkzLabelPoints[right](A_4)
  42. \tkzLabelPoints[below left](A_1')
  43. \tkzLabelPoints[shift=(-150:7pt)](A_2')
  44. \tkzLabelPoints[left](A_3')
  45. \tkzLabelPoints[left](M)
  46. \tkzLabelPoints[right](N)
  47. \tkzDrawPoints(A_1,A_2,A_3,A_4,O_1,O_2,O_3,O_4)
  48. \tkzDrawPoints(A_1',A_2',A_3',M,N)
  49. \end{tikzpicture}
复制代码

手机版|悠闲数学娱乐论坛(第3版)

GMT+8, 2025-3-4 12:18

Powered by Discuz!

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