使用 tikz 绘制一个框,给定两个点

使用 tikz 绘制一个框,给定两个点

我需要定义一个 latex 宏,它取 tikz 图片中的两个点 p1、p2,并绘制一个框,其对角线由 p1 -- ({max(p1 的 hor 分量、p2 的 hor 分量)}, p2 的 ver 分量) 给出。

我没有正确理解要点的各个组成部分的语法。我的情况如下:

\makeatletter
\newcommand{\HOR}[1]{\pgf@x{#1}}
\newcommand{\VER}[1]{\pgf@y{#1}}
\makeatother

\newcommand{\TIKZBOX}[2]{
  \draw (#1) rectangle ({max(\HOR{#1}, \HOR{#2})}, \VER{#2});
}

答案1

一种可能的解决方案是加载tkz-euclide基于 TikZ 的包。它有各种命令来定义新形状,其中之一是正方形。我把它包装在一个中,\newcommand这样你就不必再写一遍了。你只需要提供 2 个坐标,它会处理剩下的事情。

输出

在此处输入图片描述

代码

\documentclass[tikz, margin=10pt]{standalone}
\usepackage{tkz-euclide}

\newcommand\Squarify[3][]{%
    \tkzDefPoint(#2){A} \tkzDefPoint(#3){B}
    \tkzDefSquare(A,B)
    \tkzDrawPolygon[#1](A,B,tkzFirstPointResult,%
    tkzSecondPointResult)
}

\pgfmathsetseed{1234}% ensures same result in output for this example

\begin{document}
\begin{tikzpicture}

    \Squarify{0,0}{1,0}% reference without color

    \foreach \colors in {red,blue,yellow,orange,green,violet}{%
        \pgfmathsetmacro{\Xa}{random(3)+random(2)}
        \pgfmathsetmacro{\Ya}{random(3)+random(2)}
        \pgfmathsetmacro{\Xb}{random(3)+random(2)}
        \pgfmathsetmacro{\Yb}{random(3)+random(2)}
        \Squarify[color=\colors]{\Xa,\Ya}{\Xb,\Yb}
    }
\end{tikzpicture}
\end{document}

答案2

这是另一种仅使用 TikZ 而不加载其他包的解决方案。

输出

在此处输入图片描述

代码

\documentclass[tikz, margin=10pt]{standalone}

\newcommand\Squarify[3][]{%
    \coordinate (A) at (#2);
        \path (#2);
        \pgfgetlastxy{\tempAx}{\tempAy}
    \coordinate (B) at (#3);
        \path (#3);
        \pgfgetlastxy{\tempBx}{\tempBy}
    \pgfmathtruncatemacro\XCoordA{\tempAx*1pt/1cm}
    \pgfmathtruncatemacro\YCoordA{\tempAy*1pt/1cm}
    \pgfmathtruncatemacro\XCoordB{\tempBx*1pt/1cm}
    \pgfmathtruncatemacro\YCoordB{\tempBy*1pt/1cm}
    \pgfmathtruncatemacro\XCoordC{\XCoordB-(\YCoordB-\YCoordA)}
    \pgfmathtruncatemacro\YCoordC{\YCoordB+(\XCoordB-\XCoordA)}
    \pgfmathtruncatemacro\XCoordD{\XCoordA-(\YCoordB-\YCoordA)}
    \pgfmathtruncatemacro\YCoordD{\YCoordA+(\XCoordB-\XCoordA)}
    \draw[#1] (A) -- (B) -- 
        (\XCoordC,\YCoordC) coordinate (C) -- 
        (\XCoordD,\YCoordD) coordinate (D) -- cycle;
%   
}

\pgfmathsetseed{1234} % again to ensure same colored squares

\begin{document}
\begin{tikzpicture}
    \Squarify{0,0}{1,0}
    \foreach \colors in {red,blue,yellow,orange,green,violet}{%
        \pgfmathsetmacro{\Xa}{random(3)+random(2)}
        \pgfmathsetmacro{\Ya}{random(3)+random(2)}
        \pgfmathsetmacro{\Xb}{random(3)+random(2)}
        \pgfmathsetmacro{\Yb}{random(3)+random(2)}
        \Squarify[color=\colors]{\Xa,\Ya}{\Xb,\Yb}
    }
\end{tikzpicture}
\end{document}

相关内容