Случайные точки в параллелограмме

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
48
задан Tipx 5 September 2017 в 03:07
поделиться

7 ответов

A. Если можно ограничить вход параллелограммом, это действительно просто:

  1. Берут два случайных числа между 0 и 1. Мы будем звонить тогда u и v.
  2. , Если Ваш параллелограмм определяется точками ABCD, таким образом, что AB, до н.э, CD и DA являются сторонами, затем берут Вашу точку, как являющуюся:

     p = A + (u * AB) + (v * AD)
    

, Где AB вектор от до B и AD вектор от до D.

B. Теперь, если Вы не можете, можно все еще использовать барицентрические координаты. Барицентрические координаты соответствуют, для четверки, к 4 координатам (a,b,c,d) таким образом что a+b+c+d=1. Затем любая точка P в четверке может быть описана 4-uple таким образом что:

P = a A + b B + c C + d D

В Вашем случае, можно потянуть 4 случайных числа и нормализовать их так, чтобы они составили в целом 1. Это даст Вам точку. Обратите внимание, что распределение точек НЕ будет универсально в этом случае.

C. Вы можете также, как предложено в другом месте, разлагать четверку на два треугольника и использовать метод полупараллелограмма (т.е. как параллелограмм, но Вы добавляете условие u+v=1), или барицентрические координаты для треугольников. Однако, если Вы хотите равномерное распределение, вероятность наличия точки в одном из треугольника должна быть равна области треугольника, разделенного на область четверки.

30
ответ дан Niyaz 26 November 2019 в 18:41
поделиться

Принятие Вас хочет равномерное распределение: Сформируйте два треугольника из своего полигона. Выберите который треугольник генерировать точку в согласно их отношению области.

Вызов углы треугольника A, B, C, AB векторов стороны, до н.э, AC и генерируют два случайных числа в [0,1] названный u и против p, которому Позволяют, = u * AB + v * AC.

, Если A+p в треугольнике, возвратите A+p

, Если A+p вне треугольника, возвратитесь + AB + AC - p

(Это - в основном формула PierreBdR за исключением предварительной обработки и последнего шага, который откладывает точку в треугольник, таким образом, это может обработать другие формы, чем параллелограммы).

19
ответ дан Niyaz 26 November 2019 в 18:41
поделиться

Ваш полигон является двумя треугольниками, итак, почему не случайным образом выбирают одного из тех, затем найдите случайную точку в треугольнике.

, Вероятно, не лучшее решение, но это работало бы.

4
ответ дан jonnii 26 November 2019 в 18:41
поделиться

Несколько меньше" naГЇve" подход должно было бы использовать алгоритм заливки полигона , и затем выбрать точки из строк заливки случайным образом.

Пример кода C

//  public-domain code by Darel Rex Finley, 2007

int  nodes, nodeX[MAX_POLY_CORNERS], pixelX, pixelY, i, j, swap ;

//  Loop through the rows of the image.
for (pixelY=IMAGE_TOP; pixelY<IMAGE_BOT; pixelY++) {

  //  Build a list of nodes.
  nodes=0; j=polyCorners-1;
  for (i=0; i<polyCorners; i++) {
    if (polyY[i]<(double) pixelY && polyY[j]>=(double) pixelY
    ||  polyY[j]<(double) pixelY && polyY[i]>=(double) pixelY) {
      nodeX[nodes++]=(int) (polyX[i]+(pixelY-polyY[i])/(polyY[j]-polyY[i])
      *(polyX[j]-polyX[i])); }
    j=i; }

  //  Sort the nodes, via a simple “Bubble” sort.
  i=0;
  while (i<nodes-1) {
    if (nodeX[i]>nodeX[i+1]) {
      swap=nodeX[i]; nodeX[i]=nodeX[i+1]; nodeX[i+1]=swap; if (i) i--; }
    else {
      i++; }}

  //  Fill the pixels between node pairs.
  //  Code modified by SoloBold 27 Oct 2008
  //  The flagPixel method below will flag a pixel as a possible choice.
  for (i=0; i<nodes; i+=2) {
    if   (nodeX[i  ]>=IMAGE_RIGHT) break;
    if   (nodeX[i+1]> IMAGE_LEFT ) {
      if (nodeX[i  ]< IMAGE_LEFT ) nodeX[i  ]=IMAGE_LEFT ;
      if (nodeX[i+1]> IMAGE_RIGHT) nodeX[i+1]=IMAGE_RIGHT;
      for (j=nodeX[i]; j<nodeX[i+1]; j++) flagPixel(j,pixelY); }}}

   // TODO pick a flagged pixel randomly and fill it, then remove it from the list.
   // Repeat until no flagged pixels remain.
