Выберите точки в круглой области в Mathematica - PullRequest
7 голосов
/ 26 августа 2011

Пожалуйста, примите во внимание:

dalist = {{9, 6}, {5, 6}, {6, 0}, {0, 5}, {10, 8}, {1, 2}, {10, 4}, {1, 1}, {7, 7}, 
          {6, 8}, {5, 3}, {6, 10}, {7, 4}, {1, 8}, {10, 0}, {10, 7}, {6, 3}, {4, 0}, 
           {9, 2}, {4, 7}, {1, 6}, {10, 8}, {7, 8}, {0, 10}, {3, 4}, {0, 0}, {8, 5}, 
           {4, 5}, {6,0}, {2, 9}, {2, 4}, {8, 4}, {7, 4}, {3, 6}, {7, 10}, {1, 10}, 
           {1, 4}, {8, 0}, {8, 9}, {5, 4}, {2, 5}, {2, 9}, {3, 1}, {0, 6}, {10, 3}, 
           {9, 6}, {8, 7}, {7, 6}, {7, 3}, {8, 9}};

frameCenter = {5, 5};

criticalRadius = 2;

Graphics[{
          White, EdgeForm[Thick], Rectangle[{0, 0}, {10, 10}], Black,
          Point /@ dalist,
          Circle[frameCenter, 2]}];

enter image description here

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

Ответы [ 3 ]

7 голосов
/ 26 августа 2011

Это будет довольно эффективно:

In[82]:= 
Pick[dalist,UnitStep[criticalRadius^2-Total[(Transpose[dalist]-frameCenter)^2]],0]

Out[82]= 
{{6,0},{10,8},{10,4},{1,1},{6,10},{10,0},{10,7},{4,0},{10,8},
{0,10},{0,0},{6,0},{7,10},{1,10},{8,0},{0,6},{10,3}}

В качестве альтернативы

In[86]:= Select[dalist, EuclideanDistance[#, frameCenter] > criticalRadius &]

Out[86]= {{6, 0}, {10, 8}, {10, 4}, {1, 1}, {6, 10}, {10, 0}, {10, 7}, {4, 0}, 
 {10, 8}, {0, 10}, {0, 0}, {6, 0}, {7, 10}, {1, 10}, {8, 0}, {0, 6}, {10, 3}}
7 голосов
/ 26 августа 2011

Ближайший может быть полезен для таких целей, как поиск каждого члена набора в некотором радиусе заданной точки.Один использует менее хорошо документированную форму третьего аргумента, которая позволяет пару, обозначающую {максимальное число, максимальное расстояние}.В этом случае мы разрешаем столько, сколько поместится в максимальном радиусе, поэтому максимальное число просто устанавливается равным бесконечности.DeleteCases с альтернативами без шаблонов, если входной размер равен n, а набор альтернатив имеет m элементов, то это O (n + m), а не O (n * m).Начиная с версии 8 Mathematica.

Приведенные ниже примеры подтверждают это утверждение.Мы начинаем с 10 ^ 5 элементов и удаляем около 18000 из них.Занимает .17 секунд.Затем мы используем 10-кратное количество элементов и удаляем более чем 10-кратное количество (так что n и m увеличиваются в 10 и более раз).Общее время составляет 1,6 секунды или в 10 раз больше.

In[90]:= dalist5 = RandomInteger[{-10, 10}, {10^5, 2}];
criticalRadius5 = 5;
Timing[rest5 = 
   DeleteCases[dalist5, 
    Alternatives @@ (closest5 = 
       Nearest[dalist5, {0, 0}, {Infinity, criticalRadius5}])];]
Length[closest5]

Out[92]= {0.17, Null}

Out[93]= 18443

In[94]:= dalist6 = RandomInteger[{-10, 10}, {10^6, 2}];
criticalRadius6 = 6;
Timing[rest6 = 
   DeleteCases[dalist6, 
    Alternatives @@ (closest6 = 
       Nearest[dalist6, {0, 0}, {Infinity, criticalRadius6}])];]
Length[closest6]

Out[96]= {1.61, Null}

Out[97]= 256465

- конец редактирования ---

Даниэль Лихтлау

1 голос
/ 26 августа 2011

Легко - Просто используйте центр круга. Из этого (используя теорему Пифагора) рассчитайте расстояние от этого центра. Сравните это с радиусом. Меньше или равен радиусу, то есть внутри круга. В противном случае снаружи.

...