Matlab Zeka Küpü Çözen Program

Black Power

Özel Üye
8 Tem 2012
11,765
22
Başlayalım?

[ame]https://www.youtube.com/watch?v=vE_F9sCbkNI&feature=youtu.be[/ame]

Matlab zeka küpü çözümünde çok güzel bir program buldum paylaşmak istiyorum.Joren Heit isimli geliştirici tarafından yapılan programda zeka küpü çözümüyle ilgili yok yok.Programın sağ tarafı görsel hale getirilmiş ve program küpü çözerken size nasıl hareketler yapacağınızı belirtiyor.Sol tarafı kütüpünüzü programlamaya ayrılmış.Zeka küpünün isterseniz bozuk halini webcam ile programa gösterin isterseniz el ile girin hiç fark etmez çok kolay bir şekilde çözebilmekte.
Bu program bir robota entegre edilirse kolay bir şekilde küpü çözebilir diye düşünüyorum.Son rekor 3.253 sn diye biliyorum belki bu sürenin altına düşülmüştür.Projenin tüm kodlarına yazımızın altındaki linkten ulaşabilirsiniz.



matlab-zeka-kupu.jpg

matlab-zeka-kupu2.jpg



Zeka küpünün çözülmemiş halini el ile girerken renk kodları şu şekildedir (Mavi = B) , (Kırmızı = R) , (Sarı = Y) , (Beyaz = W) , (Yeşil = G) , (Turuncu = O)
Programın ana fonksiyonu aşağıdaki gibidir.Projenin çalışması için proje dosyalarını indirip içerisindeki digrub.m isimli dosyayı açıp çalıştırın. Matlab kodlarını indir




Kod:
[B][COLOR=White]d = size(R0,1);[/COLOR][/B]
[B][COLOR=White]if d~=3[/COLOR][/B]
[B][COLOR=White]    error('Input can only be a 3x3x3 cube')[/COLOR][/B]
[B][COLOR=White]end[/COLOR][/B]
[B][COLOR=White]if nargin > 1[/COLOR][/B]
[B][COLOR=White]    if (strcmp(varargin{1},'Animate')||strcmp(varargin{1},'animate')) && ...[/COLOR][/B]
[B][COLOR=White]        varargin{2} == 1[/COLOR][/B]
[B][COLOR=White]        animate = true;[/COLOR][/B]
[B][COLOR=White]    else[/COLOR][/B]
[B][COLOR=White]        animate = false;[/COLOR][/B]
[B][COLOR=White]    end[/COLOR][/B]
[B][COLOR=White]else[/COLOR][/B]
[B][COLOR=White]    animate = false;[/COLOR][/B]
[B][COLOR=White]end[/COLOR][/B]
[B][COLOR=White]solution = {};[/COLOR][/B]
[B][COLOR=White]rotations = {};[/COLOR][/B]
[B][COLOR=White]a = [0 3 2 1];[/COLOR][/B]
[B][COLOR=White]b = [2 1 0 3];[/COLOR][/B]

[B][COLOR=White]DefaultCam = [33.12 11.73 10.74];[/COLOR][/B]
[B][COLOR=White]DefaultView = [109.5,17.5];[/COLOR][/B]

[B][COLOR=White]if strcmp(get(gcf,'Name'),'Rubik')[/COLOR][/B]
[B][COLOR=White]    campos = get(gca,'CameraPosition');[/COLOR][/B]
[B][COLOR=White]    view   = get(gca,'View');[/COLOR][/B]
[B][COLOR=White]else[/COLOR][/B]
[B][COLOR=White]    campos = DefaultCam;[/COLOR][/B]
[B][COLOR=White]    view   = DefaultView;[/COLOR][/B]
[B][COLOR=White]end[/COLOR][/B]


[B][COLOR=White]%list of algorithms[/COLOR][/B]
[B][COLOR=White]A{1} =  {'x32','z31','y32','z33','x32'};[/COLOR][/B]
[B][COLOR=White]A{2} =  {'y12','y32','z12','y12','y32'};                 [/COLOR][/B]
[B][COLOR=White]A{3} =  {'x32','z33','y12','z31','x32'};[/COLOR][/B]
[B][COLOR=White]A{4} =  {'y31','z33','y33','z31'};[/COLOR][/B]
[B][COLOR=White]A{5} =  {'z33','y31','z31','y33'};[/COLOR][/B]
[B][COLOR=White]A{6} =  {'z13','y33','z11','y31','z11','x31','z13','x33'};[/COLOR][/B]
[B][COLOR=White]A{7} =  {'z11','y13','z13','y11','z13','x33','z11','x31'};[/COLOR][/B]
[B][COLOR=White]A{8} =  {'x33','y33','z13','y31','z11','x31'};[/COLOR][/B]
[B][COLOR=White]A{9} =  {'x33','z13','y33','z11','y31','x31'};[/COLOR][/B]
[B][COLOR=White]A{10} = {'y31','z11','y33','z11','y31','z12','y33','z12'};[/COLOR][/B]
[B][COLOR=White]A{11} = {'y33','z13','y31','z13','y33','z12','y31','z12'};[/COLOR][/B]
[B][COLOR=White]A{12} = {'y11','z11','y31','z13','y13','z11','y33','z12'};[/COLOR][/B]
[B][COLOR=White]A{13} = {'y33','z11','y33','z13','y33','z13','y33','z11','y31','z11','y32'};[/COLOR][/B]

[B][COLOR=White]R = R0;[/COLOR][/B]
[B][COLOR=White]tic[/COLOR][/B]

[B][COLOR=White]%STEP 1A: FORM CROSS ON TOP[/COLOR][/B]
[B][COLOR=White]crossel = 2:2:8;[/COLOR][/B]
[B][COLOR=White]rot = {'y3','x1','y1','x3','x0','y2'};[/COLOR][/B]
[B][COLOR=White]n = zeros(1,6);[/COLOR][/B]
[B][COLOR=White]for i=1:6[/COLOR][/B]
[B][COLOR=White]    x = R(2,2,i);[/COLOR][/B]
[B][COLOR=White]    temp = R(:,:,i);[/COLOR][/B]
[B][COLOR=White]    n(i) = nnz(temp(crossel)==x);[/COLOR][/B]
[B][COLOR=White]end[/COLOR][/B]
[B][COLOR=White]if n(5)==max(n)[/COLOR][/B]
[B][COLOR=White]    pickside = 5;[/COLOR][/B]
[B][COLOR=White]else[/COLOR][/B]
[B][COLOR=White]    pickside = find(n==max(n),1);[/COLOR][/B]
[B][COLOR=White]end[/COLOR][/B]
[B][COLOR=White]R = rubrot2(R,rot{pickside}); rotations = [rotations rot{pickside}];[/COLOR][/B]
[B][COLOR=White]temp = R(:,:,5);[/COLOR][/B]
[B][COLOR=White]col = temp(2,2);[/COLOR][/B]
[B][COLOR=White]n = nnz(temp(crossel)==col);[/COLOR][/B]
[B][COLOR=White]while n~=4[/COLOR][/B]
[B][COLOR=White]    for i=1:5[/COLOR][/B]
[B][COLOR=White]        if i~=5[/COLOR][/B]
[B][COLOR=White]            temp = R(:,:,1);[/COLOR][/B]
[B][COLOR=White]        else[/COLOR][/B]
[B][COLOR=White]            temp = R(:,:,6);[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]        x = crossel(find(temp(crossel)==col,1));[/COLOR][/B]
[B][COLOR=White]        if isempty(x)[/COLOR][/B]
[B][COLOR=White]            R = rubrot2(R,'z3'); rotations = [rotations 'z3'];[/COLOR][/B]
[B][COLOR=White]            continue[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]        if i~=5[/COLOR][/B]
[B][COLOR=White]            while R(3,2,5)==col[/COLOR][/B]
[B][COLOR=White]                R = rubrot(R,'z13'); solution = [solution algrot('z13',rotations)];[/COLOR][/B]
[B][COLOR=White]            end[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]        while numel(x)~=0[/COLOR][/B]
[B][COLOR=White]            if x==2||x==6[/COLOR][/B]
[B][COLOR=White]                if x==6[/COLOR][/B]
[B][COLOR=White]                    R = rubrot(R,'x33'); solution = [solution algrot('x33',rotations)];[/COLOR][/B]
[B][COLOR=White]                end[/COLOR][/B]
[B][COLOR=White]                while R(2,1,5)==col[/COLOR][/B]
[B][COLOR=White]                    R = rubrot(R,'z13'); solution = [solution algrot('z13',rotations)];[/COLOR][/B]
[B][COLOR=White]                end[/COLOR][/B]
[B][COLOR=White]                if i~=4[/COLOR][/B]
[B][COLOR=White]                    R = rubrot(R,'y13'); solution = [solution algrot('y13',rotations)];[/COLOR][/B]
[B][COLOR=White]                else[/COLOR][/B]
[B][COLOR=White]                    R = rubrot(R,'y12'); solution = [solution algrot('y12',rotations)];[/COLOR][/B]
[B][COLOR=White]                end[/COLOR][/B]
[B][COLOR=White]            else[/COLOR][/B]
[B][COLOR=White]                if x==4[/COLOR][/B]
[B][COLOR=White]                    R = rubrot(R,'x33'); solution = [solution algrot('x33',rotations)];[/COLOR][/B]
[B][COLOR=White]                end[/COLOR][/B]
[B][COLOR=White]                while R(2,3,5)==col[/COLOR][/B]
[B][COLOR=White]                    R = rubrot(R,'z13'); solution = [solution algrot('z13',rotations)];[/COLOR][/B]
[B][COLOR=White]                end[/COLOR][/B]
[B][COLOR=White]                if i~=4[/COLOR][/B]
[B][COLOR=White]                    R = rubrot(R,'y33'); solution = [solution algrot('y33',rotations)];[/COLOR][/B]
[B][COLOR=White]                else[/COLOR][/B]
[B][COLOR=White]                    R = rubrot(R,'y32'); solution = [solution algrot('y32',rotations)];[/COLOR][/B]
[B][COLOR=White]                end[/COLOR][/B]
[B][COLOR=White]            end[/COLOR][/B]
[B][COLOR=White]            temp = R(:,:,1);[/COLOR][/B]
[B][COLOR=White]            x = crossel(find(temp(crossel)==col,1));[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]        temp = R(:,:,5);[/COLOR][/B]
[B][COLOR=White]        n = nnz(temp(crossel)==col);[/COLOR][/B]
[B][COLOR=White]        R = rubrot2(R,'z3'); rotations = [rotations 'z3'];[/COLOR][/B]
[B][COLOR=White]        if n==4[/COLOR][/B]
[B][COLOR=White]            break[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]    end[/COLOR][/B]
[B][COLOR=White]end[/COLOR][/B]
[B][COLOR=White]%%STEP 1B: MATCH EDGE COLORS[/COLOR][/B]
[B][COLOR=White]EdgeCol = zeros(1,4);[/COLOR][/B]
[B][COLOR=White]FaceCol = rubinfo(R,'FaceColors(1:4)');[/COLOR][/B]
[B][COLOR=White]for side=1:4[/COLOR][/B]
[B][COLOR=White]    EdgeCol(side) = R(1,2,side);[/COLOR][/B]
[B][COLOR=White]end[/COLOR][/B]

