我想画这样的东西:
目前我能做的最好的事情是:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\resizebox{0.95\textwidth}{!}{
\begin{tikzpicture}
\newcommand\Square{+(-1,-1) rectangle +(1,1)}
\draw (0,0) rectangle (8,6);\node at (4,0.5) {$I_1$};
\node[label=$p$] (p) at (3,4) {};
\draw [orange] plot [only marks, mark size=2.5, mark=*] coordinates {(3,4)};
\draw[fill =blue,fill opacity=0.1] (p) \Square;
\draw (10,0) rectangle (18,6);\node at (14,0.5) {$I_2$};
\node[label=below:$p'$] (p') at (12.5,2.7) {};
\draw [orange] plot [only marks, mark size=2.5, mark=*] coordinates {(12.5,2.7)};
\draw[thick,->] (p) edge[bend right] (p');
\draw[fill =blue,fill opacity=0.1,rotate=50] (p') \Square;
\end{tikzpicture}}
\end{document}
结果不太令人满意。希望有人能帮忙。先谢谢了。
答案1
scope
这可以通过使用s 和坐标变换轻松完成。
首先,不要使用“高级”坐标例程,只需执行以下操作:
\fill[orange] (3,4) circle (2.5pt);
其结果相同。
然后继续进行转变。
第二个矩形可以用相同的命令和scope
% Draw next rectangle, move everything 10cm to the right
\begin{scope}[xshift=10cm]
\draw (0,0) rectangle (8,6);
\node at (4,0.5) {$I_2$};
\node[label=$p'$] (p') at (3,4) {};
\fill[orange] (p') circle (2.5pt);
\end{scope}
现在讨论剩下的部分。
您可以对另一个进行操作scope
并在该范围内转换坐标。
这可以使用构造来完成。它允许您为坐标cm={x,xy,yx,y,(coord)}
创建矩阵转换。(x,y)
完整内容如下:
\begin{tikzpicture}[scale=.7]
\newcommand\Square{+(-1,-1) rectangle +(1,1)}
% Draw first rectangle and name
\draw (0,0) rectangle (8,6);
\node at (4,0.5) {$I_1$};
\node[label=$p$] (p) at (3,4) {};
% Fill square
\draw[fill=blue,fill opacity=0.1] (p) \Square;
\draw[->,>=latex] (p) ++(-1,-1) -- ++(2.5,0);
\draw[->,>=latex] (p) ++(-1,-1) -- ++(0,2.5);
\fill[orange] (p) circle (2.5pt);
% Draw next rectangle
\begin{scope}[xshift=10cm]
\draw (0,0) rectangle (8,6);
\node at (4,0.5) {$I_2$};
\node[label=$p'$] (p') at (3,4) {};
\fill[orange] (p') circle (2.5pt);
\begin{scope}[cm={.74,.74,-.74,.74,(0,0)}]
\draw[->,>=latex] (p') ++(-1,-1) -- ++(2.5,0);
\draw[->,>=latex] (p') ++(-1,-1) -- ++(0,2.5);
\draw[fill=blue,fill opacity=0.1] (p') \Square;
\end{scope}
\end{scope}
\draw[thick,->] (p) edge[bend right] (p');
\end{tikzpicture}
它产生了这个:
您可以轻松地调整转换中的不同元素。
答案2
您的意思是您的结果不令人满意,这取决于其代码还是外观?如果您想获得一些可以重用的代码,您可以执行以下操作。它使用 -environmentscope
来执行shift
and rotate
。
\documentclass[tikz, border=5mm]{standalone}
\begin{document}
\begin{tikzpicture}[very thick]
\foreach \xoffset\lbl in {0/1,10/2} {
\draw (\xoffset,0) rectangle ++(8,6) node [midway,below=2cm] {$I_\lbl$};
}
\newcommand{\Square}[4]{
% Draw a square with {(x,y)}{rotation}{label}{name}
\begin{scope}[shift={#1}, rotate=#2, >=latex]
\draw [fill=blue!10!white] (-1,-1) rectangle (1,1) node [midway, circle, fill=orange, inner sep=2pt, label={90:{#3}}] (#4) {};
\draw [<->] (1.5,-1) -- ++(-2.5,0) -- ++(0,2.5);
\end{scope}
}
% Draw the squares and connect their centers
\Square{(3,4)}{0}{$p$}{p1}
\Square{(12,3)}{45}{$p'$}{p2}
\draw [->] (p1) to [out=-75, in=195] (p2);
\end{tikzpicture}
\end{document}
这样,您就可以\Square
非常轻松地重复使用并将其作为节点引用。您可以根据需要添加其他参数(节点标签的旋转,...)。代码生成以下内容: