C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++の重複しない長方形のランダムポイント


重なり合わない軸に位置合わせされた長方形の長方形のリストがあるとすると、長方形で覆われた空間内の整数をランダムかつ均一に選択する関数pickを作成する必要があります。したがって、いくつかの点に留意する必要があります-

  • 整数点は、整数座標を持つ点です。
  • 長方形の周囲の点は、長方形で覆われたスペースに含まれます。
  • i番目の長方形=rects[i]は[x1、y1、x2、y2]を示します。ここで、[x1、y1]は左下隅の整数座標であり、[x2、y2]は右上隅。
  • 各長方形の長さと幅は2000を超えません。
  • 1 <=rects.length <=100
  • 整数座標の配列としてポイントを返すを選択します[p_x、p_y]

入力が[1,1,5,5]のようで、pick()を3回呼び出すと、出力は[4,1]、[4,1]、[3,3]

になります。

これを解決するには、次の手順に従います-

  • 2つの配列領域を作成して長方形にします
  • イニシャライザで次の手順を実行します-
  • rect:=rects、sum:=0
  • 0からrectsのサイズまでの範囲のiの場合– 1
    • (x1、y1):=(rects [i、0]、rects [i、1])
    • (x2、y2):=(rects [i、2]、rects [i、3])
    • temp:=| x2 – x1 + 1 | * | y2 – y1 + 1 |
    • sum:=sum + temp、およびsumを領域に挿入
  • pickメソッドで、次のようにします-
  • randArea:=乱数mod sum + 1
  • 範囲0から領域のサイズまでのiの場合– 1
    • randArea <=area [i]の場合、ループから抜け出します
  • dist_x:=乱数mod | rect [i、0] – rect [i、2] + 1 |
  • dist_y:=乱数mod | rect [i、1] – rect [i、3] + 1 |
  • ペアを返す(dist_x + rect [i、0]、dist_y + rect [i、1])

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<int> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector <int> area;
   vector < vector <int> > rect;
   int sum;
   Solution(vector<vector<int> >& rects) {
      rect = rects;
      sum = 0;
      for(int i =0 ; i < rects.size(); i++){
         int x1 = rects[i][0];
         int y1 = rects[i][1];
         int x2 = rects[i][2];
         int y2 = rects[i][3];
         int temp = (abs(x2 - x1) + 1) * (abs(y2 - y1) + 1);
         sum += temp;
         area.push_back(sum);
      }
   }
   vector<int> pick() {
      int randArea = rand() % sum + 1;
      int i;
      for(i = 0; i < area.size(); i++){
         if(randArea <= area[i]) break;
      }
      int dist_x = rand() % (abs(rect[i][0] - rect[i][2] ) + 1);
      int dist_y = rand() % (abs(rect[i][1] - rect[i][3] ) + 1);
      return {dist_x + rect[i][0], dist_y + rect[i][1]};
   }
};
main(){
   vector<vector<int> > v = {{1, 1, 5, 5}};
   Solution ob(v);
   print_vector(ob.pick());
   print_vector(ob.pick());
   print_vector(ob.pick());
}

入力

["Solution", "pick", "pick", "pick"]
[[[[1, 1, 5, 5]]], [], [], []]

出力

[2, 3, ]
[4, 1, ]
[3, 5, ]

  1. C++のコンピュータグラフィックスにおけるポイントクリッピングアルゴリズム

    コンピュータグラフィックスは、コンピュータ画面に画像やグラフィックスを描画することを扱います。ここでは、画面を2次元座標系として扱います。この座標系は左上(0,0)から始まり、右下で終わります。 表示平面 コンピュータグラフィックスでグラフィックスを描画するために定義された領域です。または画面の表示領域。 クリッピングとは、表示面の外側にあるポイントまたはグラフィックを削除することです。 クリッピングを理解するために例を見てみましょう。 ここで、ポイントCとDは、青色でマークされた表示平面の外側にあるため、クリップされます。 コンピュータグラフィックスのポイントをクリップするた

  2. ランダムなアルファベットを生成するC++プログラム

    このチュートリアルでは、ランダムなアルファベットを生成するプログラムについて説明します。 このために、配列/文字列のサイズを固定し、rand()関数を使用してアルファベットのランダムな文字列を生成します。 例 #include <bits/stdc++.h> using namespace std; const int MAX = 26; //generating a string of random alphabets string gen_random(int n){    char alphabet[MAX] = {     &nbs