10

我想画一个给定半径的圆,这样它就可以在交点附近碰到另外两个较大的圆。我正在使用tkz-欧几里得软件包,但无法解决这个问题。下面的代码创建了两个圆,并猜测了第三个圆的点。

圆圈在交叉点附近与另外两个圆圈接触

\文档类〔a4纸张〕{文章}\使用包{tkz-euclide}\使用包[nomessages]{fp}\新命令{\ra}{39}\新命令{\thick}{6}\新命令{\fa}{3}\新命令{\fb}{3}\新命令{\bias}{1}%忽略这一点,这只是复制品\FPeval{y}{2*\ra/2.618}\FPeval{\f}{(2*\ra)-(y)}\FPeval{\rasmall}{\ra-\thick}\FPeval{\faa}{\f-\fa+\bias}\FPeval{\fbb}{\fb-\bias}\开始{文档}\此页面样式{空}\开始{tikzpicture}[scale=0.2]\tkzDefPoint(\fa-\bias,-\fb+\bias){A}%圆心1\tkzDefPoint(\f,0){B}%圆心2\tkzInterCC[R](A,\rasmall)(B,\ra)\tkzGetPoints{M1}{N1}\开始{scope}\tkzClipCircle(A,M1)%\tkzFillCircle[颜色=绿色!50,不透明度=.5](B,M1)\结束{scope}\tkzDefShiftPoint[M1](192:6.4){BB}\tkzDrawCircle[R](A,\rasmall)%画圆1,以A为中心,半径为1\tkzDrawCircle[R](B,\ra)%以A为中心绘制半径为1的圆1\tkz绘图点[颜色=橙色,填充=橙色](M1,N1)%绘图点\tkzDrawCircle[颜色=橙色,R](BB,4)%\结束{tikzpicture}\结束{文档}
5
  • 猜测不是构造,应该在编码之前完成。//你会怎么构造这样的东西? 5月4日15:50
  • 这就是问题所在。我认为有一条线(圆?),所有可能的圆都接触到两个较大的圆,但我不知道如何计算这条线。 5月4日16:06
  • 这是数学论坛的一个问题,不是吗? 5月4日16:35
  • 如果已知圆的半径,构造就很简单:找到与圆1具有相同中心但半径r1-r3和与右侧圆2具有相同中心且半径r2+r3为第三个圆的中心的圆的交点 5月4日16:37
  • 您的tkz-euclide版本已经过时。\tkz画圆[R]不再有效。首先用定义圆\tkzDefCircle[R]{中心,R}\tkzGetPoint{pt}获取圆上的一个点,然后绘制\tkzDrawCircle{中心,pt}. 5月4日16:48

5个答案5

重置为默认值
12

我没有太多时间,但稍后我会再提出一个建议。您的tkz-euclide版本已经过时,因为它不再与最新版本兼容。tkz画圆[R]此选项不再存在,请参阅下面的代码。

A) 使用旧版本

\文档类[a4paper]{article}\使用包{tkz-euclide}\使用包[nomessages]{fp}\新命令{\ra}{39}\新命令{\thick}{6}\新命令{\fa}{3}\新命令{\fb}{3}\新命令{\bias}{1}%忽略这一点,这只是复制品\FPeval{y}{2*\ra/2.618}\FPeval{\f}{(2*\ra)-(y)}\FPeval{\rasmall}{\ra-\thick}\FPeval{\faa}{\f-\fa+\bias}\FPeval{\fbb}{\fb-\bias}\开始{文档}\此页面样式{空}\开始{tikzpicture}[scale=0.2]\tkzDefPoint(\fa-\bias,-\fb+\bias){A}%圆心1\tkzDefPoint(\f,0){B}%圆心2\tkzInterCC[R](A,\rasmall)(B,\ra)\tkzGetPoints{M1}{N1}\开始{scope}\tkzClipCircle(A,M1)\结束{范围}\tkzDefShiftPoint[M1](192:6.4){BB}\tkzDefCircle[R](A,\rasmall)\tkzGetPoint{A}%以A为中心绘制半径为1的圆1\tkzDefCircle[R](B,\ra)\tkzGetPoint{B}%绘制以A为中心、半径为1的圆1\tkz绘图点[颜色=橙色,填充=橙色](M1,N1)%绘图点\tkz绘制圆[](A,A B,B)\FPeval{\raa}{\rasmall-4}\FPeval{\rbb}{\ra+4}\tkzInterCC[R](A,\raa)(B,\rbb)\tkzGetPoints{P1}{Q1}\tkzDefCircle[R](P1,4)\tkzGetPoint{c}%\tkzDrawCircle[橙色](P1,c)\tkzLabelPoints(P1、Q1)\结束{tikzpicture}\结束{文档}

