在 pgfmanual 中的邮票类示例中,邮票的位置作为两个单独的数字传递,即 x 坐标和 ay 坐标。是否可以改为传递坐标或某种“点”?
@percusse 自从我提出这个问题以来,我已经取得了一些进展,但还不够优雅。我欢迎大家指点如何以更好的方式将坐标放入类中。
\documentclass{article}
\usepackage{tikz}
\usepgfmodule{oo}
%http://tex.stackexchange.com/questions/33703/extract-x-y-coordinate-of-an-arbitrary-point-in-tikz
\makeatletter
\newcommand{\gettikzxy}[3]{%
\tikz@scan@one@point\pgfutil@firstofone#1\relax
\edef#2{\the\pgf@x}%
\edef#3{\the\pgf@y}%
}
\makeatother
\pgfooclass{rr}{
\method rr(#1,#2) { % The constructor; everything is done in here
% This doesn't seem to work
% \def\start{#1} % nor \def\start{(#1)}
% But here I can get named x and y coordinates
\gettikzxy{(#1)}{\spx}{\spy}
\gettikzxy{(#2)}{\epx}{\epy}
% I'd like named points to work with
\coordinate (Start) at (\spx, \spy);
\coordinate (End) at (\epx, \epy);
\draw (Start) -- (End) node[right] {It works!};
}
}
\begin{document}
\begin{tikzpicture}
\coordinate (A) at (0,0);
\coordinate (B) at (0,-1);
\def\hi{0.25}
\pgfoonew \AB=new rr(A,B);
\fill (A) circle (3pt);
\fill (B) circle (3pt);
\end{tikzpicture}
\end{document}
答案1
将位置作为两个单独的数字传递的原因是,中的逗号\mystamp.apply(1,2)
作为参数的分隔符,而不是坐标的一部分。
你可能已经知道,在通常的 Ti钾Z,写法不合适
\draw[shift=(3,4)](A)--(B);
只是因为逗号是样式键的分隔符,所以应该这样写
\draw[shift={(3,4)}](A)--(B);
这里的想法是一样的:如果你愿意用括号保护你的参数,那么你几乎可以传递任何东西:包括但不限于
- xy 坐标
(1,2)
- xyz 坐标
(3,4,5)
- 极坐标
(60:7)
- 坐标系
(canvas cs:x=8,y=9)
- 节点和节点锚点
(A.south east)
calc
图书馆提供的计算($(A)+(B)!.5!(C)$)
基本上,脏活都是由底层的 Ti 来完成的钾Z 解析器,而 oo 部分仅仅是语法糖。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepgfmodule{oo}
\begin{document}
\pgfooclass{pen}{
\method pen(){
%
}
\method point(#1,#2,#3){ % position,name,color
\path(#1)coordinate(#2)node[below right,text=#3]{$#2$};
}
\method segment(#1,#2,#3){ % start,end,color
\draw(#1)circle(.1)(#2)circle(.1);
\draw[#3](#1)--(#2);
}
\method ray(#1,#2,#3){ % start,end,color
\draw(#1)circle(.1)(#2)circle(.1);
\draw[#3,overlay,shorten >=-10000](#1)--(#2);
}
\method line(#1,#2,#3){ % start,end,color
\draw(#1)circle(.1)(#2)circle(.1);
\draw[#3,overlay,shorten <=-10000,shorten >=-10000](#1)--(#2);
}
}
\pgfoonew \mypen=new pen()
\begin{tikzpicture}
\draw[lightgray](-5,-5)grid(5,5);
\draw[->](-6,0)--(6,0);
\draw[->](0,-6)--(0,6);
\mypen.point({3,3},A,violet)
\mypen.point({current bounding box.200},B,olive)
\mypen.point({0,-4},C,brown)
\mypen.segment({-5,4},A,red)
\mypen.ray(B,{40:2},blue)
\mypen.line({$(A)+(0,-4)$},{$(C)!.5!(B)$},teal)
\end{tikzpicture}
\end{document}