Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 21-08-2005, 20:14   #1 (permalink)
Neuer User
 
Benutzerbild von zillion42
 
Registriert seit: Oct 2004
Beiträge: 65
DEM Höhendaten in Flash

Hallo,

Ich sitze noch immer an meinem Radar Simulator. Habe soweit eigentlich alles fertig.

Kurze Einleitung:
Das Programm ist ein Addon für das online Spiel LockOnModernAirCombat . In diesem Flugsimulator werden die Positionen der einzelnen online fliegenden Flugzeuge über eine ziemlich unbekannte Script Sprache (LUA) exportiert. Die Positionen schicke ich dann mit anderen informationen zusammen als String an einen JavaServer und und der macht mir dann die XML Socket für meine Grafische Umsetzung der Flugzeug Position, Höhe und Geschindigkeit in meinem Flash Radarprogramm. Es wird also realtime gezeigt wer gerade wo und wie fliegt.
Anschauen kann man sich das ganze ein paar Stunden am Tag (leider nicht immer online) unter:

http://www.virtual-jabog32.de/atc/ATC_85.swf

Screenies:








Soweit so gut. War auch ziemlich kompliziert.

http://www.polymoon.org/tobi/privat/...enChecknix.jpg
http://www.polymoon.org/tobi/privat/...reenChecks.jpg

Ein wichtiges Element fehlt mir jedoch noch. Ich möchte auf dem Terrain auf dem das ganze stattfindet realistische Radar Berechnungen erstellen. D.h. Wenn ein Radar gegen einen Berg Strahlt, sieht er natürlich dahinter nichts...

Dafür habe ich mir einige Höhenkarten des Terrains heruntergeladen und in einem 3d Programm auf verschiedenen Höhen (Querschnitte) den Radarschatten, von der jeweiligen Position der Radar Station aus gesehen, berechnet. Das sieht dann ungefähr so aus





Dieses ganze System hat sich allerdings für mich als nicht besonders effizeint erwiesen, zumal ich für mobile Radarstationen jeweils 10 Bilder rendern, vektorisieren, in Flash laden und dort als hittest mit shape flag definieren müsste, eigentlich unmöglich...

WAS ICH GERNE HINKRIEGEN WÜRDE... (freu mich schon auf eure hilfe)

Ich will auf der Höhenkarte vom Standpunkt des Radars zum Standpunkt der flugzeuge eine Linie ziehen welche als farbe(n) grauwerte ansteigend von Ausgangshöhe bis Zielhöhe (weiss = hoch, schwarz = tief) hat.
Wird an einer Stelle der Grauwert der Linie durch den Grauwert der Höhenkarte übertroffen, bedeutet es dass der Radarkontakt nicht besteht.

Eine linie ziehen ist kein Problem mit.

MovieClip.moveTo
MovieClip.lineTo

Aber ob ich mit:
MovieClip.lineStyle
MovieClip.beginFill
usw. die entsprechende Schattierung hinkriege weiss ich schonmal nicht.

Und dann in einem loop an der Linie Pixel für Pixel entlang und Helligkeit des entspechenden Pixels auf der Höhenkarte mit dem entsprechendem Pixel der Linie zu vergleichen stell ich mir auch nicht so leicht vor...

Also wenn einer von euch mir folgen kann, die Zeit hat und mir helfen will, wäre ich sehr sehr dankbar.

MFG

zillion42

edit:
Ich bräuchte ein array der Höhenkarte...

Bild Pixel für Pixel auslesen

notfalls als loadvar

EDIT2:

DEN WALD VOR LAUTER BÄUMEN NICHT GESEHEN...

Habe jetzt eine ASCII Datei der Höhendaten... Und werde versuchen das alles ohen Farben dafür mehr mathe zu machen... Kann mir einer sagen ob eine 64 MB loadvars in flash möglich ist...

Geändert von zillion42 (22-08-2005 um 04:05 Uhr)
zillion42 ist offline   Mit Zitat antworten
Alt 22-08-2005, 02:16   #2 (permalink)
Neuer User
 
Benutzerbild von zillion42
 
Registriert seit: Oct 2004
Beiträge: 65
Danke für die schnelle antwort...
Ja das ist schon ziemlich viel für flash, aber mit ein wenig glück klappts...

Leider handelt es sich hierbei aber nicht um irgendeine Landschaft sondern um eine ganz bestimmte zwischen der Ukraine und Russland am Schwarzen Meer.

