在多边形内放入最大正方形

在多边形内放入最大正方形

该图是关于一个问题的 - “求出一个多边形内可以容纳的最大正方形的面积,该多边形是通过移除一个较大的 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 是最大的正方形?

在此处输入图片描述

相关内容