\documentclass[border=2pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{math,calc,intersections,through,angles,arrows.meta,shapes.geometric,shadows,quotes,spy,datavisualization,datavisualization.formats.functions,plotmarks}
\tikzset{every picture/.style={samples=300,smooth,line join=round,thick,>=Stealth,font=\small}}
\begin{document}
\begin{tikzpicture}[scale=.4]
\draw[->](-2,0)--(5.5,0)node[below]{$x$};
\draw[->](0,-4.5)--(0,4.5)node[right]{$y$};
\coordinate[label=-135:$O$](O)at(0,0);
\draw[cyan,domain=-4.5:4.5]plot(\x*\x/4,\x);
\coordinate[label=left:$C$](C)at(2,1);
\draw[red](C)circle(2);
\coordinate[label=above:$P$](P)at(4,4);
\draw[cyan,domain=-4.5:4.5]plot(-1,\x);
\draw (P)--(tangent cs:node=C,point={(P)},solution=1)--(C.center)--cycle;
\end{tikzpicture}
\end{document}
不知道问题出在哪了,求助,谢谢!
预期的目标效果是什么呢?
这个图中的c
是一个node
,圆周是node
的边界,而你代码中:
\coordinate[label=left:$C$](C)at(2,1);
\draw[red](C)circle(2);
\draw(P)--(tangent cs:node=C,point={(P)},solution=1)--(C.center)--cycle;
圆周是一个path
,你用tangent cs
绘制的是对coordinate
点C
的切线,而点是没有半径的,所以重合了...
BTW,下面这些包只有calc
和你的问题有关。
\usetikzlibrary{
% math,
calc,
% intersections,
% through,
% angles,
arrows.meta,
% shapes.geometric,
% shadows,
% quotes,
% spy,
% datavisualization,
% datavisualization.formats.functions,
% plotmarks
}
我认为的最佳实践,当涉及「圆锥曲线」时,比较系统化的作图方式是基于tkz-elements
,下面的代码虽然较长,但是逻辑清晰,可拓展性强,方便多次复用。
\documentclass[tikz,border=2pt]{standalone}
\usepackage{tkz-euclide,tkz-elements}
\directlua{
init_elements()
z.O = point(0, 0)
z.C = point(2, 1)
z.P = point(4, 4)
% -- 准线
z.L1 = point(-1,-4.5)
z.L2 = point(-1,4.5)
L.line = line(z.L1, z.L2)
% -- 抛物线
z.F = point(1, 0)
CO.PA = conic(z.F, L.line, 1)
PA.PA = CO.PA:points(-4.5, 4.5, 300)
% -- 定义圆
z.c = point(0, 1)
C.Cc = circle(z.C, z.c)
% -- 定义过P做圆C的切线
L.T1,L.T2 = C.Cc:tangent_from(z.P)
z.T1 = L.T1.pb
z.T2 = L.T2.pb
}
\begin{document}
\begin{tikzpicture}[scale=.4,smooth,line cap=round]
\tkzGetNodes
\tkzInit[xmin=-2,xmax=5.5,ymin=-4.5,ymax=4.5]
\tkzDrawX[noticks]\tkzDrawY[noticks]
\tkzDrawCircle[red,thick](C,c)
\tkzDrawPoints(O,P,C,T1,T2)
\tkzLabelPoints[below left](O,P,C)
\tkzDrawSegment[cyan,thick](L1,L2)
\tkzDrawCoordinates[smooth,cyan,thick](PA.PA)
\tkzDrawSegments[violet,thick](P,T1 T1,C C,T2 T2,P)
\end{tikzpicture}
\end{document}
谢谢指点,没明白例子中node的作用。
@u1680 我的代码还没贴呢....
要完全按照文档中提供的做法来的话...
@u70550 谢谢!厉害!其实不用tangent系统利用圆找交点我会画,但感觉那样还是麻烦一些。
此处显然有一些不完美的地方
这里的
minimum size=1.6cm
是我试出来的...为什么圆心在
(2,1)
的,在scale=0.4
的时候需要minimum size=1.6cm
呢?另外,在画这种图的时候,「圆C」显然应该是 路径 ,而不是某个
node
的 边界虽然他们看起来一样,但是他们充当的角色是不同的,上面的代码中的圆C,有点像披着羊皮的狼,这是 不太好 的...
@u1680 我晚点补充一个语法更简单的方法吧(或者我认为这种图的最佳实践吧)...不需要显式调用
intersections
库...@u70550 如果以PC中点D为圆心以|CD为半径作圆D,则两切点为圆C与圆D的交点,按这个思路画我会画,想学手册中tangent系统中的方法绘制切线,结果没弄明白node的作用,误以为只是画圆,用draw替换后导致作图失败。当时不明白两个画圆的方法有区别。
@u70550 我记得之前作图的时候对x,y放缩系数不同,画出的点会是个椭圆,用tkz画那个点不会出问题。当时的问题也是您回答的,scale在作图中有时会对图内部的东西产生影响。
@u1680 可是这里是
scale
,伸缩方向是一样的...而tikz
默认的单位也为cm
....