pgfooclass:将坐标传递给构造函数或方法

pgfooclass:将坐标传递给构造函数或方法

在 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)作为参数的分隔符,而不是坐标的一部分。

你可能已经知道,在通常的 TiZ,写法不合适

\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}

相关内容