Galileo Press
   
Zurück   Flashforum > Flash > Spielkonzepte und Spieleprogrammierung
Willkommen, astro-susi.
Ihr letzter Besuch war: Heute um 22:46 Uhr
Private Nachrichten: Ungelesen 0, insgesamt 9.
Kontrollzentrum Hilfe Benutzerliste Kalender Neue Beiträge Nützliche Links Abmelden

Antwort
 
Themen-Optionen Thema durchsuchen Thema bewerten Ansicht
Alt 10-11-2005, 12:10   #1
McPepper
Neuer User
 
Registrierungsdatum: Aug 2001
Ort: bei Bonn
Beiträge: 41
Question Flächen berechnen in einem 2D-Array???

Hallo zusammen,

ich sitz vor nem kleinen Problem.

Und zwar probiere ich eine Fläche zu optimieren!

Ich habe ein 2-dim Array und will die belegten Felder zu Flächen zusammen zu fassen.

Im Anhang hab ich ein kleines GIF, dass das Problem denke ich gut beschreibt.
Ich will die X/Y Position bestimmen und dann die Breite und Höhe der Fläche berechnen.
Es gibt verschiedene Flächen-Typen (in der Grafik farbig dargestellt), das soll natürlich berücksichtigt werden.

Hat jemand eine Idee? Steh grad aufm Schlauch :-(
Angehängte Grafiken
Dateityp: gif flaeche.gif (7,3 KB, 56x aufgerufen)
McPepper ist offline Beitrag melden   Mit Zitat antworten
Alt 11-11-2005, 02:27   #2
McPepper
Neuer User
 
Registrierungsdatum: Aug 2001
Ort: bei Bonn
Beiträge: 41
keiner?

bin soweit das ich es für die breite realisiert hab... aber das geht bestimmt auch noch besser oder???

Code:
// columns for (var x : Number = 0; x < layer.length; x ++) { // row for (var y : Number = 0; y < layer[x].length; y ++) { var currentId : Number = layer [x][y] // width of Area var w : Number = 1; // width for (var y2 : Number = y+1; y2 < layer[x].length; y2 ++) { if (currentId == layer [x][y2]) { y = y2; w++; } else { break; } } setArea(currentId, x, y, w, 0); // id, x-pos, y-pos, with, height } }
McPepper ist offline Beitrag melden   Mit Zitat antworten
Alt 14-11-2005, 10:16   #3
Janoscharlipp
Sinn-frei-Denker
 
Benutzerbild von Janoscharlipp
 
Registrierungsdatum: Apr 2002
Ort: Freiburg
Beiträge: 1.971
Erklær bitte nochmal genauer, was du willst.
Vielleicht besser mit 2 Bildern, eines was zeigt, wovon du ausgehst, und eines, das zeigt, was du erhalten møchtest.
__________________

↑ ↑ ↑______↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑______↑ ↑ ↑
↑ ↑___↑ ↑ ↑___↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑______↑ ↑ ↑
↑___↑ ↑ ↑ ↑ ↑___↑ ↑ ↑ ↑ ↑ Kopf hoch ↑ ↑ ↑ ↑ ↑ ↑ ↑______↑ ↑ ↑
↑______ ______ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑___↑ ↑ ↑___↑ ↑
↑ ↑ ↑______↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑___↑ ↑ ↑ ↑ ↑___↑
Janoscharlipp ist offline Beitrag melden   Mit Zitat antworten
Alt 14-11-2005, 12:36   #4
astro-susi
Neuer User
 
Registrierungsdatum: Jul 2002
Ort: München
Beiträge: 56
das für die breite geht glaub auch so (aber nicht getestet):
PHP-Code:
for (var Number 0layer.length++)
{
var 
currentId Number = -// init mit -1 (falls das sonst nicht vorkommt)
var Number 1;
var 
y_final Number 0;
// row
  
for (var Number 0layer[x].length++)
  {
      if (
layer [x][y] == currentId) {
          
y_final y;
          
w++;
      } else {
          
// neue id? -> area speichern
          
if (currentId != -1) {
              
setArea(currentIdxy_finalw0);           }
       
currentId layer [x][y];
         
1;
           
y_final y;
  }

__________________
when given a choice between two theories, take the one that is funnier. (Blore's razor)
astro-susi ist gerade online   Mit Zitat antworten
Alt Gestern, 10:55   #5
McPepper
Neuer User
 
Registrierungsdatum: Aug 2001
Ort: bei Bonn
Beiträge: 41
Zitat:
Zitat von Janoscharlipp
Erklær bitte nochmal genauer, was du willst.
Vielleicht besser mit 2 Bildern, eines was zeigt, wovon du ausgehst, und eines, das zeigt, was du erhalten møchtest.

hab mal eine fla erstellt mit meinem aktuellen stand. denke damit wird das problem deutlich...

dazu hab ich die grafik nochmal bearbeitet (arrays beginnen ja mit 0 )

in der grafik habe ich 26 belegte Felder.

fasse ich felder zu flaechen zusammen erhalte ich mit meiner loesung (siehe fla) bis jetzt 12 flaechen.

die grafik zeigt eine bessere loesung mit nur 7 flaechen!!! die will ich haben


der entscheidene code sieht so aus (mein alter war mist (@astro-susi danke, hast mir paar denk anstoeße gegeben)):

Code:
var x:Number = 0; var y:Number = 0; var w:Number = 0; var h:Number = 0; var id:Number = 0; for (y=0; y<map.length; y++) { for (x=0; x<map[y].length; x++) { currentX = x; // if content in field is a field if (map[y][x] != 0) { // id of field id = map[y][x]; // width of field w = 1; for (var x2 = x+1; x2<map[y].length; x2++) { if (map[y][x2] == id) { w++; } else { break; } x++; } printArea(id, currentX, y, w, h); } } }

grueße
Angehängte Grafiken
Dateityp: gif flaeche.gif (11,4 KB, 12x aufgerufen)
Angehängte Dateien
Dateityp: zip testFlaeche.zip (5,7 KB, 3x aufgerufen)
McPepper ist offline Beitrag melden   Mit Zitat antworten
Alt Gestern, 11:59   #6
astro-susi
Neuer User
 
Registrierungsdatum: Jul 2002
Ort: München
Beiträge: 56
nette aufgabe

also von der idee her geht das so:
1. suche zusammenhhängende reihe (machst du oben). wenn eine fertig ist, hast du ja die entsprechenden x-werte; z.b. [2,3,4].
2. für jeden dieser x-werte schauen, ob darunterliegende kästchen gleiche id haben, die höhe jeweils speichern
3. das minimum davon nehmen, damit es schön rechteckig bleibt.

sei jetzt mal das array der x-werte = x_arr, der y-wert dazu y_akt
PHP-Code:
y_min map.length-1;
for (
a in x_arr) {
    for (
y_tmp y_akt+1y_tmp <= y_miny_tmp++) {
        if (
map[a][y_tmp] == id) {
              
y_min y_tmp;
        } else {
              break;
        }
   }
}
hoehe_des_felds y_min y_akt
... so in etwa.

grüße vom
astro
__________________
when given a choice between two theories, take the one that is funnier. (Blore's razor)

Geändert von astro-susi (Gestern um 12:32 Uhr).
astro-susi ist gerade online   Mit Zitat antworten
Alt Gestern, 13:02   #7
McPepper
Neuer User
 
Registrierungsdatum: Aug 2001
Ort: bei Bonn
Beiträge: 41
@astro-susi

nett. werd mir das gleich mal angucken.

aber mein erster gedanke ist: wie schaut es beim abarbeiten der naechsten reihe aus?

dann greif ich unterumstaenden auf ein feld zu, dass ich schon einer flaeche zu geordnet hab.

ein zweites array anlegen, oder die felder loeschen gilt nicht! ! !
das will ich unter allen umstaenden vermeiden!
McPepper ist offline Beitrag melden   Mit Zitat antworten
Alt Gestern, 13:26   #8
astro-susi
Neuer User
 
Registrierungsdatum: Jul 2002
Ort: München
Beiträge: 56
hm, aber irgendwie musst ja speichern, welche teilchen du schon hast, oder?
außer, du schaust alle bisher erzeugten felder durch, ist aber aufwändig.
aber du könntest ja (wenn das gilt ) ein ganz kleines array anlegen, in dem du für jeden x-wert den nächsten noch nicht zugeordneten y-wert speicherst.

ach, ich würd' jetzt ja viel lieber da weiter spielen als arbeiten!
__________________
when given a choice between two theories, take the one that is funnier. (Blore's razor)
astro-susi ist gerade online   Mit Zitat antworten
Alt Gestern, 21:11   #9
astro-susi
Neuer User
 
Registrierungsdatum: Jul 2002
Ort: München
Beiträge: 56
so:
PHP-Code:
var yPos:Array = new Array(00000000000);
for (
y=0y<maxYy++) {
    for (
x=0x<maxXx++) {
        
currentX x;
        
theY yPos[x];
        
// id of field
        
id map[theY][x];
        
// if content in field is a field
        
if (id != && id != undefined) {
            
tmp = new Array();
            
tmp.push(x);
            for (var 
x2 x+1x2<map[y].lengthx2++) {
                if ((
yPos[currentX] == yPos[x2]) && (map[yPos[x2]][x2] == id)) {
                    
tmp.push(x2);
                } else {
                    
fullRow true;
                    
0;
                    while (
fullRow) {
                        
h++;
                        for (
theX 0theX tmp.lengththeX++) {
                            
fullRow fullRow && (map[theY+h][tmp[theX]] == id);
                            
yPos[tmp[theX]]++;
                        }
                    }
                    break;
                }
                
x++;
            }
            
printArea(idcurrentXtheYtmp.lengthh);
            
countFlaechen++;
        } else {
            
yPos[currentX]++;
        }
    }

... gibt sieben flächen (wenn auch ein kleines bisschen andere, als du wolltest). und jedes teil wird nur einmal angeschaut - ist also außer kleine optimierungsdinger so schnell wie es nur geht

viel spaß damit (ich hatte welchen) und grüße,
fräulein astro

... das yPos-Array kann man noch verkleinern, indem man nur für x-werte, wo eine fläche vorkam den wert speichert und ansonsten die globale zählvariable y verwendet. das wär noch hübscher.
__________________
when given a choice between two theories, take the one that is funnier. (Blore's razor)

Geändert von astro-susi (Gestern um 21:14 Uhr).
astro-susi ist gerade online   Mit Zitat antworten
Alt Heute, 15:33   #10
Janoscharlipp
Sinn-frei-Denker
 
Benutzerbild von Janoscharlipp
 
Registrierungsdatum: Apr 2002
Ort: Freiburg
Beiträge: 1.971
hätte ich auch Lust, mir mal anzusehen.

Auf den ersten Blick würde ich aber sagen, das man daraus am besten vier Flächen macht. Oder ist Voraussetzung, dass sich die Flächen nicht überlappen?
Man müsste halt noch eine Tiefe mit speichern.
__________________

↑ ↑ ↑______↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑______↑ ↑ ↑
↑ ↑___↑ ↑ ↑___↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑______↑ ↑ ↑
↑___↑ ↑ ↑ ↑ ↑___↑ ↑ ↑ ↑ ↑ Kopf hoch ↑ ↑ ↑ ↑ ↑ ↑ ↑______↑ ↑ ↑
↑______ ______ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑___↑ ↑ ↑___↑ ↑
↑ ↑ ↑______↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑___↑ ↑ ↑ ↑ ↑___↑
Janoscharlipp ist offline Beitrag melden   Mit Zitat antworten
Antwort



Forumregeln
Es ist Ihnen erlaubt, neue Themen zu verfassen.
Es ist Ihnen erlaubt, auf Beiträge zu antworten.
Es ist Ihnen erlaubt, Anhänge anzufügen.
Es ist Ihnen erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:38 Uhr.


Unterstützt das Flashforum!


Copyright ©1999-2005 Sascha Wolter und Marc Thiele.
Powered by vBulletin Version 3.5.0 (Deutsch)
Copyright ©2000 - 2005, Jelsoft Enterprises Ltd.