2015-01-16 7 views
0

я редактировал код, который я нашел в Интернете, что помогает мне рисовать точки как-то распределены на графике на основе минимального расстояния между нимиMatlab код для распределения точек на участке

Это код, который я до сих пор

x(1)=rand(1)*1000;   %Random coordinates of the first point 
y(1)=rand(1)*1000; 

minAllowableDistance = 30;  %IF THIS IS TOO BIG, THE LOOP DOES NOT END 
numberOfPoints = 300;     % Number of points equivalent to the number of sites 


keeperX = x(1);    % Initialize first point 
keeperY = y(1); 

counter = 2; 

for k = 2 : numberOfPoints  %Dropping another point, and checking if it can be positioned 

    done=0; 
    trial_counter=1; 

    while (done~=1) 
    x(k)=rand(1)*1000; 
    y(k)=rand(1)*1000; 

    thisX = x(k);   % Get a trial point. 
    thisY = y(k); 

    % See how far is is away from existing keeper points. 

    distances = sqrt((thisX-keeperX).^2 + (thisY - keeperY).^2); 
    minDistance = min(distances); 

    if minDistance >= minAllowableDistance 
     keeperX(k) = thisX; 
     keeperY(k) = thisY; 
     done=1; 
     trial_counter=trial_counter+1; 
     counter = counter + 1; 
     end 

    if (trial_counter>2) 
     done=1; 
    end 
    end 

    end 
end 

Так что этот код работает нормально, но иногда matlab замерзает, если точки выше 600. Проблема полна, и больше очков не добавлено, поэтому Matlab выполняет работу снова и снова. Поэтому мне нужно найти способ, когда trial_counter больше 2, чтобы найти место, которое пусто и поселиться там.

Метод trial_counter используется для сброса точки, если она не подходит в третий раз. Спасибо

+1

** warning **: если точка 'k' отбрасывается, то' keeper (k) 'не будет присвоено значение до тех пор, пока не будет принята следующая точка (допустим, k + 2) (при которой временному хранителю (k) и хранителю (k + 1) присваивается значение '0'). Это нормально, если вы хотите сохранить эти значения «0», но если все последние «k-ые» точки отклоняются, то «хранителю» никогда не будет назначено значение для этих последних точек и будет короче, чем 'numberOfPoints' , Помимо соображений скорости, поэтому важно [preallocating] (http://mathworks.com/help/matlab/matlab_prog/techniques-for-improving-performance.html#f8-793781). – Hoki

ответ

2

Поскольку trial_counter=trial_counter+1; вызывается только внутри if minDistance >= minAllowableDistance, вы легко войти в бесконечный цикл, если minDistance < minAllowableDistance (например, если ваши точки были довольно плотно упакованы).

Как вы это сделаете, это зависит от ваших ограничений, но если вы ищете целые точки в заданном диапазоне, одна из возможностей - сохранить точки в виде двоичного изображения и использовать bwdist для разработки преобразования расстояния , затем выберите приемлемую точку. Таким образом, каждая итерация будет (где BW ваша хранится «образ»/2D бинарная матрица, где 1 представляет выбранные точки):

D = bwdist(BW); 
maybe_points = find(D>minAllowableDistance); % list of possible locations 
n = randi(length(maybe_points)); % pick one location 
BW(maybe_points(n))=1; % add it to your matrix 

(а затем добавить некоторые проверки, что если вы не можете найти любые допустимые точки на loop quits)

+0

Ницца. Еще одна полезная проверка (даже до назначения каких-либо точек на самом деле) - сколько очков вы можете поместить в свой домен. Максимальное количество точек, которые вы можете поместить с минимальным расстоянием 'Dmin', будет:' nPointMax = (fix (width/Dmin) +1) * (fix (height/Dmin) +1) '. Это было бы точками, красиво наложенными на сетку оптимальными манерами. Поскольку они не будут такими, убедитесь, что с самого начала ваши номера numberOfPoints не превышают это значение. – Hoki

+0

okey спасибо ребята за ваши ответы, теперь я могу работать над решением по-другому, используя bwdist, и используя формулу, которую @Hoki дал мне – Necro1992

Смежные вопросы