如何在 tikz 中在四边形和三角形的边上画正方形?

如何在 tikz 中在四边形和三角形的边上画正方形?

如何在 tikz 中在四边形和三角形的边上绘制正方形?我想复制下面的 2 幅图像:

要复制的图像

答案1

使用tkz-euclide这很容易:

在此处输入图片描述

代码:

\documentclass[border=3pt]{standalone}
\usepackage{tkz-euclide}
\usetkzobj{all}

\begin{document}

\begin{tikzpicture}[>=latex,baseline]
\tkzDefPoint(0,0){A}
\tkzDefPoint(2,2){B}
\tkzDefPoint(1,4){C}
\tkzDefPoint(-2,3){D}

\tkzDefSquare(B,A)\tkzGetPoints{E}{F}
\tkzDefSquare(C,B)\tkzGetPoints{G}{H}
\tkzDefSquare(D,C)\tkzGetPoints{I}{J}
\tkzDefSquare(A,D)\tkzGetPoints{K}{L}

\tkzFillPolygon[draw,fill = red!50 ](A,B,F,E)
\tkzFillPolygon[draw,fill = blue!50 ](C,B,G,H)
\tkzFillPolygon[draw,fill = purple!50](C,D,J,I)
\tkzFillPolygon[draw,fill = green!50](D,A,L,K)
\tkzFillPolygon[draw,opacity=.5,fill = orange](A,B,C,D)

\tkzInterLL(A,F)(B,E) 
\tkzGetPoint{P}
\tkzDrawPoint(P)

\tkzInterLL(B,H)(C,G) 
\tkzGetPoint{Q}
\tkzDrawPoint(Q)

\tkzInterLL(C,J)(D,I) 
\tkzGetPoint{R}
\tkzDrawPoint(R)

\tkzInterLL(D,L)(A,K) 
\tkzGetPoint{S}
\tkzDrawPoint(S)

\tkzDrawSegments[->,thick](R,P Q,S)

\tkzInterLL(P,R)(Q,S) 
\tkzGetPoint{T}

\tkzMarkRightAngle(R,T,S)

\tkzLabelPoint[below](P){$r$}
\tkzLabelPoint[right](Q){$q$}
\tkzLabelPoint[above](R){$p$}
\tkzLabelPoint[left](S){$s$}

\tkzLabelPoint[left=5pt](D){$0$}

\tkzDrawSegment[->,thick](D,C)
\tkzLabelPoint[below=2pt](C){$2a$}
\tkzDrawSegment[->,thick](C,B)
\tkzLabelPoint[left=2pt](B){$2b$}
\tkzDrawSegment[->,thick](B,A)
\tkzLabelPoint[above=4pt](A){$2c$}
\tkzDrawSegment[->,thick](A,D)
\tkzLabelPoint[right=4pt](D){$2d$}

\begin{scope}[xshift=11cm]
\tkzDefPoint(0,0){A}
\tkzDefPoint(1,4){B}
\tkzDefPoint(-2,3){C}

\tkzDefSquare(C,B)\tkzGetPoints{D}{E}
\tkzDefSquare(A,C)\tkzGetPoints{F}{G}

\tkzFillPolygon[draw,fill = purple!50](B,C,E,D)
\tkzFillPolygon[draw,fill = green!50](C,A,G,F)
\tkzFillPolygon[draw,opacity=.5,fill = orange](A,B,C)

\tkzInterLL(C,D)(B,E) 
\tkzGetPoint{P}
\tkzDrawPoint(P)

\tkzInterLL(A,F)(C,G) 
\tkzGetPoint{Q}
\tkzDrawPoint(Q)

\tkzDefMidPoint(A,B)
\tkzGetPoint{R}
\tkzDrawPoint(R)

\tkzDrawSegments[dashed](Q,R R,P)
\tkzMarkRightAngle(Q,R,P)

\tkzLabelPoint[below](Q){$s$}
\tkzLabelPoint[right](R){$m$}
\tkzLabelPoint[left](P){$p$}
\end{scope}
\end{tikzpicture}

\end{document}

而更为朴素的版本则将填充颜色改为和gray!50white并添加框架和标签:

\documentclass[border=3pt]{standalone}
\usepackage{tkz-euclide}
\usetkzobj{all}

\begin{document}

\begin{tikzpicture}[>=latex,baseline]
\tkzDefPoint(0,0){A}
\tkzDefPoint(2,2){B}
\tkzDefPoint(1,4){C}
\tkzDefPoint(-2,3){D}

\tkzDefSquare(B,A)\tkzGetPoints{E}{F}
\tkzDefSquare(C,B)\tkzGetPoints{G}{H}
\tkzDefSquare(D,C)\tkzGetPoints{I}{J}
\tkzDefSquare(A,D)\tkzGetPoints{K}{L}

\tkzFillPolygon[draw,fill = gray!50 ](A,B,F,E)
\tkzFillPolygon[draw,fill = gray!50 ](C,B,G,H)
\tkzFillPolygon[draw,fill = gray!50](C,D,J,I)
\tkzFillPolygon[draw,fill = gray!50](D,A,L,K)
\tkzFillPolygon[draw,opacity=.5,fill = white](A,B,C,D)

\tkzInterLL(A,F)(B,E) 
\tkzGetPoint{P}
\tkzDrawPoint(P)

\tkzInterLL(B,H)(C,G) 
\tkzGetPoint{Q}
\tkzDrawPoint(Q)

\tkzInterLL(C,J)(D,I) 
\tkzGetPoint{R}
\tkzDrawPoint(R)

\tkzInterLL(D,L)(A,K) 
\tkzGetPoint{S}
\tkzDrawPoint(S)

\tkzDrawSegments[->,thick](R,P Q,S)

\tkzInterLL(P,R)(Q,S) 
\tkzGetPoint{T}

\tkzMarkRightAngle(R,T,S)

\tkzLabelPoint[below](P){$r$}
\tkzLabelPoint[right](Q){$q$}
\tkzLabelPoint[above](R){$p$}
\tkzLabelPoint[left](S){$s$}

\tkzLabelPoint[left=5pt](D){$0$}

\tkzDrawSegment[->,thick](D,C)
\tkzLabelPoint[below=2pt](C){$2a$}
\tkzDrawSegment[->,thick](C,B)
\tkzLabelPoint[left=2pt](B){$2b$}
\tkzDrawSegment[->,thick](B,A)
\tkzLabelPoint[above=4pt](A){$2c$}
\tkzDrawSegment[->,thick](A,D)
\tkzLabelPoint[right=4pt](D){$2d$}

\node[font=\bfseries] 
  at (current bounding box.north west) 
  {[a]}; 
\draw[densely dotted,thin,rounded corners=10pt]
  ([shift={(-10pt,10pt)}]current bounding box.north west)
  rectangle
  ([shift={(10pt,-10pt)}]current bounding box.south east);
\end{tikzpicture}\qquad
\begin{tikzpicture}[>=latex,baseline]
\tkzDefPoint(0,0){A}
\tkzDefPoint(1,4){B}
\tkzDefPoint(-2,3){C}

\tkzDefSquare(C,B)\tkzGetPoints{D}{E}
\tkzDefSquare(A,C)\tkzGetPoints{F}{G}

\tkzFillPolygon[draw,fill = gray!50](B,C,E,D)
\tkzFillPolygon[draw,fill = gray!50](C,A,G,F)
\tkzFillPolygon[draw,opacity=.5,fill = white](A,B,C)

\tkzInterLL(C,D)(B,E) 
\tkzGetPoint{P}
\tkzDrawPoint(P)

\tkzInterLL(A,F)(C,G) 
\tkzGetPoint{Q}
\tkzDrawPoint(Q)

\tkzDefMidPoint(A,B)
\tkzGetPoint{R}
\tkzDrawPoint(R)

\tkzDrawSegments[dashed](Q,R R,P)
\tkzMarkRightAngle(Q,R,P)

\tkzLabelPoint[below](Q){$s$}
\tkzLabelPoint[right](R){$m$}
\tkzLabelPoint[left](P){$p$}

\node[font=\bfseries] 
  at (current bounding box.north west) 
  {[b]}; 
\draw[densely dotted,thin,rounded corners=10pt]
  ([shift={(-10pt,10pt)}]current bounding box.north west)
  rectangle
  ([shift={(10pt,-10pt)}]current bounding box.south east);
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案2

并且简单地元帖子,显示

  • 如何用 Times New Roman 设置标签(如 OP 中所述)
  • 如何在两个子图之间共享路径和点
  • 如何将整齐的圆形框放在子图形周围
  • 如何制作开点标签

等等...

在此处输入图片描述

prologues := 3;
outputtemplate := "%j%c.eps";
verbatimtex
%&latex
\documentclass{minimal}
\usepackage{amssymb}
\usepackage{mathptmx}
\begin{document}
etex
defaultfont := "ptmr8r";

vardef almost expr p = p cutafter fullcircle scaled ahlength shifted point infinity of p enddef;

vardef open_dotlabel@#(expr s,z) text t_ =
  label@#(s,z) t_;
  interim linecap:=rounded;
  undraw z withpen pencircle scaled dotlabeldiam;
  draw fullcircle scaled dotlabeldiam shifted z t_;
enddef;

