Vinnaren i pepparkakshustävlingen!
2012-04-26, 17:52
  #1
Medlem
Schweinsteigens avatar
Tjo, håller på med en skoluppgift i MatLab som kretsar kring överlappande resp. ej överlappande rektanglar vilka ska skrivas ut i en graf. Rektanglarna kan se ut på två olika sätt beroende på om de överlappar eller ej:

Överlappande rektanglar:
Kod:
rectangle('position',[wx wy ww wh],'Linestyle', '-', 'FaceColor', 'none');

Ej överlappande rektanglar:
Kod:
rectangle('position',[wx wy ww wh],'Linestyle', '-.', 'FaceColor', 'none');

Programmet funkar ibland, ibland inte, ej överlappande rektanglar markeras då och då som överlappande rektanglar och vice versa. Jag har med ett kriterium för att gallra ut de överlappande rektanglarna vilket jag tror borde fungera (kommenterat "kriterium" i kod). Vart tror ni felet ligger?

Programmet är en ganska simpel konstruktion och ser ut på följande sätt:
Kod:
function [ output_args ] = projekt(Antal)

matrix=zeros(Antal,4);          %Skapa vector
counter1=0;                     %Räknade pekar på resp rad i matris
SaveAntal=Antal;                %Spara undan antal brukas senare
ManuAntal=Antal;                %Sparar undan antal brukas senare
Break=0;

    %Lägger in slumpmässigt framtagna siffror i matris
    while 0<Antal
    counter1=counter1+1;
    
    x=(rand(1)*10);   %y-koor
    y=(rand(1)*10);   %x-koor
    w=(rand(1)*10);   %width
    h=(rand(1)*10);   %height
      
    matrix(counter1,1)=x;
    matrix(counter1,2)=y;
    matrix(counter1,3)=w;
    matrix(counter1,4)=h;
    
    display(matrix);
    Antal = Antal-1;     %Räknar ner whilesatsen
    end
    
    while Break~=SaveAntal
    Break=Break+1;           %Räknar upp whilesatsen
        
    wx=matrix(ManuAntal,1);
    wy=matrix(ManuAntal,2);
    ww=matrix(ManuAntal,3);
    wh=matrix(ManuAntal,4);    
        
    x1=matrix(ManuAntal,1);    
    y1=matrix(ManuAntal,2); 
    w1=matrix(ManuAntal,3)./2;  
    h1=matrix(ManuAntal,4)./2;
    
      counter2=0;
      while counter2<SaveAntal
      counter2=counter2+1;  %Räknar upp whilesatsen
            
         x2=matrix(counter2,1);
         y2=matrix(counter2,2);
         w2=(matrix(counter2,3)./2);
         h2=(matrix(counter2,4)./2);
                    
           if x1~=x2
                
               if abs(x2-x1) < w2+w1 && abs(y2-y1) < h2+h1  %Kriterium
               rectangle('position',[wx wy ww wh],'Linestyle', '-', 'FaceColor', 'none');
               else 
               rectangle('position',[wx wy ww wh],'Linestyle', '-.', 'FaceColor', 'none');
               end
                        
           end 
        end
     
             
    ManuAntal=ManuAntal-1;
    end

Tacksam för alla svar!
__________________
Senast redigerad av Schweinsteigen 2012-04-26 kl. 18:05.
Citera
2012-04-26, 19:02
  #2
Medlem
Citat:
Ursprungligen postat av Schweinsteigen
Kod:
if abs(x2-x1) < w2+w1 && abs(y2-y1) < h2+h1  %Kriterium

Tror inte att testerna räcker; om jag inte är ute och cyklar lär du jämföra abs(x2-x1) med w1 eller w2 beroende på vilken rektangel som är till vänster om den andra (x1 vs. x2).

Det går att göra med färre operationer utan abs(). I den operationen försvinner information; här informationen om vilken rektangel som är längst till vänster.

http://stackoverflow.com/a/306332/1246115 - bara 7 operationer.
http://blogs.mathworks.com/videos/20...ng-rectangles/ - samma lösning finns som nummer 4 här.
Citera
2012-04-27, 01:08
  #3
Medlem
Schweinsteigens avatar
Citat:
Ursprungligen postat av 770310
Tror inte att testerna räcker; om jag inte är ute och cyklar lär du jämföra abs(x2-x1) med w1 eller w2 beroende på vilken rektangel som är till vänster om den andra (x1 vs. x2).

Det går att göra med färre operationer utan abs(). I den operationen försvinner information; här informationen om vilken rektangel som är längst till vänster.

http://stackoverflow.com/a/306332/1246115 - bara 7 operationer.
http://blogs.mathworks.com/videos/20...ng-rectangles/ - samma lösning finns som nummer 4 här.

Okej gjorde några modifieringar, stöter dock på samma resultat. Har jag kanske missförstått något?
Kod:
function [ output_args ] = projekt(Antal)

matrix=zeros(Antal,4);          %Skapa vector
counter1=0;                     %Räknade pekar på resp rad i matris
SaveAntal=Antal;                %Spara undan antal brukas senare
ManuAntal=Antal;                %Sparar undan antal brukas senare
Break=0;
SaveMatrix=zeros(Antal,2);

    %Lägger in random framtagna siffror i matris
    while 0<Antal
    counter1=counter1+1;
    
    x=(rand(1)*10);   %y-koor
    y=(rand(1)*10);   %x-koor
    w=(rand(1)*10);   %width
    h=(rand(1)*10);   %height
      
    matrix(counter1,1)=x;
    matrix(counter1,2)=y;
    matrix(counter1,3)=w;
    matrix(counter1,4)=h;
    
    display(matrix);
    Antal = Antal-1;     %Räknar ner whilesatsen
    end
    
    while Break~=SaveAntal
    Break=Break+1;           %Räknar upp whilesatsen
        
    wx=matrix(ManuAntal,1);
    wy=matrix(ManuAntal,2);
    ww=matrix(ManuAntal,3);
    wh=matrix(ManuAntal,4);    
        
    x1=matrix(ManuAntal,1);    
    y1=matrix(ManuAntal,2); 
    w1=matrix(ManuAntal,3);  
    h1=matrix(ManuAntal,4);
    
    ax=[x1 y1];
    ay=[w1 h1];
    
      counter2=0;
      while counter2<SaveAntal
      counter2=counter2+1;  %Räknar upp whilesatsen
            
         x2=matrix(counter2,1);
         y2=matrix(counter2,2);
         w2=matrix(counter2,3);
         h2=matrix(counter2,4);
         
         bx=[x2 y2];
         by=[w2 h2];
                    
           %if x1~=x2
                
               %abs(x2-x1) < w2+w1 && abs(y2-y1) < h2+h1
               %bx(1)>ax(2)||by(1)>ay(2)||bx(2)<ax(1)||by(2)<ay(1)
               if bx(1)>ax(2)||by(1)>ay(2)||bx(2)<ax(1)||by(2)<ay(1) %Kriterium
               rectangle('position',[wx wy ww wh],'Linestyle', '-.', 'FaceColor', 'none');
               %hold on;
               else 
               rectangle('position',[wx wy ww wh],'Linestyle', '-', 'FaceColor', 'none');
               %hold on;
               end
                        
           %end 
        end
     
             
    ManuAntal=ManuAntal-1;
    end
Citera
2012-04-27, 16:50
  #4
Medlem
Kriteriet du använder

Kod:
bx(1)>ax(2)||by(1)>ay(2)||bx(2)<ax(1)||by(2)<ay(1)

gäller om ax, ay är koordinater till hörnen av den första rektangeln. När du plottar med

Kod:
rectangle('position',[wx wy ww wh],'Linestyle', '-.', 'FaceColor', 'none')

så kommer doch ww och wh tolkas som bredden respektive höjden av rektangeln, och betyder alltså inte samma sak som ax(2) och ay(2). Du behöver alltså hålla reda på vilka tal som är koordinater och vilka som är bredder/höjder, och konvertera mellan dessa.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback