通过给定点在另一条线的上方/下方垂直绘制一条线

通过给定点在另一条线的上方/下方垂直绘制一条线

给定下面的点 A、B 和 P,我想画一条与 AB 平行且通过 P 的线(或者如果 P 不在 x 轴上的 A 和 B 之间,则仅指向 P,如本例所示)。换句话说,就是将 AB 向上/向下移动,使移动后的线与 P 共线。

在此处输入图片描述

期望输出(所示的点 R 仅用于说明):

在此处输入图片描述

以下是我目前所拥有的。本质上,它是将 P 垂直投影到 AB 上(称为投影 R),然后使用它tikz.calc来获取红线的起点和终点。我想知道是否有一种更简单的方法,理想情况下我可以不用设置虚拟点 Q 和 R?类似的问题是这里但在该问题中,P 必须垂直位于 A 或 B 的上方/下方。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}


\begin{document}
\begin{tikzpicture}[dot/.style={circle,inner sep=1pt,fill,label={#1},name=#1}]

    % define the points A, B, P
    \draw[dashed] (0,0) node[dot=A]{}
        -- (3,2) node[dot=B]{}
        (-1,0.5) node[dot=P]{};
    
    % find vertical projection of P on AB as R
    \path (P) +(0,-0.1) coordinate(Q); %0.1 is an arbitary value
    \node[dot=R] at (intersection of A--B and P--Q){}; %make R a coordinate in actual use
    
    \draw[red] ($(A)+(P)-(R)$) -- ($(B)+(P)-(R)$);
    
\end{tikzpicture}
\end{document}

答案1

我认为您已经给出了最简单直接的方法。我只是清理了代码。

在此处输入图片描述

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[dot/.style={circle,inner sep=1pt,fill=#1}]
\path
(0,0)     coordinate (A) node[dot]{} node[below]{$A$}
(3,2)     coordinate (B) node[dot]{} node[right]{$B$}
(-1,.5,0) coordinate (P) node[dot]{} node[above]{$P$}
+(90:1) coordinate (Pt)
(intersection of A--B and P--Pt) coordinate (R)
($(P)+(A)-(R)$) coordinate (Pa) node[dot=magenta]{} node[above left]{$P_a$}
($(P)+(B)-(R)$) coordinate (Pb) node[dot=magenta]{} node[above]{$P_b$}
;
\draw (A)--(B);
\draw[magenta] (Pa)--(Pb);
\end{tikzpicture}
\end{document}

答案2

通过使用极坐标,程序变得简单而简短:

\documentclass[margin=3mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{angles, % for show angle
                calc}

\begin{document}
    \begin{tikzpicture}[
dot/.style = {circle,inner sep=1pt,fill,label={[text=black]#1}, node contents={}}
                        ]
\draw[red] (0,0) node[dot=$P$] -- ++ (30:1) node (Pa) [dot=$P_a$] -- ++ (30:3) node (Pb) [dot=$P_b$];
\draw[dashed]   ($(Pa)!1cm!270:(Pb)$)       node (A)  [dot=$A$]   -- ++ (30:4) node[dot=$B$];
% for showing projection A on P -- Pb
\path[draw=gray, densely dashed, very thin] (Pa) -- (A) 
    pic [draw, angle radius=3mm] {right angle = Pb--Pa--A};
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案3

这个想法和你的想法类似渐近线

size(200);

pair A=(0,0),B=(3,2);
pair P=(-1,0.5);
pair R=extension(A,B,P,P+(0,1));

draw(A--B,dashed);
draw(shift(P-R)*(A--B),red);
dot("$P$",P,N);
dot("$A$",A,N);
dot("$B$",B,N);
dot("$R$",R,N);

输出就像你的第二张图片。

答案4

使用tzplot包裹:

在此处输入图片描述

\documentclass[tikz]{standalone}
    
\usepackage{tzplot}

\begin{document}

\begin{tikzpicture}
\tzhelplines(-1,-1)(4,3)
\tzcoors*(0,0)(A){$A$}(3,2)(B){$B$}(-1,0.5)(P){$P$};
\tzline[dashed](A)(B)
% get a slope and draw a line passing through (P)
\tzpointangle(A)(B){\myAng}
\tzLFn[red](P){tan(\myAng)}[0:3]
\end{tikzpicture}

\end{document}

相关内容