Wenn du mir vielleicht einen Tip geben kannst wie ich 786789 Zeilen mit jeweils 3 Spalten von 8 Stellingen Floats besser verwalten kann als mit Arrays wäre ich auch schon weiter...

Ausserdem brauch ich ein wenig vector mathe um zwischen zwei Punkten alle pixelkoordinaten festzustellen und dann an meinem Raster die nächsten daran anliegenden Punkte zu erörtern.

MFG

Zillion
zillion42 ist offline   Mit Zitat antworten
Alt 22-08-2005, 03:30   #3 (permalink)
Neuer User
 
Benutzerbild von zillion42
 
Registriert seit: Oct 2004
Beiträge: 65
mhh...

ziemlich müde und morgen arbeiten... jedenfalls kann ich mir meine 3/4 millionen Zeilen in die Haare schmieren.
Vielleicht kann mir einer von euch ja mit

myXML.load(url)

ein wenig Hoffnung machen...

Die Ausgangs Datei ist momentan 23.3 MB als ASCII in folgendem format:

472500.0 5032500.0 101
472500.0 5034000.0 72
472500.0 5035500.0 47
472500.0 5037000.0 44
472500.0 5038500.0 28
472500.0 5107500.0 4
472500.0 5109000.0 7
472500.0 5110500.0 13

und das dann eben 786789 Zeilen lang...

Habe es mit dem load from File im AS Fenster pop up probiert als array

