<p>这是最容易解决的使用参数表示的线,其中涉及一个字母矢量数学。但别担心,会很容易的。</p>
<p>假设您的行由以下公式很好地指定:</p>
<pre><code>y=ax+b
</code></pre>
<p>其中<code>a</code>是斜率,<code>b</code>是y截距。</p>
<p>然后你的线有一个向量<code><1,a></code>给出的方向,这意味着线在水平方向上每运行一个<code>1</code>单位就会上升<code>m</code>单位。</p>
<p>我们可以通过除以向量的大小来规范化这个向量。</p>
<p>向量的大小由</p>
<pre><code>m=sqrt(a**2+b**2)
</code></pre>
<p>规范化向量由<code>v=<1/m,a/m></code>给出。</p>
<p>现在,我们可以画出你的线如下:</p>
<pre><code>for t in range(50):
xp=0+t*v[0]
yp=b+t*v[1]
plot_point(xp,yp,'-')
</code></pre>
<p>你知道我在那里做了什么吗?我将循环的变量从<code>x</code>更改为<code>t</code>。这允许我们分别处理方程的<code>x</code>和<code>y</code>部分。</p>
<p>如果我的线是由它的端点指定的,那么我可以写出如下公式:</p>
<pre><code>for t in range(0,1,0.01):
xp=x1+t*(x2-x1)
yp=y1+t*(y2-y1)
plot_point(xp,yp,'-')
</code></pre>
<p>由于<code>x1</code>是直线x部分的起点,而<code>x2-x1</code>是直线x点之间的距离,当<code>t</code>从<code>0</code>走到<code>1</code>时,它通过了直线的所有x点。<code>y</code>的工作原理类似。</p>
<p>现在,我们可以抽象我们的画线函数,使其看起来像这样:</p>
<pre><code>def draw_line(a,b,len,skip,sym):
m=sqrt(a**2+b**2)
v=(1/m,a/m)
for t in range(0,len,skip):
xp=0+t*v[0]
yp=b+t*v[1]
plot_point(xp,yp,sym)
</code></pre>
<p>现在,我们通过键入以下内容来绘制您的线条:</p>
<pre><code>draw_line(a,b,50,1,'-')
</code></pre>
<p>并用</p>
<pre><code>draw_line(a,b,50,3,'.')
</code></pre>
<p>其中,<code>50</code>是直线的长度,<code>3</code>是间隙之间的距离。</p>
<p>如果我们改用直线的起点和终点,我们的函数将如下所示:</p>
<pre><code>def draw_line(x1,y1,x2,y2,skip,sym):
dist=sqrt((x1-x2)**2)+(y1-y2)**2)
skip=skip/dist
for t in range(0,1,skip):
xp=x1+t*(x2-x1)
yp=y1+t*(y2-y1)
plot_point(xp,yp,sym)
</code></pre>
<p>这会将要跳过的距离转换为直线总长度的一部分。您可能需要使用小于或等于1的跳过值来绘制直线,使用较大的跳过值来提取等距点。</p>
<p>您可能需要考虑使用<a href="https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm" rel="nofollow">Bresenham's Line Algorithm</a>来为您绘制图形—这是一种很好的方法,可以在有字符像素网格的情况下找到最佳的近似线的方法。</p>
<p>而且,如果您在屏幕上绘制字符,您可能会对<a href="https://en.wikipedia.org/wiki/ANSI_escape_code" rel="nofollow">ANSI escape codes</a>感兴趣,它可以用于移动光标、显示颜色和清除屏幕。</p>