ガドミストと最近傍







ジェドミスト (古代ローマ)-プログラミングから高くなる人。


プログラミングへの情熱には危険が伴います。不衛生な状態、忘れられた子供、公式のre責、逃げ出した牛乳、または女性のブーツが神殿に飛び込むことです。



私はこれを覚えており、複雑さを招くアルゴリズムを克服しています。



そして、完全なエクスタシーで一週間解決した役に立たないタスクについて話をしたい。 このタスクは3aichegのおかげで生まれました。そのコメントはiOS向けのゲームのアイデアを私に与えてくれました(目を見てください、Shawをもう一度?)。 ポイントは重力のある不規則なグリッドでマッチゲームをすることです。



ところで、ここで無料のアプリケーションについて話すと思うなら、世界的な名声を得てヨットを買うことができます。

記事の評価 記事ビュー ビデオ視聴 ダウンロード
+30 20,000 5,000 18
-2 2,500 2,000 14


したがって、私はハブルの利己的な著者(特にロシア語の音節を持っている人)を賞賛します。 これでポイントになりました! しかし、事は...



問題の声明
タスクは、指定された長方形にランダムに投げられたポイントのセットに基づいています。 各ポイントについて、最近傍が検出され(ボロノイ図が作成されます)、ポイントはランダムな虹色でペイントされます。 その後、ゲームが開始されます-押すと、色付きのチェーンが取り除かれ、重力の作用により、残りのセルが失敗/形成されたボイドに流れ込みます。 メッシュ構成は変更されません。



タスク1-初期データの配置



したがって、長方形(携帯電話の画面)を考えてみましょう。長方形の頂点には0、1、2、3の番号が付けられています。この長方形の内部では、あらゆる種類のugさが発生します。









1頂点0、1、2、3の長方形



この長方形にN個のポイントをランダムに投げ、4〜4 + Nの番号を付けます。 なぜ4からですか? すべての場所(0〜3)がすでにカバによって撮影されているためです。









2ランダムポイントのセット



ランダムな散布は時々危険です-いくつかのポイントが互いに近すぎるため、プレイヤーはスクリーン上でそれらを区別して好きなポイントをクリックすることはできません。 プレーヤーの人差し指の指紋の物理的なサイズがわかっているので、ポイント間の距離は少なくとも26ピクセルにする必要があるという条件を追加します。 この条件を満たす方法は? 2つの方法:1)希少な空間の方向にポイントを移動し、2)条件radiusMin> 26が満たされるまで新しいポイントをスローします。 2番目の方法は簡単ですが、より危険です-Nの値が大きすぎるとループする可能性があります。しかし、Nですべてを順番に持っているので、空きスペースの予約は5倍であるため、先に進みます。つまり、すべてのポイントの最近傍を見つけます。 順番に進みます。つまり、最初に、ご存知のように、番号を持つポイントの近傍を探します。



これを行うには、ポイントからすべての半径ベクトルを時計回りに配置します。









3半径ベクトルの配置[9-7-5-10-11-8-6]



Swiftでは、次のようになります。



let x0 = pts[4].x let y0 = pts[4].y var vtx = [Point]() for i in 5..<pts.count { let x = pts[i].x let y = pts[i].y let u = x-x0 let v = y-y0 let a = atan2(v, -u) vtx.append(Point(x:(x+x0)/2, y:(y+y0)/2, angle:a )) } } vtx = vtx.sorted(by:{ $0.angle > $1.angle })
      
      





これで頂点がvtx配列[9-7-5-10-11-8-6]に保存され、それらを通過して、番号4で目的のポイントを囲むポリゴンを構築します。したがって、最初は頂点を持つ長方形がポイント[0- 1-2-3]、図のように。 1。



順序付きリストから最初の頂点を取得します-これはポイント番号9です。セグメント[4-9]に垂線を半分に分割して構築します。









4直線、ポイント4および9から等距離



結果の線は、ポリゴン[0-1-2-3]と交差するか、交差しません。 図4を見ると、交差するものを見つけるのは簡単です。 セグメントとラインの交差の方程式を与えないことにしました。 したがって、[0-1-2-3]の代わりに、ポリゴン[0-1-9-3]を取得します(図5を参照)。









5ポリゴン[0-1-9-3]



リスト[9-7-5-10-11-8-6]から次のポイントに進みます。 これはポイント番号7です。同じことを行います。ポイント4と7から等距離に垂直に構築し、ポリゴンと交差するかどうかを確認します[0-1-9-3]。









6ポリゴン[0-1-9-3]は直線[4-7]と交差しません



交差しないので、何もする必要はありません。そのため、次の4と5のポイントのペアに進みます。





7ポリゴン[0-1-9-5-3]



などなど。 フォーチュンの方法(彼はHabréでとても愛されており、すでに彼に関する3つの記事をめくっています)は、問題に100,000ポイントはないので、ここを使って隣人を見つけるのをスピードアップする価値はありません。 そして、1000ポイントはありません。 いくら? 50〜70ポイント-この数値は、電話スクリーンの物理的なサイズによるものです。 これは、番号4の最初の頂点の周りのポリゴンの最終画像です