data = new Array("418000.0","5128000.0","-2",
"418000.0","5128500.0","-1",
"418000.0","5129000.0","-3",
"418000.0","5129500.0","-1",
"418000.0","5130000.0","-2",
"418000.0","5130500.0","-1",
"418000.0","5131000.0","-1",
"418000.0","5131500.0","0", etc

da copy/paste immer sofort zu Fehler in der Anwendung geführt hat, aber das laden ist dann nach ca 1h auch abgeraucht.

Wenn unbedingt nötig kann ich die Höhendaten sonst auch weiter runter interpolieren was natürlich ein immer unpräziseres Ergebnis bedeutet. Am liebsten hätte ich die vollen 598 MB von der NASA.

Das bisher unerwähnte Konkurenz Produkt (c++) kommt zB. mit einer 3 MB grossen Höhendatei (glaube als geotiff, ASCII ist natürlich grösser) aus. Das wären dann ca. 120000 Zeilen.

vielen Dank im vorraus

zillion

Geändert von zillion42 (22-08-2005 um 04:07 Uhr)
zillion42 ist offline   Mit Zitat antworten
Alt 22-08-2005, 18:49   #4 (permalink)
Neuer User
 
Benutzerbild von zillion42
 
Registriert seit: Oct 2004
Beiträge: 65
Na dann nochmal zwei klar gestellte Fragen:

1. Wie kann ich am besten mit solchen Datenmengen in Flash umgehen ohne mich dabei mit php und MySQL auseinadersetzen zu müssen.

2. Wenn die 3 mal 3/4 Millionen Einträge zuviel sind, wie hoch ist das Maximum ?

freue mich natürlich immer über Vorschläge

zillion
zillion42 ist offline   Mit Zitat antworten
Alt 22-08-2005, 21:09   #5 (permalink)
Neuer User
 
Benutzerbild von zillion42
 
Registriert seit: Oct 2004
Beiträge: 65
hgseib ich schätze ja deinen guten rat, wenn er denn kommt... Aber dein "Optimismus" ist echt umwerfend... Ist doch fast fertig, ich brauch ja nur noch ein bissl Höhenkarten implementieren und dafür eben eure hilfe.
Wenn du die WGS84 zu UTM Formel gesehen hättest oder die die Kurs Trigonometrie hätte es dir wahrscheinlich auch schon gereicht.

Und bevor ich jetzt zu weit gehe frag ich nun nochmal alle anderen die Erfahrung mit grossen Datenmengen haben...

1. Wie gross können Datenbanken als Array maximal nach eurer geschätzten Erfahrung ?
2. Wie sonst am besten ? (objekt, xml-objekt oder MySQL und php)
3. Wer hat den graham scan algorithmus in AS ?

nochmals danke

Zillion
zillion42 ist offline   Mit Zitat antworten
Alt 24-09-2005, 02:57   #6 (permalink)
Neuer User
 
Benutzerbild von zillion42
 
Registriert seit: Oct 2004
Beiträge: 65
Ich habe die Höhenkarte integriert...



www.virtual-jabog32.de/atc/ATC_100.swf

Eine Frage habe ich zu LineTo und extremen zoomstufen... die LineTo's zappeln immer so... Kann mir einer sagen ob ich das ändern kann ?
zillion42 ist offline   Mit Zitat antworten
Alt 28-05-2006, 18:13   #7 (permalink)
Neuer User
 
Benutzerbild von zillion42
 
Registriert seit: Oct 2004
Beiträge: 65
Wenns einen interessiert...

Damals hatte ich die Höhendaten als Array im Quelltext, das ging auch, nur nich so performant.

Das sah dann so aus, dass ich ein regelmässiges Array hatte, in welchem alle 522 Zeilen ein neues UTM Easting (270 m Raster) begann und das Array selbst bestand nur aus Höhen Integers. Wenn ich eine bestimmte Koordinate nachschauen wollte habe ich mir zuerst berechnet welche Zeile das im Array ist und dann die Höhe aus dem Array gezogen.

PHP-Code:
function CalcDBLine (eastingnorthing) {
    var 
Nmin 4733640;
    var 
Emin 443880;
    var 
NLines 522;
    var 
EdiffLines = (((easting-Emin)/Raster)*NLines)+1;
    var 
NdiffLines = (northing-Nmin)/Raster;
    var 
DBLine EdiffLines+NdiffLines;
    return 
DBLine;

Eingabe Koordianten wurden vorher auf mein 270 m Raster gerastert.
PHP-Code:
var x1 Math.round (RadarPos[0]/Raster)*Raster;
var 
y1 Math.round (RadarPos[1]/Raster)*Raster
Solch ein Array kann man schnell mit UltraEdit oder ansich Regex erstellen wenn man sich die Höhendaten als ASCII triplets exportiert und ein wenig sucht und ersetzt.

Inzwischen habe ich ein 2880x1666 pixel grosses DEM Bild in welchem ich per getPixel() aus ROT,GRÜN,BLAU einen Hue errechne und diesen in eine Höhe umsetze. Das DEM Bild hat dafür einen Regenbogen Verlauf (HSV-Shader, Microdem, GlobalMapper etc.)
PHP-Code:
import flash.display.BitmapData;
var 
linkageId:String "DB_image";
Elevation BitmapData.loadBitmap(linkageId); 
PHP-Code:
function GetAlt(eastingnorthing) {
    var 
N_max 5318522.362128//UTM Zone 36 Northing End
    
var E_min 239107.9142727//UTM Zone 36 Easting Start
    
var scaleFaktor 2880/4233//NewPixelSize/OriginalPixelSize
    
var EleFaktor 5620/360;  //MaxHeight/Hue
    
var XPix Math.floor(((easting-E_min)/270)*scaleFaktor);
    var 
YPix Math.floor(((N_max-northing)/270)*scaleFaktor);
    
//trace(XPix+","+YPix)
    
var color Elevation.getPixel(XPixYPix);
    var 
PixelR:Number = (color 0xff0000) >> 16;
    var 
PixelG:Number = (color 0xff00) >> 8;
    var 
PixelB:Number color 0xff;
    var 
PixelHue RGB2HSV(PixelRPixelGPixelB);
    var 
alt PixelHue*EleFaktor;
    
//trace("PIXEL "+XPix+","+YPix+", "+color+" - "+PixelR+"/"+PixelG+"/"+PixelB+"  "+alt)
    
return alt;
}
function 
RGB2HSV(rgb) {
    
//trace("RGB2HSV("+r+", "+g+", "+b+")");
    
var hue;
    var 
saturation;
    var 
brightness;
    var 
dx;
    
// maximum RGB component color value
    
var dn;
    
// minimum " 
    
var diff;
    
dx Math.max(rMath.max(gb));
    
dn Math.min(rMath.min(gb));
    
diff dx-dn;
    
brightness dx/255;
    if (
dx>0.0) {
        
saturation diff/dx;
    } else {
        
saturation 0.0;
    }
    if (
saturation>0.0) {
        if (
== dx) {
            
hue = (g-b)/diff;
        } else if (
== dx) {
            
hue 2.0+(b-r)/diff;
        } else if (
== dx) {
            
hue 4.0+(r-g)/diff;
        }
        
hue *= 60;
        if (
hue<0.0) {
            
hue hue+360.0;
        }
    } else {
        
hue 0.0;
        
/* doesn't matter, since black anyway */
    
}
    return 
hue;


Geändert von zillion42 (28-05-2006 um 19:39 Uhr)
zillion42 ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

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

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 02:07 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele