Как повернуть несколько строк на изображении - PullRequest
0 голосов
/ 10 апреля 2019

Я рисую диагональные линии на изображении с регулярным интервалом около 70 пикселей между ними.

Image describes what I would like to do

Есть ли какой-нибудь возможный способ сделать все остальное?

Я прошел центральную линию, но я изо всех сил стараюсь сделать все остальное. Я попытался использовать систему, используя циклы if и for и (я покажу код ниже).

%------------------- Line through centre
aa=0;       %x1
ab=250;     %x2
a=[aa,ab];  %[x1,x2]

za=0;       %y1
zb=250;     %y2
n1=[za,zb];  %[y1,y2]

%------------------------ Line below centre
ba=50
bb=250
b=[ba,bb];

ya=0;
yb=200;
y=[ya,yb];

%Spacing between rotation
Rspac=5

slp=phantom(250);
imshow(slp);
set (gca,'xdir','normal');
set (gca,'ydir','normal');
axis on
hold on

%Plot for central diagonal line start
for x=Rspac*ones(1,(250/Rspac));
     aa=aa+x;
     ab=ab-x;
     line([aa,ab],[za,zb]);
end
     if aa==250;
         for z=Rspac*ones(1,250/Rspac);
             za=za+z;
             zb=zb-z;
             line([aa,ab],[za,zb]), 'r';
         end
    end

%Plot for line -50 and -100 from centre diagonal start
for n1=Rspac*ones(1,(250/Rspac));
    ba=ba+n1
    yb=yb+n1
    line([ba,bb],[ya,yb]);
    if yb>=250
        for n2=Rspac*ones(1,250/Rspac);
        ba=ba+n2;
        bb=bb-n2;
        line([ba,bb],[ya,yb]);
            if ba>=250
                for n3=Rspac*ones(1,250/Rspac);
                 bb=ba-n3
                 yb=yb+n3
                 line([ba,bb],[ya,yb]);
                    if bb>=250
                        for n4=Rspac*ones(1,250/Rspac);
                        ya=ya+n4
                        yb=bb-n4
                        line([ba,bb],[ya,yb]);
                            if ya>=250
                                for x=Rspac*ones(1,250/Rspac);
                                ba=ba-x
                                yb=yb-x
                                line([ba,bb],[ya,yb]);
                                    if yb<=0
                                        for x=Rspac*ones(1,250/Rspac);
                                        ba=ba-x
                                        bb=bb+x
                                        line([ba,bb],[ya,yb]);
                                        end
                                    end
                                end
                            end
                        end
                    end
                end
            end
        end
    end
end

Я ожидаю получить линию, которая вращается вокруг своей точки вокруг изображения, как центральная диагональная линия.

1 Ответ

0 голосов
/ 10 апреля 2019

Вот один из многих возможных способов сделать это, не используя ваши данные, но вы получите суть:

% line coordinates
x = [-1,1,nan];
y = [-1,1,nan];

% set up rotation matrix
nLine = 20;
theta = 2 * pi / nLine;
A = [cos(theta), sin(theta), 0;...
    -sin(theta), cos(theta), 0;...
     0,          0,          1];

hFig = figure; %figure handle
hL(1) = plot(x,y); % line object handle
hAx = hL(1).Parent; % axes handle

% make sputnik starburst things
for k = 2:nLine
    X = [hL.XData(end-2:end); hL.YData(end-2:end); ones(1,3)];
    Y = A * X;
    hL.XData = cat(2,hL.XData,Y(1,:));
    hL.YData = cat(2,hL.YData,Y(2,:));
end

% translate the starbursts
nStarburst = 4;
dx = 1:nStarburst; % horizontal step
dy = -dx; % vertical step
for k = 1:nStarburst
    hL(k+1) = copyobj(hL(1), hAx);
    hL(k+1).XData = hL(k+1).XData + dx(k);
    hL(k+1).YData = hL(k+1).YData + dy(k);
end

ходячие звездные вспышки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...