6

ISO/IEC 18004:2000 付属書 E の表で定義されているように、QR コードの配置パターンの位置を計算する方法を知る必要があります。

計算方法がわかりません。たとえば、バージョン 16 の場合、位置は {6,26,50,74} を使用して計算され、ポイント間の距離は {20,24,24} です。点間の距離 {22,24,22} がより均等に分布しているのに、なぜ {6,28,52,74} ではないのでしょうか?

これを手続き的に生成する方法を知りたいです。

4

6 に答える 6

4

仕様はアライメントの表を提供しますが、これは合理的な質問です (そして、私が自分自身で見つけたものです :-)) - 手続き的に位置を生成する可能性にはメリットがあります (タイプミスが発生しやすいコードが少なく、コードのフットプリントが小さく、パターン/位置のプロパティ)。

はい、手順が存在することを報告できてうれしいです(そして、それはかなり単純です)。仕様自体は、そのほとんどを述べています:

[アライメント パターン] は、タイミング パターンとシンボルの反対側の間で可能な限り均等な間隔で配置されます。タイミング パターンとシンボル内部の最初のアライメント パターンとの間の不均一な間隔は調整されます。

つまり、最初の座標と 2 番目の座標の間の間隔だけが残りの間隔と異なる場合があります。残りは等しくなければなりません。もう 1 つの重要な点は、もちろん、AP がタイミング パターンに一致するには、間隔が均等でなければならないということです。残りのトリッキーな部分は、丸めを正しく行うことです。

とにかく - 配置位置テーブルを出力するコードは次のとおりです。

def size_for_version(version):
    return 17 + 4 * version

def alignment_coord_list(version):
    if version == 1:
        return []
    divs = 2 + version // 7
    size = size_for_version(version)
    total_dist = size - 7 - 6
    divisor = 2 * (divs - 1)
    # Step must be even, for alignment patterns to agree with timing patterns
    step = (total_dist + divisor // 2 + 1) // divisor * 2 # Get the rounding right
    coords = [6]
    for i in range(divs - 2, -1, -1): # divs-2 down to 0, inclusive
        coords.append(size - 7 - i * step)
    return coords

for version in range(1, 40 + 1): # 1 to 40 inclusive
    print("V%d: %s" % (version, alignment_coord_list(version)))
于 2014-01-26T21:43:23.360 に答える
1

私の英語でごめんなさい。これがあなたのお役に立てば幸いです。後で返信する必要はありません。最初に、標準は重要なことを忘れています。それは、左上が (0,0) で定義されていることです。{ 6, 26, 50, 74 } は、位置合わせポイントの行座標と列座標を意味します。おそらくスペースを節約するために、なぜこのようにするのかわかりません。ただし、たとえば次のようにすべての値を組み合わせます。

{ 6, 26, 50, 74 }

そして、次のようになります。

{ 6 , 6  } ---> ( the x coordinate is 6, and the y is 6, from top/left )
{ 6 , 26 }
{ 6 , 50 }
{ 6 , 74 }
{ 26, 26 }
{ 26, 50 }
{ 26, 74 }
{ 50, 50 }
{ 50, 74 }
{ 74, 74 }

これらの点は、配置パターンの中心の実際の座標です。Ps: 位置に位置検出パターンがある場合、位置 (6, 6) のような出力の配置は無視されます。

私も以前この質問をしたことがありますが、今は解決しましたので、あなたも解決できることを願っています。

頑張って〜

于 2013-12-09T15:46:58.887 に答える
0

@ericsoeの答えから始めて、v36とv39では正しくないことに注意して(@Anaの発言のおかげで)、正しいシーケンスを返す関数を開発しました。JavaScript をご容赦ください (ただし、他の言語に翻訳するのはかなり簡単です)。

function getAlignmentCoordinates(version) {
  if (version === 1) {
    return [];
  }
  const intervals = Math.floor(version / 7) + 1;
  const distance = 4 * version + 4; // between first and last alignment pattern
  const step = Math.ceil(distance / intervals / 2) * 2; // To get the next even number
  return [6].concat(Array.from(
    { length: intervals },
    (_, index) => distance + 6 - (intervals - 1 - index) * step)
  );
}
于 2021-08-31T09:10:19.020 に答える
0

これが役に立つ質問かどうかはわかりません。{22,24,22} であっても、それほど問題ではありません。なぜ質問するのですか?私の推測では、間隔は 4 モジュールの倍数である必要があります。

于 2012-11-09T00:31:49.397 に答える