0

線分上のすべての整数点を見つけるための短いスマートな方法を探しています。2 点も整数で、線は 0、45、90、135 度などの角度にすることができます。

これが私の長いコードです(これまでのところ90度のケース):

def getPoints(p1,p2)
if p1[0] == p2[0]:
    if p1[1] < p2[1]:
        return [(p1[0],x) for x in range(p1[1],p2[1])]
    else:
        return [(p1[0],x) for x in range(p1[1],p2[1],-1)]
if p2[1] == p2[1]:
    if p1[0] < p2[0]:
        return [(x,p1[1]) for x in range(p1[0],p2[0])]
    else:
        return [(x,p1[1]) for x in range(p1[0],p2[0],-1)]

編集:私はそれを十分に明確に述べていませんが、勾配は常に整数 -1、0、または 1 になります。チェックする必要がある 8 つのケースがあります。

4

5 に答える 5

1

傾きを最小項 (p/q) に減らし、線分の一方の端点からもう一方の端点まで、垂直方向に p ずつ、水平方向に q ずつ進みます。reduce-to-lowest-terms コードが 5/0 を 1/0 に減らす場合、同じコードが垂直線分に対して機能します。

于 2013-07-17T18:07:35.977 に答える
0

私は機能するコードを書くことができましたが、繰り返されるコードの量が私をうんざりさせています。それが私が皆さんに頼った理由です

これは多くの改善をもたらす可能性がありますが、おそらく軌道に乗ることができます. (申し訳ありませんが、今は改善する時間がありません!)

def points(p1,p2):
  slope = (p2[1]-p1[1])/float(p2[0]-p1[0])
  [(x,x*slope) for x in range (p1[0], p2[0]) if int(x*slope) == x*slope)]
于 2013-07-17T18:26:37.347 に答える
-1
def getpoints(p1, p2):
  # Sort both points first.
  (x1, y1), (x2, y2) = sorted([p1, p2])
  a = b = 0.0

  # Not interesting case.
  if x1 == x2:
      yield p1

  # First point is in (0, y).
  if x1 == 0.0:
      b = y1
      a = (y2 - y1) / x2
  elif x2 == 0.0:
      # Second point is in (0, y).
      b = y2
      a = (y1 - y2) / x1
  else:
      # Both points are valid.
      b = (y2 - (y1 * x2) / x1) / (1 - (x2 / x1))
      a = (y1 - b) / x1

      for x in xrange(int(x1), int(x2) + 1):
          y = a * float(x) + b
          # Delta could be increased for lower precision.
          if abs(y - round(y)) == 0:
              yield (x, y)
于 2013-07-17T18:26:01.710 に答える