[B][COLOR=White]%check if edge colors can be matched by twisting U[/COLOR][/B]
[B][COLOR=White]test = [EdgeCol EdgeCol];[/COLOR][/B]
[B][COLOR=White]for i=1:4[/COLOR][/B]
[B][COLOR=White]    x = all(FaceCol==test(i:i+3));[/COLOR][/B]
[B][COLOR=White]    if x[/COLOR][/B]
[B][COLOR=White]        R = rubrot(R,['z1' num2str(a(i))]);[/COLOR][/B]
[B][COLOR=White]        solution = [solution algrot(['z1' num2str(a(i))],rotations)]; %#ok<*AGROW>[/COLOR][/B]
[B][COLOR=White]        R = rubrot2(R,'z3');[/COLOR][/B]
[B][COLOR=White]        rotations = [rotations 'z3'];[/COLOR][/B]
[B][COLOR=White]        break[/COLOR][/B]
[B][COLOR=White]    end[/COLOR][/B]
[B][COLOR=White]end[/COLOR][/B]

[B][COLOR=White]if ~x[/COLOR][/B]
[B][COLOR=White]    x = zeros(1,3);[/COLOR][/B]
[B][COLOR=White]    for i=1:3[/COLOR][/B]
[B][COLOR=White]        x(i) = find(EdgeCol==FaceCol(i));[/COLOR][/B]
[B][COLOR=White]        EdgeCol([i,x(i)]) = EdgeCol([x(i),i]);[/COLOR][/B]
[B][COLOR=White]        if x(i)-i>=0[/COLOR][/B]
[B][COLOR=White]            x(i) = x(i)-i;[/COLOR][/B]
[B][COLOR=White]        else[/COLOR][/B]
[B][COLOR=White]            x(i) = x(i)-i+4;[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]    end[/COLOR][/B]

[B][COLOR=White]    for i=1:3[/COLOR][/B]
[B][COLOR=White]        if x(i)>0[/COLOR][/B]
[B][COLOR=White]            R = rubrot(R,A{x(i)});[/COLOR][/B]
[B][COLOR=White]            solution = [solution algrot(A{x(i)},rotations)];[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]        if sum(x(i+1:end))~=0[/COLOR][/B]
[B][COLOR=White]            R = rubrot2(R,'z3');[/COLOR][/B]
[B][COLOR=White]            rotations = [rotations 'z3'];[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]    end[/COLOR][/B]
[B][COLOR=White]end[/COLOR][/B]

[B][COLOR=White]%%STEP 2: MOVE ALL CORNERPIECES TO CORRECT POSITION[/COLOR][/B]
[B][COLOR=White]TopCol = rubinfo(R,'FaceColors(5)');[/COLOR][/B]
[B][COLOR=White]while nnz(R(:,:,5)==TopCol)~=9[/COLOR][/B]
[B][COLOR=White]    [Bcorners,Tcorners,TCE,TopCol] = rubinfo(R,'BCorners',...[/COLOR][/B]
[B][COLOR=White]                                               'TCorners',...[/COLOR][/B]
[B][COLOR=White]                                               'TCornersEnd',...[/COLOR][/B]
[B][COLOR=White]                                               'FaceColors(5)');[/COLOR][/B]
[B][COLOR=White]    Bcorners = sort(Bcorners,2);[/COLOR][/B]
[B][COLOR=White]    Tcorners = sort(Tcorners,2);[/COLOR][/B]
[B][COLOR=White]    TCE = sort(TCE,2);[/COLOR][/B]
[B][COLOR=White]    for i=1:4   %locate cornerpieces on bottom row[/COLOR][/B]
[B][COLOR=White]        x(i) = sum(Bcorners(i,:)==TopCol);[/COLOR][/B]
[B][COLOR=White]    end[/COLOR][/B]
[B][COLOR=White]    y = find(x,1);  %pick first cornerpiece[/COLOR][/B]

[B][COLOR=White]    goodorientation = true;[/COLOR][/B]
[B][COLOR=White]    if isempty(y) %no cornerpieces on bottom row -> find one and bring it down if needed[/COLOR][/B]
[B][COLOR=White]        for i=1:4[/COLOR][/B]
[B][COLOR=White]            x(i) = ~all(Tcorners(i,:)==TCE(i,:));[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]        y = find(x,1);[/COLOR][/B]
[B][COLOR=White]        if isempty(y)                       % cornerpieces in good place, wrong orientation.[/COLOR][/B]
[B][COLOR=White]            goodorientation = false;[/COLOR][/B]
[B][COLOR=White]            temp = [3 0 4 0 0 0 2 0 1];[/COLOR][/B]
[B][COLOR=White]            y = temp(find(R(:,:,5)~=TopCol,1));[/COLOR][/B]
[B][COLOR=White]            R = rubrot2(R,['z' num2str(a(y))]);[/COLOR][/B]
[B][COLOR=White]            rotations = [rotations ['z' num2str(a(y))]];[/COLOR][/B]
[B][COLOR=White]        else                                % cornerpiece has to be brought down.[/COLOR][/B]
[B][COLOR=White]            R = rubrot2(R,['z' num2str(a(y))]);[/COLOR][/B]
[B][COLOR=White]            rotations = [rotations ['z' num2str(a(y))]];[/COLOR][/B]
[B][COLOR=White]            R = rubrot(R,A{4});         %piece has been brought down now[/COLOR][/B]
[B][COLOR=White]            solution = [solution algrot(A{4},rotations)];[/COLOR][/B]
[B][COLOR=White]            Bcorners = rubinfo(R,'BCorners');[/COLOR][/B]
[B][COLOR=White]            Bcorners = sort(Bcorners,2);[/COLOR][/B]
[B][COLOR=White]            y = 1;[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]    end[/COLOR][/B]

[B][COLOR=White]    if goodorientation[/COLOR][/B]
[B][COLOR=White]        TCE = rubinfo(R,'TCornersEnd');[/COLOR][/B]
[B][COLOR=White]        TCE = sort(TCE,2);[/COLOR][/B]
[B][COLOR=White]        for i=1:4   %locate endposition of this piece[/COLOR][/B]
[B][COLOR=White]            x(i) = all(Bcorners(y,:)==TCE(i,:));[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]        x = find(x);[/COLOR][/B]
[B][COLOR=White]        y = x-y;                   %number of rotations needed to place piece underneath endposition[/COLOR][/B]
[B][COLOR=White]        if y<0[/COLOR][/B]
[B][COLOR=White]            y = y+4;[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]        if y~=0[/COLOR][/B]
[B][COLOR=White]            R = rubrot(R,['z3' num2str(y)]);    [/COLOR][/B]
[B][COLOR=White]            solution = [solution algrot(['z3' num2str(y)],rotations)];[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]        R = rubrot2(R,['z' num2str(a(x))]);[/COLOR][/B]
[B][COLOR=White]        rotations = [rotations ['z' num2str(a(x))]];[/COLOR][/B]
[B][COLOR=White]    end[/COLOR][/B]

[B][COLOR=White]    %cornerpiece is now correctly placed underneath goal-position, apply[/COLOR][/B]
[B][COLOR=White]    %A{4}/A{5} (first determine which is best with testcube)[/COLOR][/B]

[B][COLOR=White]    Rtest = cell(1,2);[/COLOR][/B]
[B][COLOR=White]    Rtest{1} = rubrot(R,A{4});[/COLOR][/B]
[B][COLOR=White]    Rtest{2} = rubrot(R,A{5});[/COLOR][/B]
[B][COLOR=White]    count = 1;[/COLOR][/B]
[B][COLOR=White]    while Rtest{1}(3,3,5)~=TopCol && Rtest{2}(3,3,5)~=TopCol[/COLOR][/B]
[B][COLOR=White]        Rtest{1} = rubrot(Rtest{1},A{4});[/COLOR][/B]
[B][COLOR=White]        Rtest{2} = rubrot(Rtest{2},A{5});[/COLOR][/B]
[B][COLOR=White]        count = count+1;[/COLOR][/B]
[B][COLOR=White]    end[/COLOR][/B]
[B][COLOR=White]    winner = find([Rtest{1}(3,3,5)==TopCol,Rtest{2}(3,3,5)==TopCol],1);[/COLOR][/B]
[B][COLOR=White]    for i=1:count[/COLOR][/B]
[B][COLOR=White]        R = rubrot(R,A{winner+3});[/COLOR][/B]
[B][COLOR=White]        solution = [solution algrot(A{winner+3},rotations)];[/COLOR][/B]
[B][COLOR=White]    end[/COLOR][/B]
[B][COLOR=White]end[/COLOR][/B]