2
ответ дан wprl 26 November 2019 в 18:41
поделиться

"Общим" Вы имеете в виду весь непараллелограмм полигоны с 4 сторонами в целом или все возможные полигоны?

Как насчет того, чтобы провести случайную линию, соединяющую эти 4 стороны, например, Если у Вас есть это:

.BBBB.
A    C
A    C
.DDDD.

Тогда генерируют случайную точку на квадрате единицы, затем отмечают точку на строке B и D на уровне процента расстояния на оси X. Сделайте то же на строке A и C, использующий значение от оси Y.

Тогда соединяют точку на строке к строке C и строке B к строке D, точка пересечения тогда используется в качестве случайной точки.

Это не универсально, потому что погрешности округления помогут определенным моментам, но это должно быть близко, если Вы работаете со значениями плавающих точек.

Реализация должна быть довольно легкой также, так как Вы уже работаете с полигонами. У Вас должен уже быть код, который делает те простые задачи.

Вот быстрый псевдокод:

void GetRandomPoint(Polygon p, ref float x, ref float y) {

    float xrand = random();
    float yrand = random();

    float h0 = p.Vertices[0] + xrand * p.Vertices[1];
    float h1 = p.Vertices[2] + yrand * p.Vertices[3];

    float v0 = p.Vertices[0] + xrand * p.Vertices[2];
    float v1 = p.Vertices[1] + yrand * p.Vertices[3];

    GetLineIntersection(h0, h1, v0, v1, x, y);

}
2
ответ дан chakrit 26 November 2019 в 18:41
поделиться

Точки должны быть равномерно распределены, или какое-либо распределение хорошо?

полигон может быть вогнутым, или он, как гарантируют, будет выпукл?

, Если ответ и на вышеупомянутое не, то выберите любые две из вершин и выберите случайную точку на линейном сегменте между ними. Это ограничено строкой segements соединение вершин (т.е., ОЧЕНЬ неоднородное); можно сделать немного лучше путем выбора третьей вершины и затем выбора точки между этим и первой точки - все еще неоднородный, но по крайней мере любая точка в полигоне возможна

, Выбор случайной точки на строке между двумя точками легок, просто + p (B-A), где A и B являются точками, и p является случайным числом между 0,0 и 1.0

1
ответ дан Chris Dodd 26 November 2019 в 18:41
поделиться

Какое распределение Вы хотите, чтобы точки имели? Если Вы не будете заботиться, вышеупомянутые методы будут хорошо работать. Если Вы захотите равномерное распределение, следующая процедура будет работать: Разделите полигон на два треугольника, a и b. Позвольте (a) и (b) быть их областями. Выберите точку p от равномерного распределения на интервале между 0 и (a) +A (b). Если p < (a), выберите треугольник a. Иначе выберите треугольник b. Выберите вершину v выбранного треугольника и позвольте c и d быть векторами, соответствующими сторонам треугольника. Демонстрационные два X и Y чисел от экспоненциального распределения со средним числом единицы. Тогда точка (xc+yd) / (x+y) является образцом от равномерного распределения на полигоне.

1
ответ дан Alex Coventry 26 November 2019 в 18:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: