该图是关于一个问题的 - “求出一个多边形内可以容纳的最大正方形的面积,该多边形是通过移除一个较大的 10*10 正方形的四个角上的 2*2 正方形而形成的” 我已经画出了这个图,但必须计算所有的坐标。有没有办法在不计算 W、X、Y、Z 的具体坐标的情况下画出这个图?这是我所做的。
\documentclass[tikz, border=1cm]{standalone}
\usepackage{tkz-euclide}
\begin{document}
\begin{tikzpicture}
\tkzDefPoint(2,0){A_1}
\tkzDefPoint(2,2){A_2}
\tkzDefPoint(0,2){A_3}
\tkzDefPoint(10,2){B_1}
\tkzDefPoint(8,2){B_2}
\tkzDefPoint(8,0){B_3}
\tkzDefPoint(8,10){C_1}
\tkzDefPoint(8,8){C_2}
\tkzDefPoint(10,8){C_3}
\tkzDefPoint(0,8){D_1}
\tkzDefPoint(2,8){D_2}
\tkzDefPoint(2,10){D_3}
\tkzDefPoint(7.236, 0){W}
\tkzDefPoint(10,7.236){X}
\tkzDefPoint(2.763,10){Y}
\tkzDefPoint(0,2.763){Z}
\tkzDrawPolygon(A_1,A_2,A_3,D_1,D_2,D_3,C_1,C_2,C_3,B_1,B_2,B_3)
\tkzDrawPolygon(W,X,Y,Z)
\tkzDrawPoints(A_1,A_2,A_3,B_1,B_2,B_3,C_1,C_2,C_3,D_1,D_2,D_3,W,X,Y,Z)
\tkzLabelPoints(A_1,A_2,A_3,B_1,B_2,B_3,C_1,C_2,C_3,D_1,D_2,D_3,W,X,Y,Z)
\end{tikzpicture}
\end{document}
答案1
这是我添加到图片中的几乎微不足道的计算。大正方形H
和小正方形 的大小h
存储在函数中,您可以调整这些函数。一切都是根据这些计算得出的。
\documentclass[tikz,border=3mm]{standalone}
\begin{document}
\begin{tikzpicture}[>=latex,
declare function={H=10;h=2;hprime=(H-sqrt(H*H-4*h*H))/2;}]
\draw (-H/2,H/2-h) -| (-H/2+h,H/2) -| (H/2-h,H/2-h) -| (H/2,-H/2+h) -| (H/2-h,-H/2)
-| (-H/2+h,-H/2+h) -| cycle;
\draw (-H/2+hprime,H/2) -- (H/2,H/2-hprime) -- (H/2-hprime,-H/2) -- (-H/2,-H/2+hprime)
--cycle;
\draw[|<->|] (-H/2-2,H/2) -- node[fill=white] {$H-h'$} ++ (0,-H+hprime);
\draw[|<->|] (-H/2-1,H/2-h) -- node[fill=white] {$H-h-h'$} ++ (0,-H+hprime+h);
\draw[|<->|] (H/2-h+0.3,H/2) -- node[fill=white] {$h$} ++ (0,-h);
\draw[|<->|] (-H/2,H/2-h+0.3) -- node[fill=white] {$h$} ++(h,0);
\draw[|<->|] (-H/2,H/2+0.3) -- node[fill=white] {$h'$} ++(hprime,0);
\path (current bounding box.north) node[above=2em]
{$\displaystyle\frac{h}{H-h-h'}=\frac{h'}{H-h'}\quad
\Rightarrow\quad
h'=\frac{1}{2}(H-\sqrt{H^2-4\,h\,H})$ };
\end{tikzpicture}
\end{document}
编辑:修复显示公式的拼写错误,绘图代码不变。
顺便说一句,显然有人需要要求这一点h<H/4
。
\documentclass[tikz,border=3mm]{standalone}
\begin{document}
\foreach \X in {0.5,0.6,...,2.4,2.41,2.42,...,2.5,2.49,2.48,...,2.4,2.3,2.2,...,0.6}
{\begin{tikzpicture}[declare function={H=10;h=\X;
hprime=(H-sqrt(abs(H*H-4*h*H)))/2;}]
\draw (-H/2,H/2-h) -| (-H/2+h,H/2) -| (H/2-h,H/2-h) -| (H/2,-H/2+h) -| (H/2-h,-H/2)
-| (-H/2+h,-H/2+h) -| cycle;
\draw (-H/2+hprime,H/2) -- (H/2,H/2-hprime) -- (H/2-hprime,-H/2) -- (-H/2,-H/2+hprime)
--cycle;
\end{tikzpicture}}
\end{document}
h
通过求解的函数,可以使动画更加流畅hprime
。
\documentclass[tikz,border=3mm]{standalone}
\begin{document}
\foreach \X in {5,15,...,355}
{\begin{tikzpicture}[declare function={H=10;hprime=(1+sin(\X))*H/2;
h=((H-hprime)*hprime)/H;}]
\draw (-H/2,H/2-h) -| (-H/2+h,H/2) -| (H/2-h,H/2-h) -| (H/2,-H/2+h) -| (H/2-h,-H/2)
-| (-H/2+h,-H/2+h) -| cycle;
\draw (-H/2+hprime,H/2) -- (H/2,H/2-hprime) -- (H/2-hprime,-H/2) -- (-H/2,-H/2+hprime)
--cycle;
\end{tikzpicture}}
\end{document}
答案2
这是一个解决方案元帖子。这包含在 中luamplib
,因此您需要使用 来编译它lualatex
。我把 留给dotlabels
读者作为练习。
\documentclass[border=5mm]{standalone}
\usepackage{luamplib}
\begin{document}
\mplibtextextlabel{enable}
\begin{mplibcode}
beginfig(1);
path poly, sq, c;
poly = (for i=0 upto 3: subpath (3, 1) of unitsquare scaled 2
shifted (-5, -5) rotated 90i -- endfor cycle) scaled 1cm;
c = fullcircle rotated 184 scaled abs(point 1 of poly - point 4 of poly)
shifted 1/2[point 1 of poly, point 4 of poly];
(t, u) = poly intersectiontimes c;
sq = for i=0 upto 3: point t + 3i of poly -- endfor cycle;
fill poly withcolor 7/8 [blue, white];
draw poly;
fill sq withcolor background;
draw sq withcolor 2/3 blue;
endfig;
\end{mplibcode}
\end{document}
笔记
该
poly
路径的构造方法是将标准路径的顶部和右侧缩放unitsquare
并移至左下方,然后旋转四次。--
循环中的足以绘制长边。要解决这个难题,您需要在前两个内角之间画一个圆,然后找到它与多边形相切的位置。这是命令
t
返回的时间intersectiontimes
。将圆旋转 184 度很重要;否则您会在拐角处找到交点,而不是沿着长边找到交点。利用路径上的时间,您只需连接多边形的点 t、t+3、t+6 和 t+9。
为了得到“另一个”解决方案,将圆旋转 274 度而不是 184 度
如果你想看到圆圈,请尝试添加
draw c dashed withdots scaled 1/2 withcolor 2/3 red;
最后,如果您希望 MP 为您找到实际区域,请尝试在末尾添加以下内容:
label(decimal round((abs(point 1 of sq - point 0 of sq)/cm)**2), origin);
。在我的系统上,这显示“60”。
答案3
使用 tkz-euclide
\documentclass{standalone}
\usepackage{tkz-euclide}
\begin{document}
\begin{tikzpicture}
\pgfmathsetmacro{\h}{sqrt(5)}
\tkzDefPoints{0/0/A,10/0/B,2/0/A_1,8/0/B_3,10/8/C_3,2/10/D_3,0/5-\h/Z}
\tkzDefSquare(A,B)\tkzGetPoints{C}{D}
\tkzDefSquare(A,A_1)\tkzGetPoints{A_2}{A_3}
\tkzDefSquare(B_3,B)\tkzGetPoints{B_1}{B_2}
\tkzDefSquare(C_3,C)\tkzGetPoints{C_1}{C_2}
\tkzDefSquare(D_3,D)\tkzGetPoints{D_1}{D_2}
\tkzInterLL(Z,A_2)(A,B)\tkzGetPoint{W}
\tkzDrawPolygon(A_3,A_2,A_1,B_3,B_2,B_1,C_3,C_2,C_1,D_3,D_2,D_1)
\tkzDefSquare(Z,W) \tkzGetPoints{X}{Y}
\tkzDrawPolygon(X,Y,Z,W)
\end{tikzpicture}
\end{document}
但是为什么 XYZW 是最大的正方形?