8ポリゴン[0-6-9-10-8-3]



ポリゴンを描画するには、ネイティブUIKitを使用してテクスチャを塗りつぶします(そこから線を描画します)。 func draw内のサンプルコード(_ rect:CGRect):



  let colors:[UIColor] = [UIColor.black, UIColor(patternImage: UIImage(named: "b_19.png")!), UIColor(patternImage: UIImage(named: "b_20.png")!), UIColor(patternImage: UIImage(named: "b_21.png")!), UIColor(patternImage: UIImage(named: "b_22.png")!), UIColor(patternImage: UIImage(named: "b_23.png")!), ] func renderSimple(_ t:Convex) { let path = UIBezierPath() let strokeColor = UIColor.black strokeColor.setStroke() path.lineWidth = 1.0 let clr = t.color var i = 0 for p in t.vtx { if i == 0 { i = 1 path.move(to: p) } else { path.addLine(to: p) } } if clr>0 { let fillColor = colors[clr] fillColor.setFill() path.fill() } path.stroke() }
      
      





うわー 作曲にうんざり。 Zabivakaゲームで指を叩き、いくつかのレベルをプレイする











どうぞ 結果はとてもランダムでしたが、素晴らしい写真でした。









Kansas Level 9-青いチェーンをクリックしてクリアしたい



あなたがそのような欲望を持っていた場合(青いチェーンをクリックしてクリア)-ゲームは最悪ではありません。 ご覧のように、色の付いたセルから空の空のセルへの流れに関する法律を考案する必要がありました。 なぜ彼らは流れるか、シフトする必要があるのですか? ゲームには重力場が含まれているためです。 数値実験の後、トランプ-ガリレオの法則に出会いました-粒子の重心が元の粒子の重心より下にある場合、粒子は空の隣接するものに移動します。 ゼリーは流れません。 2番目の条件-2つの粒子の共通境界の最低点は、元の粒子の重心より下にある必要があります-これは、ゼリーがガラスの上端を流れないことを意味します。 ゲームプレイでは、この法律はすぐにテストされ承認されました。



この法則のためにプログラムする必要がある唯一のものは、任意の多角形の重心を計算するためのアルゴリズムでした。 最初は、頂点の座標の算術平均を見つけるのは簡単だと思いました(三角形のように)! Loshara、あなたは言う、そしてあなたは正しいでしょう。 多角形を三角形に分割し、三角形の重心をサイズ(面積)に比例して合計しました。 すべてが美しくなりました。 ゲームについてのあなたからのレビューがある場合-書いて、私は今一人で住んでいます-私はどんなコメントでも喜んでいるでしょう。



メニュー



どのゲームでも目標が必要です-通常、すべてのレベルを通過する必要があります。 レベルはあらゆる方法で描写します-たとえば、これらはあなたが征服しなければならない地図上の都市です。 私は、三角測量が実際のマップを(模式的に、アニメーションで)簡単に描画する優れた方法であると判断しました。 実際、地理座標を使用して世界都市のリストをアップロードし、上記のアルゴリズムを使用してこのデータにグリッドを作成しました。 そしてそれが起こったのです。









認識可能な国の10の地図



たとえば、イタリアの地理座標のリストは次のようになります。



  City(name:"Rome",x:41.9000,y:12.4833,s:4), City(name:"Ancona",x:43.6333,y:13.5000,s:4), City(name:"Ascoli",x:42.8500,y:13.5667,s:4), City(name:"Bari",x:41.1333,y:16.8500,s:4), City(name:"Bologna",x:44.4833,y:11.3333,s:4), City(name:"Brescia",x:45.5500,y:10.2500,s:4), City(name:"Catania",x:37.5000,y:15.1000,s:4), City(name:"Cesena",x:44.1433,y:12.2497,s:4), City(name:"Cagliari",x:39.2167,y:9.1167,s:4), City(name:"Florence",x:43.7667,y:11.2500,s:4),
      
      





私の意見では、ゲームカードを構築する素晴らしい方法です。 もちろん、海または近隣諸国をエミュレートする偽のポイントを追加する必要があります。 各マップに16ポイントを追加しました。いくつかの偽のポイントをペンで編集する必要がありました。



プレイヤーを脅すために、ルールを導入しました-ゲームごとに15回以下のクリック。 このような条件でゲームをテストすることは困難でした。この数をco病に16に増やしました。さらに、最後の動きでエラーを見つけましたが、修正しませんでした。このエラーは、一見不可能な状況を克服するのに役立ちます。 そしてゲームにムードを与えます。 素晴らしい見事なレベルの合格のために、彼はボーナスを追加しました-巨乳少女と海賊音楽のアニメーション。 要するに、私は個人的に満足しています。 さて、私はあなたがこの無邪気な時代にSwiftおもちゃについての物語を読むのが退屈ではなかったことを願っています。



兄弟に会いましょう...



All Articles