[B][COLOR=White]%%STEP 3: MIDDLE LAYER[/COLOR][/B]
[B][COLOR=White]R = rubrot2(R,'x2');[/COLOR][/B]
[B][COLOR=White]rotations = [rotations 'x2'];[/COLOR][/B]
[B][COLOR=White]Layer2 = 1;[/COLOR][/B]
[B][COLOR=White]for i=1:4[/COLOR][/B]
[B][COLOR=White]    Layer2 = Layer2 * all(R(2,:,i)==R(2,2,i));[/COLOR][/B]
[B][COLOR=White]end[/COLOR][/B]
[B][COLOR=White]while ~Layer2[/COLOR][/B]
[B][COLOR=White]    [EdgeCol FaceCol TopCol] = rubinfo(R,'TEdges','FaceColors(1:4)','FaceColors(5)');[/COLOR][/B]
[B][COLOR=White]    y = find(sum(EdgeCol~=TopCol,2)==2,1);      %position of edge to select[/COLOR][/B]
[B][COLOR=White]    if isempty(y)   %no suitable edges left on top row[/COLOR][/B]
[B][COLOR=White]        for i=1:4[/COLOR][/B]
[B][COLOR=White]            x(i) = ~all(R(2,:,i)==R(2,2,i));    %faces with unfinished 2nd row[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]        x = find(x,1);[/COLOR][/B]
[B][COLOR=White]        R = rubrot2(R,['z' num2str(a(x))]);   %rotate cube to this face[/COLOR][/B]
[B][COLOR=White]        rotations = [rotations ['z' num2str(a(x))]];[/COLOR][/B]
[B][COLOR=White]        x = find(R(2,:,1)~=R(2,2,1),1);[/COLOR][/B]
[B][COLOR=White]        switch x[/COLOR][/B]
[B][COLOR=White]            case 1      %left edge has to brought up: A{7}[/COLOR][/B]
[B][COLOR=White]                R = rubrot(R,A{7});[/COLOR][/B]
[B][COLOR=White]                solution = [solution algrot(A{7},rotations)];[/COLOR][/B]
[B][COLOR=White]            case 3      %right edge has to be brought up: A{6}[/COLOR][/B]
[B][COLOR=White]                R = rubrot(R,A{6});[/COLOR][/B]
[B][COLOR=White]                solution = [solution algrot(A{6},rotations)];[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]        continue[/COLOR][/B]
[B][COLOR=White]    end[/COLOR][/B]
[B][COLOR=White]    edge = EdgeCol(y,:);                        %colors of selected edge[/COLOR][/B]
[B][COLOR=White]    x = find(FaceCol==edge(1));                 %goal-position of selected edge[/COLOR][/B]
[B][COLOR=White]    y = x-y;                                    %number of rotations of top-row needed[/COLOR][/B]
[B][COLOR=White]    if y<0 y = y+4; end if y~=0 R = rubrot(R,['z1' num2str(y)]); solution = [solution algrot(['z1' num2str(y)],rotations)]; end R = rubrot2(R,['z' num2str(a(x))]); %rotate cube accordingly rotations = [rotations ['z' num2str(a(x))]]; FaceCol = rubinfo(R,'FaceColors(1:4)'); x = find(FaceCol==edge(2)); %determine whether edge has to move to the left/right switch x case 2 %to the right, use A{6} R = rubrot(R,A{6}); solution = [solution algrot(A{6},rotations)]; case 4 %to the left, use A{7} R = rubrot(R,A{7}); solution = [solution algrot(A{7},rotations)]; end Layer2 = 1; for i=1:4 Layer2 = Layer2 * all(R(2,:,i)==R(2,2,i)); end end %%STEP 4: BUILD CROSS ON FINAL LAYER TopCol = rubinfo(R,'FaceColors(5)'); %first check what the situation is: cross/bar/L-shape/other cross = ~~rubcross(R,5); if cross situation = 'Cross'; else bar = all(R(2,:,5)==TopCol) | all(R(:,2,5)==TopCol); if bar situation = 'Bar'; else edges = [2,4,6,8]; r = R(:,:,5); Lshape = nnz(r(edges)==TopCol)>=1;[/COLOR][/B]
[B][COLOR=White]        if Lshape[/COLOR][/B]
[B][COLOR=White]            situation = 'Lshape';[/COLOR][/B]
[B][COLOR=White]        else[/COLOR][/B]
[B][COLOR=White]            situation = 'Dot';[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]    end[/COLOR][/B]
[B][COLOR=White]end[/COLOR][/B]

