我想绘制一个二维 $x_1 - x_2$ 坐标系和一个阴影多边形由
$ −3x_1 + 4x_2 \leq 4, 3x_1 + 2x_2 \leq 11, 2x_1 − x_2 \leq 5, x_1 , x_2 \geq 0 $
如何使用 TikZ 绘制这个?
感谢致敬!
更新:
我刚刚学到了一些东西这个帖子(或者如果您有更好的想法,请随时回复)。
这是我的情节,我想知道如何向实线包围的多边形和虚线包围的多边形添加不同的阴影?
这是我的代码:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw[very thin,color=gray] (-0.1,-0.1) grid (4.9,3.1);
\draw[->] (-0.2,0) -- (4.2,0) node[right] {$x_1$};
\draw[->] (0,-0.2) -- (0,3.2) node[above] {$x_2$};
\draw[domain=0:3] plot (\x,{1+ 0.75 * \x}) node[above right] {$-3x_1+4x_2 =4$};
\draw[domain=1.5:4] plot (\x,{5.5 - 1.5 * \x}) node[below right] {$3x_1 + 2x_2 = 11$};
\draw[domain=2:4] plot (\x,{-5+2 * \x}) node[below right] {$2x_1 - x_2 =5$};
\node at (2,3) {(2, 2.5)};
\node at (3.5,1) {(3, 1)};
\node at (3,-0.25) {(2.5, 0)};
\node at (-0.25,-0.25) {(0, 0)};
\node at (-0.5,1) {(0, 1)};
\draw[dashed] (0,1) -- (2,2);
\draw[dashed] (2,2) -- (3,1);
\draw[dashed] (3,1) -- (2,0);
\draw[dashed] (2,0) -- (0,0);
\draw[dashed] (0,0) -- (0,1);
\node at (2,1.5) {(2, 2)};
\node at (2,-0.25) {(2, 0)};
\end{tikzpicture}
\end{document}
答案1
这是另一种不使用交叉点而是使用路径裁剪的方法。我们绘制的每条路径,我们都会针对该路径定义一个裁剪。这意味着“绘制”路径两次:一次用于绘制,一次用于裁剪(而且我没有看到合并这两次的快速方法,因为它们必须在不同的时间发生)。我喜欢这种方法的一点是,图形包正在做的事情是数学到底在做什么也就是说,每个不等式都指定了平面的“裁剪”,表示“在此之后,我们只对这条线的一侧感兴趣,而其他一切都丢弃。”。这正是裁剪的作用。
\documentclass{article}
\pagestyle{empty}
\usepackage[svgnames]{xcolor}
\usepackage{tikz}
\usepackage{mathtools}
\def\nudge{.5}
\tikzset{axis/.style={ultra thick, Red!75!black, -latex, shorten <=-\nudge cm, shorten >=-2*\nudge cm}}
\tikzset{line/.style={thick,Green}}
\begin{document}
\begin{tikzpicture}
\draw[axis] (0,0) -- (4,0) node[right=2* \nudge cm] {\(x_1\)};
\draw[axis] (0,0) -- (0,4) node[above=2*\nudge cm] {\(x_2\)};
\begin{scope}
\clip (-\nudge ,-\nudge) rectangle (4+\nudge,4+\nudge);
\draw[line] (0,1) -- (4,4) coordinate (ineq1);
\draw[line] (0,5.5) -- (4,-.5) coordinate (ineq2);
\draw[line] (0,-5) -- (4,3) coordinate (ineq3);
\begin{scope}
\clip (0,1) -- (4,4) |- (0,0);
\clip (0,5.5) -- (4,-.5) -| (0,0);
\clip (0,-5) -- (4,3) |- (4,4) -| (0,0);
\fill[Red,opacity=.5] (0,0) rectangle (4,4);
\end{scope}
\draw[dashed,line] (0,1) -- (2,2) -- (3,1) -- (2,0);
\clip (0,1) -- (2,2) -- (3,1) -- (2,0) -| (0,1);
\fill[Blue,opacity=.5] (0,0) rectangle (4,4);
\end{scope}
\node[above right] at (ineq1) {\(\mathllap{-}3 x_1 + 4 x_2 = 4\)};
\node[below right] at (ineq2) {\(3 x_1 + 2 x_2 = 11\)};
\node[above right] at (ineq3) {\(2 x_1 - x_2 = 5\)};
\foreach \coord/\adj in {
{(2,2)}/right,
{(0,1)}/left,
{(0,0)}/below left,
{(2,0)}/below left,
{(2.5,0)}/below right,
{(3,1)}/right,
{(2,2.5)}/right%
} {
\fill \coord circle (2pt) node[\adj] {\coord};
}
\end{tikzpicture}
\end{document}
本答案的其他方面:
- 我们使用剪辑来避免必须过于仔细地制定线条公式(并且我们将这些线条绘制为简单的线条而不是使用绘图函数)。
- 当我们想要标记线条时,我们会使用节点坐标,因为将标签直接放在线条上不会影响剪辑。
- 请注意使用
\mathllap
来调整其中一个标签的位置(这就是为什么mathtools
包括它)。 - 注意使用消极的轴线缩短。
答案2
这是其中一种方法。代码使用交点来计算多边形的顶点(请注意,交点库仅从 TikZ v2.10 开始可用)。标签是使用操作生成的let
,该操作允许访问节点的坐标(感谢 Antal)。填充路径在 TikZ v2.10 手册的第 15.4 节“填充路径”中进行了描述。您还可以应用各种模式。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{intersections,positioning,calc}
\begin{document}
% print a point given by two coordinates in pt (output is in cm)
\newcommand*\printpoint[2]{(%
\pgfmathparse{0.03514598035*#1}\pgfmathprintnumber{\pgfmathresult}, %
\pgfmathparse{0.03514598035*#2}\pgfmathprintnumber{\pgfmathresult})%
}
\begin{tikzpicture}
% grid and axes
\draw[very thin,color=gray] (-0.1,-0.1) grid (4.1,3.1);
\draw[->,name path=xaxis] (-0.2,0) -- (4.2,0) node[right] {$x_1$};
\draw[->,name path=yaxis] (0,-0.2) -- (0,3.2) node[above] {$x_2$};
% lines
\draw[name path=line1,domain=0:3] plot (\x,{1+ 0.75 * \x}) node[above right] {$-3x_1+4x_2 =4$};
\draw[name path=line2,domain=1.5:4] plot (\x,{5.5 - 1.5 * \x}) node[below right] {$3x_1 + 2x_2 = 11$};
\draw[name path=line3,domain=2:4] plot (\x,{-5+2 * \x}) node[below right] {$2x_1 - x_2 =5$};
% calculate intersection points
\node[name intersections={of=line1 and line2}] (a) at (intersection-1) {};
\node[name intersections={of=line2 and line3}] (b) at (intersection-1) {};
\node[name intersections={of=line3 and xaxis}] (c) at (intersection-1) {};
\node (d) at (0,0) {};
\node[name intersections={of=yaxis and line1}] (e) at (intersection-1) {};
% draw the big polygon
\filldraw[ultra thick,fill=green!80!black,fill opacity=0.4] (a.center) -- (b.center) -- (c.center) -- (d.center) -- (e.center) -- cycle;
% label the vertices
\path let \p0 = (a) in node [left=0.1cm of a] {\printpoint{\x0}{\y0}};
\path let \p0 = (b) in node [right=0cm of b] {\printpoint{\x0}{\y0}};
\path let \p0 = (c) in node [below right=0cm and -0.1cm of c.center] {\printpoint{\x0}{\y0}};
\path let \p0 = (d) in node [below left=0cm of d.center] {\printpoint{\x0}{\y0}};
\path let \p0 = (e) in node [left=0cm of e.center] {\printpoint{\x0}{\y0}};
% draw the small polygon
\filldraw[thick,dashed,fill=blue,fill opacity=0.4] (0,1) -- (2,2) -- (3,1) -- (2,0) -- (0,0) -- cycle;
\end{tikzpicture}
\end{document}
答案3
我的解决方案使用了我的新包 tkz-fct 和 tkz-euclide,但没有必要使用 tkz-fct,因为可以使用直线来获取点,而无需使用 gnuplot :(。如果您直接想要线条,可以使用 tkzDefpoint(x,y){Name} 定义一个点,然后可以使用 tkzDrawLine(A,B) 绘制一条线。这是我使用 tkz-fct 的代码
备注:对于一条线样本=2 就足够了,而且这是可能的!
\documentclass{article}
\usepackage{tkz-euclide,tkz-fct}
\usetkzobj{all}
\begin{document}
\begin{tikzpicture}
\tkzInit \tkzClip[space=.5]
\tkzDefPoint(0,0){O}
\tkzDrawX[label=$x_1$] \tkzDrawY[label=$x_2$]
\tkzFct[color = red,domain =0:10,samples=2]{4+0.75*x}
\tkzDefPointByFct(0) \tkzGetPoint{A1}
\tkzDefPointByFct(10) \tkzGetPoint{B1}
\tkzFct[color = blue,domain =0:10,samples=2]{11-1.5*x}
\tkzDefPointByFct(0) \tkzGetPoint{A2}
\tkzDefPointByFct(10) \tkzGetPoint{B2}
\tkzFct[color = green,domain =0:10,samples=2]{2*x-5}
\tkzDefPointByFct(2.5) \tkzGetPoint{A3}
\tkzDefPointByFct(10) \tkzGetPoint{B3}
\tkzInterLL(A1,B1)(A2,B2) \tkzGetPoint{I12}
\tkzInterLL(A1,B1)(A3,B3) \tkzGetPoint{I13}
\tkzInterLL(A3,B3)(A2,B2) \tkzGetPoint{I23}
\tkzFillPolygon[color=magenta!30](O,A3,I23,I12,A1)
\tkzDrawPolygon[color=magenta](O,A3,I23,I12,A1)
\tkzDrawPoints(A1,A2,A3,I12,I13,I23)
\end{tikzpicture}
\end{document}
阿兰·马特斯