B) 使用tkz-euclide v5.10或>=5

你不需要英尺/平方英尺因为新版本使用xfp(xfp)(参见代码中的评估).

\文档类[a4paper]{article}\使用包{tkz-euclide}\开始{文档}\开始{tikzpicture}\定义\ra{4}\定义\rb{6}\定义\r{.5}\tkz定义点{0/0/A,5/2/B}\tkzDefCircle[R](A,\ra)\tkzGetPoint{A}\tkzDefCircle[R](B,\rb)\tkzGetPoint{B}\tkzInterCC(A,A)(B,B)\tkzGetPoints{E}{F}\edef\raa{\fpeval{\ra-\r}}\edef\rbb{\fpeval{\rb+\r}}\tkzInterCC[R](A,\raa)(B,\rbb)\tkzGetPoints{P}{Q}\tkzDefCircle[R](P,\R)\tkzGetPoint{c}\tkz绘图圆圈[青色](A,A B,B)\tkz绘图圆圈[紫色](A,P B,P)\tkzDrawCircle[橙色](P,c)\tkz牵引点[颜色=橙色,填充=橙色](E,F)\结束{tikzpicture}\结束{文档}

C) 新版本已升级

\文档类[a4paper]{article}\使用包{tkz-euclide}\开始{文档}\开始{tikzpicture}\定义\ra{4}\定义\rb{6}\定义\r{.5}\tkz定义点{0/0/A,5/2/B}\tkzInterCC[R](A,\ra)(B,\rb)\tkzGetPoints{E}{F}\edef\raa{\fpeval{\ra-\r}}\edef\rbb{\fpeval{\rb+\r}}\tkzInterCC[R](A,\raa)(B,\rbb)\tkzGetPoints{P}{Q}\tkzDefCircle[R](P,\R)\tkzGetPoint{c}\tkz绘图圆圈[青色](A、E、B、E)\tkz绘图圆圈[紫色](A,P B,P)\tkzDrawCircle[橙色](P,c)\tkz牵引点[颜色=橙色,填充=橙色](E,F)\结束{tikzpicture}\结束{文档}

D) 带有tkz元素和tkz-euclide选项mini的版本

必须使用lualatex进行编译计算比使用TeX更容易

\文档类{独立}\使用包[mini]{tkz-euclide}\使用包{tkz-elements}\开始{文档}\开始{tkzelements}z.A=点:新(0,0)z.B=点:新(5,2)ra=4rb=6r=.5C.A=圆:半径(z.A,ra)C.B=圆:半径(z.B,rb)z.E=交叉口(C.A、C.B)C.AA=圆:半径(z.A,ra-r)C.BB=圆:半径(z.B,rb+r)z.P=交叉点(C.AA、C.BB)C.P=圆:半径(z.P,r)z.X=C.P.通过\结束{tkzelements}\开始{tikzpicture}\tkz获取节点\tkzDrawCircles[青色](A、E、B、E)\tkz绘图圆圈[紫色](A,P B,P)\tkzDrawCircle[橙色](P,X)\tkzDrawPoints[颜色=橙色,填充=橙色](E)\结束{tikzpicture}\结束{文档}

在此处输入图像描述

7
  • 1
    做得好!几何结构简单而精彩! 5月4日19:13
  • 这些答案给我留下了深刻的印象。不幸且非常尴尬的是,没有人在我的ubuntu(22.04)系统上工作,既没有lualatex也没有pdflatex。此处出现错误:pastebin.com/Qc4L2bV5 5月5日10:08
  • 1
    这是一个与Ubuntu和/或LaTeX安装有关的问题。例如,我毫不费力地在Ubuntu和Windows之间交换了代码。 5月5日12:26
  • @ThierryBlank我在某个地方看到了与Ubuntu的TeX安装有关的问题。问一个与乌布图有关的问题可能会很有趣。你的tkz-euclide是什么版本的?我想可以在CTAN上获得最新版本,并将其安装在个人texmf中。 5月5日16:11
  • @AlainMatthes我使用了texlive-full的默认ubuntu安装以及其他一些包。tkz-euclide为4.03。我无法找到强制ubuntu升级的方法。tkz元素没有安装,我手动将sty文件添加到tex文件所在的目录中。我还在那里添加了tkz-elements文件夹(latex-dir的内容),现在我得到了latex错误:找不到文件“tkz-draw-eu-points.tex”。 5月6日6:32