[B][COLOR=White]switch situation[/COLOR][/B]
[B][COLOR=White]    case 'Cross'[/COLOR][/B]
[B][COLOR=White]        %Continue to step 5[/COLOR][/B]
[B][COLOR=White]    case 'Bar'[/COLOR][/B]
[B][COLOR=White]        %Orient the bar from L to R (horizontal)[/COLOR][/B]
[B][COLOR=White]        if all(R(:,2,5)==TopCol) %vertical bar[/COLOR][/B]
[B][COLOR=White]            R = rubrot2(R,'z1');[/COLOR][/B]
[B][COLOR=White]            rotations = [rotations 'z1'];[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]        R = rubrot(R,A{8});[/COLOR][/B]
[B][COLOR=White]        solution = [solution algrot(A{8},rotations)];[/COLOR][/B]
[B][COLOR=White]    case 'Lshape'[/COLOR][/B]
[B][COLOR=White]        %Orient the L-shape to L and B[/COLOR][/B]
[B][COLOR=White]        x = sum(find(r(edges)==TopCol));[/COLOR][/B]
[B][COLOR=White]        c = [3 4 6 7;0 3 1 2];[/COLOR][/B]
[B][COLOR=White]        x = c(2,c(1,:)==x);[/COLOR][/B]
[B][COLOR=White]        if x~=0[/COLOR][/B]
[B][COLOR=White]            R = rubrot2(R,['z' num2str(x)]);[/COLOR][/B]
[B][COLOR=White]            rotations = [rotations ['z' num2str(x)]];[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]        R = rubrot(R,A{9});[/COLOR][/B]
[B][COLOR=White]        solution = [solution algrot(A{9},rotations)];[/COLOR][/B]
[B][COLOR=White]    case 'Dot'[/COLOR][/B]
[B][COLOR=White]        R = rubrot(R,[A{8},'z12',A{9}]);[/COLOR][/B]
[B][COLOR=White]        solution = [solution algrot([A{8},'z12',A{9}],rotations)];[/COLOR][/B]
[B][COLOR=White]end[/COLOR][/B]

[B][COLOR=White]%%STEP 5: Permuting corner pieces[/COLOR][/B]
[B][COLOR=White]solved = false;[/COLOR][/B]
[B][COLOR=White]while ~solved[/COLOR][/B]
[B][COLOR=White]    [Tcorners TCE] = rubinfo(R,'TCorners','TCornersEnd');[/COLOR][/B]
[B][COLOR=White]    temp = sort([Tcorners;Tcorners],2);[/COLOR][/B]
[B][COLOR=White]    TCE = sort(TCE,2);[/COLOR][/B]
[B][COLOR=White]    for i = 1:4[/COLOR][/B]
[B][COLOR=White]        correct = nnz(all(temp(i:i+3,:)==TCE,2));   %check how many corners are in the correct place[/COLOR][/B]
[B][COLOR=White]        if correct>=2[/COLOR][/B]
[B][COLOR=White]            break[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]    end[/COLOR][/B]

[B][COLOR=White]    R = rubrot(R,['z1',num2str(a(i))]);[/COLOR][/B]
[B][COLOR=White]    solution = [solution algrot(['z1' num2str(a(i))],rotations)];[/COLOR][/B]

[B][COLOR=White]    if correct==2[/COLOR][/B]
[B][COLOR=White]        temp = ~all(temp(i:i+3,:)==TCE,2);      %cornerpieces that need to be switched[/COLOR][/B]
[B][COLOR=White]        temp = [temp;temp]; %#ok<AGROW>[/COLOR][/B]
[B][COLOR=White]        adj  = [1 1 0 0]';[/COLOR][/B]
[B][COLOR=White]        dia  = [1 0 1 0]';[/COLOR][/B]
[B][COLOR=White]        solved = false;[/COLOR][/B]
[B][COLOR=White]        for i=1:4                               [/COLOR][/B]
[B][COLOR=White]            if all(temp(i:i+3,:)==adj)          %pieces to switch are adjecent[/COLOR][/B]
[B][COLOR=White]                R = rubrot2(R,['z' num2str(a(i))],'animate',animate');[/COLOR][/B]
[B][COLOR=White]                rotations = [rotations ['z' num2str(a(i))]];[/COLOR][/B]
[B][COLOR=White]                R = rubrot(R,A{12});[/COLOR][/B]
[B][COLOR=White]                solution = [solution algrot(A{12},rotations)];[/COLOR][/B]
[B][COLOR=White]                solved = true;[/COLOR][/B]
[B][COLOR=White]                break[/COLOR][/B]
[B][COLOR=White]            elseif all(temp(i:i+3,:)==dia)      %pieces to switch are diagonal[/COLOR][/B]
[B][COLOR=White]                R = rubrot(R,A{12});[/COLOR][/B]
[B][COLOR=White]                solution = [solution algrot(A{12},rotations)];[/COLOR][/B]
[B][COLOR=White]                break[/COLOR][/B]
[B][COLOR=White]            end[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]    else[/COLOR][/B]
[B][COLOR=White]        solved = true;[/COLOR][/B]
[B][COLOR=White]    end[/COLOR][/B]
[B][COLOR=White]end[/COLOR][/B]

[B][COLOR=White]%%STEP 6: Orienting top corners[/COLOR][/B]
[B][COLOR=White]%Because there are too many specific situations, a trial and error solution[/COLOR][/B]
[B][COLOR=White]%will be employed.[/COLOR][/B]
[B][COLOR=White]combs = [1 1 1;2 2 1;1 2 1;2 1 1;1 1 2;2 2 2;1 2 2;2 1 2]+9;[/COLOR][/B]
[B][COLOR=White]solved = nnz(R(:,:,5)==R(2,2,5))==9;[/COLOR][/B]
[B][COLOR=White]if ~solved[/COLOR][/B]
[B][COLOR=White]    for i = 1:4     %for all cube orientations, try A{10} and A{11}[/COLOR][/B]
[B][COLOR=White]        rot = ['z1',num2str(i-1)];[/COLOR][/B]
[B][COLOR=White]        B = A{10};[/COLOR][/B]
[B][COLOR=White]        Rtest = rubrot(R,[rot,B]);[/COLOR][/B]
[B][COLOR=White]        solved = nnz(Rtest(:,:,5)==Rtest(2,2,5))==9;[/COLOR][/B]
[B][COLOR=White]        if ~solved[/COLOR][/B]
[B][COLOR=White]            B = A{11};[/COLOR][/B]
[B][COLOR=White]            Rtest = rubrot(R,[rot,B]);[/COLOR][/B]
[B][COLOR=White]            solved = nnz(Rtest(:,:,5)==Rtest(2,2,5))==9;[/COLOR][/B]
[B][COLOR=White]            if solved[/COLOR][/B]
[B][COLOR=White]                break[/COLOR][/B]
[B][COLOR=White]            else[/COLOR][/B]
[B][COLOR=White]                C = {'z10','z11','z12','z13'};[/COLOR][/B]
[B][COLOR=White]                for j = 1:6     %for all algorithm combinations[/COLOR][/B]
[B][COLOR=White]                    for k = 1:4[/COLOR][/B]
[B][COLOR=White]                        comb = combs(j,:);[/COLOR][/B]
[B][COLOR=White]                        B = [A{comb(1)},C{k},A{comb(2)},A{comb(3)}];[/COLOR][/B]
[B][COLOR=White]                        Rtest = rubrot(R,[rot,B]);[/COLOR][/B]
[B][COLOR=White]                        solved = nnz(Rtest(:,:,5)==Rtest(2,2,5))==9;[/COLOR][/B]
[B][COLOR=White]                        if solved[/COLOR][/B]
[B][COLOR=White]                            break[/COLOR][/B]
[B][COLOR=White]                        end[/COLOR][/B]
[B][COLOR=White]                    end[/COLOR][/B]
[B][COLOR=White]                    if solved[/COLOR][/B]
[B][COLOR=White]                        break[/COLOR][/B]
[B][COLOR=White]                    end[/COLOR][/B]
[B][COLOR=White]                end[/COLOR][/B]
[B][COLOR=White]            end[/COLOR][/B]
[B][COLOR=White]            if solved[/COLOR][/B]
[B][COLOR=White]                break[/COLOR][/B]
[B][COLOR=White]            end[/COLOR][/B]
[B][COLOR=White]        else[/COLOR][/B]
[B][COLOR=White]            break[/COLOR][/B]
[B][COLOR=White]        end[/COLOR][/B]
[B][COLOR=White]    end[/COLOR][/B]
[B][COLOR=White]    R = rubrot(R,[rot,B]);[/COLOR][/B]
[B][COLOR=White]    solution = [solution algrot([rot,B],rotations)];[/COLOR][/B]
[B][COLOR=White]end[/COLOR][/B]

[B][COLOR=White]%%STEP 7: Permuting Edges[/COLOR][/B]

[B][COLOR=White]%twist U to place corner pieces correctly[/COLOR][/B]
[B][COLOR=White][Tcorners TCE FaceCol] = rubinfo(R,'TCorners','TCornersEnd','FaceColors(1:4)');[/COLOR][/B]
[B][COLOR=White]temp = [Tcorners;Tcorners];[/COLOR][/B]
[B][COLOR=White]correct = 0;[/COLOR][/B]
[B][COLOR=White]i = 0;[/COLOR][/B]
[B][COLOR=White]while correct~=4[/COLOR][/B]
[B][COLOR=White]    i = i+1;[/COLOR][/B]
[B][COLOR=White]    correct = nnz(all(temp(i:i+3,:)==TCE,2));[/COLOR][/B]
[B][COLOR=White]end[/COLOR][/B]
[B][COLOR=White]R = rubrot(R,['z1',num2str(a(i))]);[/COLOR][/B]
[B][COLOR=White]solution = [solution algrot(['z1' num2str(a(i))],rotations)];[/COLOR][/B]

[B][COLOR=White]correct = 0;[/COLOR][/B]
[B][COLOR=White]while correct~=4[/COLOR][/B]
[B][COLOR=White]    EdgeCol = zeros(1,4);[/COLOR][/B]
[B][COLOR=White]    for side=1:4[/COLOR][/B]
[B][COLOR=White]        EdgeCol(side) = R(1,2,side);[/COLOR][/B]
[B][COLOR=White]    end[/COLOR][/B]
[B][COLOR=White]    correct = nnz(FaceCol==EdgeCol);    %number of correct edge-pieces (0,1 or 4);[/COLOR][/B]
[B][COLOR=White]    switch correct[/COLOR][/B]
[B][COLOR=White]        case 0[/COLOR][/B]
[B][COLOR=White]            R = rubrot(R,A{13});[/COLOR][/B]
[B][COLOR=White]            solution = [solution algrot(A{13},rotations)];[/COLOR][/B]
[B][COLOR=White]        case 1[/COLOR][/B]
[B][COLOR=White]            x = find(FaceCol==EdgeCol);[/COLOR][/B]
[B][COLOR=White]            R = rubrot2(R,['z' num2str(b(x))]); %rotate correct piece to the back[/COLOR][/B]
[B][COLOR=White]            rotations = [rotations ['z' num2str(b(x))]];[/COLOR][/B]
[B][COLOR=White]            R = rubrot(R,A{13});[/COLOR][/B]
[B][COLOR=White]            solution = [solution algrot(A{13},rotations)];[/COLOR][/B]
[B][COLOR=White]            FaceCol = rubinfo(R,'FaceColors(1:4)');[/COLOR][/B]
[B][COLOR=White]        case 4[/COLOR][/B]
[B][COLOR=White]            %cube solved[/COLOR][/B]
[B][COLOR=White]    end[/COLOR][/B]
[B][COLOR=White]end[/COLOR][/B]


[B][COLOR=White]t=1;[/COLOR][/B]
[B][COLOR=White]while t<=numel(solution)[/COLOR][/B]
[B][COLOR=White]    if isempty(solution{t})[/COLOR][/B]
[B][COLOR=White]        solution(t)=[];[/COLOR][/B]
[B][COLOR=White]    else[/COLOR][/B]
[B][COLOR=White]        t=t+1;[/COLOR][/B]
[B][COLOR=White]    end[/COLOR][/B]
[B][COLOR=White]end[/COLOR][/B]
[B][COLOR=White]solution = rubopt(solution);[/COLOR][/B]

[B][COLOR=White]if animate[/COLOR][/B]
[B][COLOR=White]    rubplot(R0,solution);[/COLOR][/B]
[B][COLOR=White]else[/COLOR][/B]
[B][COLOR=White]    R = ruborient(R,'default');[/COLOR][/B]
[B][COLOR=White]    set(gca,'CameraPosition',campos,'View',view);[/COLOR][/B]
[B][COLOR=White]end[/COLOR][/B]

[B][COLOR=White]total_time = toc;[/COLOR][/B]

[B][COLOR=White]switch nargout[/COLOR][/B]
[B][COLOR=White]    case 0[/COLOR][/B]
[B][COLOR=White]        return[/COLOR][/B]
[B][COLOR=White]    case 1[/COLOR][/B]
[B][COLOR=White]        varargout{1} = R;[/COLOR][/B]
[B][COLOR=White]    case 2[/COLOR][/B]
[B][COLOR=White]        varargout{1} = R;       [/COLOR][/B]
[B][COLOR=White]        varargout{2} = solution;[/COLOR][/B]
[B][COLOR=White]    case 3[/COLOR][/B]
[B][COLOR=White]        varargout{1} = R;[/COLOR][/B]
[B][COLOR=White]        varargout{2} = solution;[/COLOR][/B]
[B][COLOR=White]        varargout{3} = total_time;[/COLOR][/B]
[B][COLOR=White]    case 4[/COLOR][/B]
[B][COLOR=White]        varargout{1} = R;[/COLOR][/B]
[B][COLOR=White]        varargout{2} = solution;[/COLOR][/B]
[B][COLOR=White]        varargout{3} = total_time;[/COLOR][/B]
[B][COLOR=White]        varargout{4} = numel(solution);[/COLOR][/B]
[B][COLOR=White]end[/COLOR][/B]


 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.