<p>你需要做的是在两点之间<a href="//en.wikipedia.org/wiki/Linear_interpolation">interpolate</a>。</p>
<p>例如,假设您的两个端点有坐标<code>(x1, y1)</code>和<code>(x2, y2)</code>,并且您希望将它们之间的距离分割为<code>n</code>相等的部分,然后您可以计算它们之间的<code>n-1</code>新点,如下所示:</p>
<pre><code>points = []
for i in range(1, n):
a = float(i) / n # rescale 0 < i < n --> 0 < a < 1
x = (1 - a) * x1 + a * x2 # interpolate x coordinate
y = (1 - a) * y1 + a * y2 # interpolate y coordinate
points.append( (x,y) )
</code></pre>
<p>这里,<code>a</code>是原始点之间直线上插值点的位置,缩放后的值<code>a = 0</code>和<code>a = 1</code>对应于原始点本身。</p>
<hr/>
<p>或者,如果希望插值点相距固定距离<code>d</code>,则可以使用<a href="//en.wikipedia.org/wiki/Pythagorean_theorem">Pythagorean theorem</a>计算原始点之间的距离<code>d_full</code>,除以<code>d</code>得到<code>s = d / d_full</code>,然后按<code>s</code>从0到1的步骤递增<code>a</code>:</p>
<pre><code>d_full = ( (x2 - x1)**2 + (y2 - y1)**2 )**0.5
s = d / d_full
points = []
a = s # start at s so we don't duplicate (x1, y1)
while a < 1:
x = (1 - a) * x1 + a * x2
y = (1 - a) * y1 + a * y2
points.append( (x,y) )
a += s
</code></pre>
<p>请注意,这可能会导致在<code>(x2, y2)</code>处放置一个新点,或将其放置得非常近,这取决于<code>d</code>如何精确地划分点之间的距离。如果要避免这种情况,可以将条件<code>a < 1</code>替换为<code>a < 1 - s/2</code>。</p>
<p><strong>编辑:</strong>上面的代码以<code>d</code><em>的间隔放置点,开始于<code>(x1, x2)</code>。这就是说,如果<code>d = 2</code>原始点位于<code>(0,0)</code>和<code>(0,5)</code>,那么将在<code>(0,2)</code>和<code>(0,4)</code>获得新点。
如果您希望新点在原始点之间居中(即在示例中位于<code>(0,1)</code>和<code>(0,3)</code>),则可以通过将起点<code>a = s</code>替换为<code>a = (1 % s) / 2</code>来修改代码。</p>
<p><code>%</code>是<a href="//en.wikipedia.org/wiki/Modulo_operator">modulo</a>或余数运算符,因此<code>1 % s</code>在将0到1的距离分割成长度为<code>s</code>的片段后,给出剩余距离“剩余”。</p>