8

仅显示MetaPost中的构造方法。对不起,我不擅长使用TiKz。

开始(1);d1=4厘米;d2=5cm;d3=1cm;绘制缩放的圆圈d1移位(10,50);绘制缩放的圆圈d2;路径c[];c1=移动(10,50)的满圈缩放(d1-d3);c2=缩放的全圆(d2+d3);用0.8白色绘制c1;用0.8白色绘制c2;用4白色绘制缩放的全圆d3移位(c1交点c2);;endfig;

在此处输入图像描述

8

使用实验的方法l3绘图包(显示具有特定半径的圆与其他两个相交圆接触的所有可能位置):

\documentclass[border=10pt,multi=drawing]{独立}\使用包{l3draw}\Expl语法打开\新文档命令{\TwoAndOneCircle}{O{1}m m m O{1}m}{\绘图开始(_B):\draw_path_circle:nn{#2}{#3}\draw_path_use_clear:n{draw}\draw_path_circle:nn{#4}{#5}\draw_path_use_clear:n{draw}\绘图路径圆:nn{\int_case:nn{#1}{{1} {\绘图点相交圆:nnnnn{#2} { #3 + #7 } {#4} { #5 + #7 } {#6}}{2} {\绘图点相交圆:nnnnn{#2} { #3 + #7 } {#4} { #5 - #7 } {#6}}{3} {\绘图点相交圆:nnnnn{#2} { #3 - #7 } {#4} { #5 + #7 } {#6}}{4} {\绘图点相交圆:nnnnn{#2} { #3 - #7 } {#4} { #5 - #7 } {#6}}}} {#7}    \draw_path_use_clear:n{draw}\绘图结束(_E):\ExplSyntax关闭}\新建文档环境{drawing}{}{}}{}\开始{文档}\ExplSyntax打开\int_step_inline:nn{2}{\int_step_inline:nn{4}{\开始绘制\两个和一个圆圈[#1]{1cm,4cm}{7cm}{0cm,0cm}{5cm}[#1]}{1cm}\结束{绘图}}}\ExplSyntax关闭\结束{文档}

在此处输入图像描述 在此处输入图像描述

第一个参数采用1到4之间的整数,用于选择第三个圆与其他两个圆的接触位置,如下所示:

  • 1:第一个外圆,第二个外圆(默认)
  • 2:第一圈在外,第二圈在内
  • 3:第一个圆在里面,第二个圆在外面
  • 4:第一圈在里面,第二圈在里面

第二个参数采用第一个圆的坐标(作为带或不带圆括号的(x,y)元组)。第三个参数采用第一个圆的半径。

第四个参数采用第二个圆的坐标(作为带或不带圆括号的(x,y)元组)。第五个参数采用第二个圆的半径。

第六个参数选择第三个圆应该与其他两个圆接触的交点。由于逻辑原因,这里只有1或2是有效的(1是默认值)。

最后一个参数采用第三个圆的半径。

该命令没有测试第三个圆是否可以实际接触到给定参数的另外两个圆。在这种情况下,将发出错误。


但你也可以创建一个Tik个Z解决方案使用\图片使用相同的逻辑:

\documentclass[border=10pt]{独立}\使用包{tikz}\newif\ifTwoandonecircleOne内部\newif\ifTwoandonecircleCircleTwo内部\提克兹特{图片/两个和一个圆/.style={代码={\tikzset{两个和一个圆/.cd,#1}\坐标(一个圆位于)位于(\pgfkeysvalueof{/tikz/two和一个圆/一个圆在});\坐标(圆圈2 at)位于(\pgfkeys值{/tikz/two和一个圆圈/圆圈2 at});\画[pic动作,两个和一个圆/一个圆](在以下位置圈出一个)圆[radius=\pgfkeysvalueof{/tikz/两个和一个圆/圆一个半径}];\绘制[图片动作,两个和一个圆圈/两个圆圈](在以下位置圈出两个)圆[radius=\pgfkeysvalueof{/tikz/两个和一个圆/圆两个半径}];\圆形交叉点{\pgfpointanchor{在}{center}圈一个}{\pgfpointanchor{在}{center}圈两个}{\{/tikz/两个和一个圆/圆一个半径}的pgfkeys值\如果两个圆圈内有一个圆圈-\pgfkeys值为{/tikz/两个和一个圆/圆三个半径}\其他+\pgfkeys值为{/tikz/两个和一个圆/圆三个半径}\fi(菲涅耳)}{\{/tikz/两个和一个圆/圆两个半径}的pgfkeys值\ifTwo和necircleCircleTwo在里面-\pgfkeys{/tikz/二和一圆/圆三半径}的值\其他+\pgfkeys值为{/tikz/两个和一个圆/圆三个半径}\fi(菲涅耳)}{\{/tikz/两个和一个圆/交点}的pgfkeys值}\pgfgetlastxy{\TwoandonecircleCircleThreeX}{\twoandonecirclecircleThrieY}\画[pic动作,两个和一个圆圈/三个圆圈](\TwoandonecircleCircleThreeX,\Twoanondonecircle CirclethreeY)圆[radius=\pgfkeysvalueof{/tikz/两个和一个圆/圆三个半径}];}},两个和一个圆/一个圆位于/。initial={0,0},两个和一个圆/圆一个半径/.initial={1cm},两个和一个圆/一个圆/.style={},两个和一个圆/两个圆位于/.initial={1,0},两个和一个圆/圆两个半径/.initial={1cm},二和一个圆/圆二/。样式={},两个和一个圆/圆三个半径/.initial={0.25cm},二和一个圆/圆三/。样式={},二加一圆/内圆一/。is if=TwoandonecircleCircleOneInside,两个和一个圆/内圈一=假,二加一圆/内圆二/。is if=TwoandonecircleCircleTwoInside,二和一圆/内圆二=假,两个和一个圆/交点/.initial={1},}\开始{文档}\开始{tikzpicture}\图片{两个和一个圆={圈出三个/.style={red},交点=2,内圆一}};\pic[厚度](0,-2){两个和一个圆={圈出一个/.style={蓝色,虚线},圆三/.style={洋红色},圆一半径=0.75cm,在={1,-0.5}处圈出两个,圆三半径=0.5cm,内圆二}};\结束{tikzpicture}\结束{文档}

在此处输入图像描述

  • 开箱即用。谢谢您。 5月5日10:44
  • @蒂里·布朗不是蒂克k个Z、 所以你不能和Ti搭配k个但实际上可以使用相同的逻辑来构造Tik个Z图片。。。 5月5日10:55
  • @ThierryBlanc我添加了一个使用\图片基于相同的逻辑 5月5日12:01
7

根据阿兰·马特(Alain Matthes)非常友好的回答,他希望代码能在提出问题的蒂埃里·布朗(Thierry Blanc)的系统上编译。

\文档类[a4paper]{article}\使用包{tikz}\usetikzlibrary{交叉}\开始{文档}\开始{tikzpicture}\定义\ra{4}\定义\rb{6}\定义\r{.5}\坐标(A)位于(0,0);\坐标(B)位于(5,2);\绘制[name path=cercle A,cyan](A)圆[radius=\ra];\绘制[name path=cercle B,cyan](B)圆[radius=\rb];\路径[名称交集={of=圆环A和圆环B,by={E,F}}];\pgfmathsetmacro\raa{\ra-\r}\pgfmathsetmacro\rbb{\rb+\r}%按照@Qrrbrbirlbel的建议,用“overlay”替换下面的“draw=purple”参数,以隐藏紫色圆圈,并使图像边界框不超过需要的大小。\path[name path=cercle A',draw=purple](A)circle[radius=\raa];\路径[name path=cercle B',draw=purple](B)圆[radius=\rbb];\路径[名称交集={of=cercle A'和cercle B',by={P,Q}}];\绘制[橙色](P)圆[半径=\r];\结束{tikzpicture}\结束{文档}

在此处输入图像描述

4
0

以可用性为例,我为“两个圆和一个相邻的圆”编写了两个命令,并使用以下选项:

  • 将所有8个圆显示给2个给定的圆(\touchingCircleShow)
  • 获取这8个特定圆的中心点(总是成对的P和Q)
  • 获取相邻圆与两个圆之一(PM、PN、QM、QN)的接触点坐标

例如`\touchingCircleShow{}{A}{\ra}{D}{\rd}{\r}显示所有8个相邻的圆

\touchingCircleCoord{S}{A}{\ra}{D}{\rd}{\r}`返回创建圆或弧的坐标。请参见图。

在此处输入图像描述代码可能会得到大幅改进。。。

\文档类{独立}\使用包{tikz}\使用包{tkz-euclide}\usetikzlibrary{交叉}\使用包{xstring}\使用包{ifthen}\newcommand\touchingCircleShow[6]{%\{n,W,S,E}中的每个{\触摸圆圈坐标{\n}{#2}{#3}{#4}{#5}{#6}\绘制[color=red](P)圆[radius=#6]节点[center](){P-\n};\绘制[color=red](Q)圆[radius=#6]节点[center](){Q-\n};}}\新命令\ touchingCircleCoord[6]{%\如果其他{\等于{#1}{N}}{\pgfmathsetmacro\raa{3+6}\pgfmathsetmacro\rbb{5+6}}{}\如果其他{\等于{#1}{E}}{\pgfmathsetmacro\raa{3+6}\pgfmathsetmacro\rbb{5-6}}{}\如果其他{\等于{#1}{W}}{\pgfmathsetmacro\raa{3-6}\pgfmathsetmacro\rbb{5+6}}{}\如果其他{\等于{#1}{S}}{\pgfmathsetmacro\raa{3-6}\pgfmathsetmacro\rbb{5-6}}{}%%\tkzInterCC[R](#2,\raa)(#4,\rbb)\tkzGetPoints{P}{Q}%\tkzInterCC[](#2,#3)(P,#6)\tkzGetPoint{PM}%\tkzInterCC[](#4,#5)(P,#6)\tkzGetPoint{PN}%\tkzInterCC[](#2,#3)(Q,#6)\tkzGetPoint{QM}%\tkzInterCC[](#4,#5)(Q,#6)\tkzGetPoint{QN}\路径[name path=ciA,](#2)圆[radius=\raa];\路径[名称路径=ciB,](#4)圆[半径=\rbb];\路径[名称交集={of=ciA和ciB,by={P,Q}}];%\路径[名称路径=ciC](#2)圆[半径=#3];\路径[name path=ciD](#4)圆[radius=#5];\路径[名称路径=ciSm1](P)圆[半径=#6];\路径[name path=ciSm2](Q)圆[radius=#6];%   \路径[名称交集={of=ciC和ciSm1,by={PM}}];\路径[名称交集={of=ciD和ciSm1,by={PN}}];\路径[名称交集={of=ciC和ciSm2,by={QM}}];\路径[名称交集={of=ciD和ciSm2,by={QN}}];}\定义\ra{75}\定义{65}\定义\r{12}\开始{文档}\开始{tikzpicture}[scale=0.2]\坐标(A)位于(0,0);\坐标(D)位于(20,30);\绘制[name path=cA,cyan](A)圆[radius=\ra];\绘制[名称路径=cD,青色](D)圆[半径=\rd];\触摸圆圈显示{}{A}{\ra}{D}{\rd}{\r}\结束{tikzpicture}\开始{tikzpicture}[scale=0.2]\坐标(A)位于(0,0);\坐标(D)位于(20,30);\绘制[name path=cA,cyan](A)圆[radius=\ra];\绘制[name path=cD,cyan](D)圆[radius=\rd];%获取接触圆的坐标%#1 NWST方向(北、东、西、南)%#2#3:第一个圆心、半径%#4#5:第二个圆的中心、半径%#6半径邻接圆%%返回点P和Q、相邻圆心、PM/PN和QM/QN接触点%\触摸圆坐标{S}{A}{\ra}{D}{\rd}{\r}%经典邻接圆(绿色和青色)\绘制[绿色](P)圆[半径=\r];\绘制[黄色](Q)圆[半径=\r];% \触摸圆坐标{W}{A}{\ra}{D}{\rd}{\r}%使用圆弧的接触点\tkzDrawArc[R带节点,颜色=青色](P,\R)(PN,PM);\tkzDrawArc[R带节点,颜色=青色](Q,\R)(QM,QN);\结束{tikzpicture}\结束{文档}

你必须登录来回答这个问题。

不是你想要的答案吗?浏览标记的其他问题.