2016-12-19 2 views
3

При определении точек в пределах полигонов с использованием функцииMATLAB, результаты поиска верны для полигонов, нарисованных на линейных осях, но только приблизительно для полигонов, нарисованных на осях логарифмической шкалы. Хотя мои подозрения опираются на ошибку MATLAB, возможно, я что-то упустил.impoly только приблизительно правильно на осях логарифмической шкалы

Следующий код воспроизводит проблему, с которой я столкнулся с другими данными. Результаты показаны на следующем изображении (нижний набор панелей - увеличенные виды верхних панелей). Можно понять, что в полигоне есть немаркированные точки и помеченные точки вне полигона, ни один из которых не должен происходить, в случае многоугольника, нарисованного на осях логарифмической шкалы (справа). Напротив, полигонный тест является точным для полигонов, нарисованных на линейных осях (слева).

n=2E4; 
x(:,1)=rand(n,1); y(:,1)=rand(n,1); 
x(:,2)=lognrnd(0.5,0.25,n,1); y(:,2)=lognrnd(0.5,0.25,n,1); 
for m=1:2 
    subplot(1,2,m); 
    scatter(x(:,m),y(:,m),'.'); hold on; 
    if(m==2) 
     set(gca,'xscale','log'); set(gca,'yscale','log'); 
    end 
    p=impoly(gca); 
    pc=getPosition(p); 
    in=inpolygon(x(:,m),y(:,m),pc(:,1),pc(:,2)); 
    scatter(x(in,m),y(in,m),20); 
end 

enter image description here

ответ

6

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

Посмотрите на реальном полигоне в лог пространстве:

close all 
clear 

n=2e4; 
x(:,1)=rand(n,1); y(:,1)=rand(n,1); 
x(:,2)=lognrnd(0.5,0.25,n,1); y(:,2)=lognrnd(0.5,0.25,n,1); 
for m=1:2 
    subplot(1,2,m); 
    scatter(x(:,m),y(:,m),'.'); hold on; 
    if(m==2) 
     set(gca,'xscale','log'); set(gca,'yscale','log'); 
    end 
    p=impoly(gca); 
    pc=getPosition(p); 
    % plot polygon 
    hold on 
    for ii=1:size(pc,1)-1 
     plot(linspace(pc(ii,1),pc(ii+1,1),100),linspace(pc(ii,2),pc(ii+1,2),100),'g') 
    end 
    plot(linspace(pc(end,1),pc(1,1),100),linspace(pc(end,2),pc(1,2),100),'g') 
    in=inpolygon(x(:,m),y(:,m),pc(:,1),pc(:,2)); 
    scatter(x(in,m),y(in,m),20); 
end 

Посмотрите на это увеличено в результате (нажмите, чтобы увеличить):

enter image description here

Это происходит потому, что многоугольник определяется в евклидовой пространство, и оно определяется как точки, связанные линиями. Если вы хотите работать в лог-пространстве, все может усложниться. Один из способов численного приближения - это обратное тому, что я сделал для построения графика. Создайте достаточно плотную дискретную прямую линию на лог-пространстве, преобразуйте ее в линейное пространство и определите высокий вершинный многоугольник с результирующими точками. Затем используйте inpolygon.

+0

О, это хорошее наблюдение! Я полностью ее не замечал. Когда я запускаю ваш код (на R2014b), полигоны не накладываются. Многоугольник, нарисованный в линейном пространстве, копируется в лог-пространство, но поскольку оси различны, он заканчивается в левом нижнем углу осей логарифма. – user001

+0

@ user001, какие полигоны не накладываются? Я имею в виду, что вся суть кода показывает, что они не на втором рисунке, потому что это пробел. Я сделал код и график в 2014b –

+0

@ user001 У меня была ошибка, см. Отредактированный код –

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