def frame_and_label(expr s) = 
   label(s,ulcorner currentpicture);
   draw (left--right) scaled 10 shifted urcorner currentpicture withcolor background;
   draw quartercircle rotated   0 scaled 1cm shifted urcorner currentpicture
     -- quartercircle rotated  90 scaled 1cm shifted ulcorner currentpicture
     -- quartercircle rotated 180 scaled 1cm shifted llcorner currentpicture
     -- quartercircle rotated 270 scaled 1cm shifted lrcorner currentpicture
     -- cycle dashed withdots scaled .2 withcolor .4 white;
enddef;

beginfig(12);
u := 8mm;
z0 = z4 = origin;
z1 =      (3.0u,0) rotated 20;
z2 = z1 + (2.0u,0) rotated -60;
z3 = z2 + (2.1u,0) rotated -140;
path s[], a[];
forsuffixes $=0,1,2,3: 
  s$ = unitsquare scaled (length (z[$+1]-z$)) rotated (angle (z[$+1]-z$)) shifted z$;
  z[$+5] = .5[point 0 of s$,point 2 of s$];
endfor
a1 = z5--z7;
a2 = z6--z8;
z9 = a1 intersectionpoint a2;

picture figa, figb;
figa = image(
   forsuffixes $=0,1,2,3: 
     fill s$ withcolor .7 white;
     draw s$;
     drawarrow z$ -- z[$+1] if $=3: cutafter fullcircle scaled 3 fi; 
   endfor
   draw unitsquare scaled 5 rotated (angle (z5-z7)) shifted z9 withcolor .5 white;
   drawarrow almost a1;
   drawarrow almost a2;

   open_dotlabel.top(btex $p$ etex, z5); 
   open_dotlabel.rt (btex $q$ etex, z6); 
   open_dotlabel.bot(btex $r$ etex, z7);
   open_dotlabel.lft(btex $s$ etex, z8); 
   open_dotlabel.lft(btex $0$ etex, z0); 

   label.bot (btex $\scriptstyle 2a$ etex, .9[z0,z1]);
   label.lft (btex $\scriptstyle 2b$ etex, .9[z1,z2]);
   label.ulft(btex $\scriptstyle 2c$ etex, .8[z2,z3]);
   label.urt (btex $\scriptstyle 2d$ etex, .85[z3,z4]);
   label.urt (btex $B$ etex, point .85 of a1);
   label.ulft(btex $A$ etex, point .85 of a2);

   frame_and_label("[a]");
);
figb = image(
   forsuffixes $=0,3: 
     fill s$ withcolor .7 white;
     draw s$;
   endfor
   draw point 1 of s0 -- point 0 of s3;

   draw unitsquare scaled 5 rotated (angle (z5-z7)) shifted z9 withcolor .5 white;
   draw z5 -- z9 -- z8 dashed evenly;

   open_dotlabel.top(btex $p$ etex, z5); 
   open_dotlabel.lft(btex $s$ etex, z8); 
   open_dotlabel.lrt(btex $m$ etex, z9); 

   frame_and_label("[b]");
);

draw figa;
draw figb shifted (10u,0);

endfig.

end.

答案3

只是为了好玩而使用 PSTricks。我先从比较简单的开始。其他图表稍后会添加。

第二张图

\documentclass[pstricks,border=12pt,12pt]{standalone}
\usepackage{pst-eucl}
\newpsobject{myframe}{psframe}{fillstyle=solid,fillcolor=lightgray,opacity=0.5}

\begin{document}
\begin{pspicture}[showgrid=false,saveNodeCoors,NodeCoorPrefix=N](7,10)
    \pstGeonode[PosAngle={90,-135}](4,7){p}(3,3){s}
    \psset{PointName=none,PointSymbol=none}
    \pstGeonode(4,5){r}
    \pstMiddleAB{p}{s}{c}
    \pstRotation[RotAngle=90]{p}{r}[qtemp]\pnode(qtemp){q}
    \pstRotation[RotAngle=-90]{s}{r}[ttemp]\pnode(ttemp){t}
    \rput{!Nqy Nry sub Nqx Nrx sub atan}(r){\myframe[](!Nqx Nqy Nrx Nry Pyth2 dup)}
    \rput{!Nty Nry sub Ntx Nrx sub atan 90 sub}(r){\myframe(!Ntx Nty Nrx Nry Pyth2 dup)}
    \psline(t)(q)
    \pstInterLC[PointNameB=m,PointSymbolB=*]{t}{q}{c}{p}{M}{N}
    \psline[linestyle=dashed](s)(N)(p)
    \pstRightAngle{s}{N}{p}
\end{pspicture}
\end{document}

在此处输入图片描述

相关内容