Punkte grafisch anzeigen

Hallo
um schon mal 1Jahr vorauszuschauen, denn dann werde ich vermutlich dafür Zeit finden (naja nur ein Spass), es würde mich interessieren, wie man Punktdaten grafisch darstellen kann.

Konkret geht es um Punktdaten, welche in einer Form grafisch aufbereitet werden sollen. Die Daten sind dabei von den Koordinaten her verschieden, d.h. Sie können überall liegen und schon mal einige Kilometer auch voneinander entfernt.
Die Einheit ist aber grundlegend m, cm oder mm, als nicht Trips oder irgendwas anderes. Entsprechend sollte das Fenster natürlich einen Ausschnitt mit allen Punkten darstellen und entsprechend weit zoomen.

Wie ist sowas realisierbar und geht vom Aufbau her auch schnell, denn wenn da 10000 Punkte mal gezeichnet werden, könnte das doch etwas dauern.

Vielleicht hat jmd Ideen dazu.
Bei Fragen antworte ich gern.

Mfg Werner

Hallo Werner,

sieh Dir doch mal DirectDraw an.
http://www.vbfun.de/cgi-bin/loadframe.pl?ID=vb/tipps…
Direct Draw ist genau dafür gedacht, eine Grafik aus Punkten zu erzeugen und das recht schnell. Was für Landschaften in Spielen gut ist, sollte für Deinen Zweck ausreichend sein, denke ich.

Gruß, Rainer

Hi
braucht man dazu dieses DirectDraw unbedingt.
Gibt es nicht ein einfaches graphisches Steuerelement für die Erzeugung eines Punktes an der gewünschten Stelle???

Hallo

Hi,
nimm doch ne Picturebox und setze mit PSset (x,y), Farbe
Pixel und versuche doch auch mal Google zu benutzen:
http://www.google.com/search?hl=de&ie=ISO-8859-1&q=v…
Gruß.Timo

um schon mal 1Jahr vorauszuschauen, denn dann werde ich
vermutlich dafür Zeit finden (naja nur ein Spass), es würde
mich interessieren, wie man Punktdaten grafisch darstellen
kann.

Konkret geht es um Punktdaten, welche in einer Form grafisch
aufbereitet werden sollen. Die Daten sind dabei von den
Koordinaten her verschieden, d.h. Sie können überall liegen
und schon mal einige Kilometer auch voneinander entfernt.
Die Einheit ist aber grundlegend m, cm oder mm, als nicht
Trips oder irgendwas anderes. Entsprechend sollte das Fenster
natürlich einen Ausschnitt mit allen Punkten darstellen und
entsprechend weit zoomen.

Wie ist sowas realisierbar und geht vom Aufbau her auch
schnell, denn wenn da 10000 Punkte mal gezeichnet werden,
könnte das doch etwas dauern.

Vielleicht hat jmd Ideen dazu.
Bei Fragen antworte ich gern.

Mfg Werner

Hallo Werner,

braucht man dazu dieses DirectDraw unbedingt.

Nein, nur wenn man große Datenmangen hat und es schnell gehen soll … wie bei Dir. :wink:

Gibt es nicht ein einfaches graphisches Steuerelement für die
Erzeugung eines Punktes an der gewünschten Stelle???

Klar, eine PictureBox und dann Punkte mit PSet(x,y),f setzen oder Punkte mit Line (xt,yt)-(xb,yb),f verbinden, je nach Geschmack.
Wenn Das aber dann perspektivisch sein soll, Du zoomen oder scrollen möchtest, wird das für Deine Datenmengen zu langsam.

Gruß, Rainer

Weiterführend
Hallo
ja und wie geht das dann mit dem Zoomen, wenn man dieses DirectDraw hat???

Wenn ich zwei Punkte 0,0 10,10 habe ist das Bild kleiner als wenn ich 0,0 30000,30000 habe, damit alle Punkte drauf passen.

Macht man da ein Bild oder steuert man das am besten über Leisten, kann man da auch eine Scrollfunktion einbauen für das Bild???

Wie geht’n das alles? *dummbin*

Mfg Werner

Hallo Werner,

ja und wie geht das dann mit dem Zoomen, wenn man dieses
DirectDraw hat???

ich habe keine Ahnung … :wink: Aber es ist ja gleich Wochenende und ich wollte mir das schon immer mal ansehen. Jetzt habe ich einen Grund.

Wenn ich zwei Punkte 0,0 10,10 habe ist das Bild kleiner als
wenn ich 0,0 30000,30000 habe, damit alle Punkte drauf passen.

Nicht unbedingt, wenn ich das richtig verstanden habe übergibst Du 1.) die Koordinaten der polygone, 2.) den Betrachtungsabstand und die Lage der Polygone. Sind die weiter weg, werden sie kleiner dargestellt. Die perspektivische Darstellung rechnet DirectCraw wohl selbst. Deshalb ist das vermutlich die weniger komplizierte Variante.

Macht man da ein Bild oder steuert man das am besten über
Leisten, kann man da auch eine Scrollfunktion einbauen für das
Bild???

klar, indem Du den Standpunkt des Betrachters änders, nehme ich an.

Wie geht’n das alles? *dummbin*

Ich bin genau so dumm. Das Beispielprogramm sollte das aber alles erklären, hoffe ich. :wink: Ich habe ja noch Daten von Dir. Ich versuche eine Gitternetz-Landschaft damit zu erzeugen und einen ‚Hubschrauberflug‘ zu simulieren. Wenn das fertig ist, bekommst Du den Quellcode. Das wird ein lustiges Wochenende, ich freu mich schon.

Gruß, Rainer

Hi
naja machs nicht so kompliziert, eine Erzeugung eines Bildes mit 2-3 Punkten würde mir schon genügen, dazu vielleicht eine Möglichkeit reinzuzoomen oder wenn alles eine Einheitsgröße hat zu panen.

Vielen Dank, Werner

Hi,

naja machs nicht so kompliziert, eine Erzeugung eines Bildes
mit 2-3 Punkten würde mir schon genügen, dazu vielleicht eine
Möglichkeit reinzuzoomen oder wenn alles eine Einheitsgröße
hat zu panen.

die Daten werde ich ohnehin aus einer .mdb lesen, wie vile das sind, ist dann doch egal. Je mehr Punkte, um so übersichtlicher das Ergebnis, ich woll ja sehen, ob’s funktioniert. :wink: Ich schreib auch brav Kommentare an den Code. :wink:

Gruß, Rainer

Mahlzeit,

was für Fortgeschrittene dann, wenn du die „simplen“ Aufgaben schon beherrschst:

für eine schnelle Darstellung in unterschiedlichen Zoomstufen verwendet man sogenannte Generalisierungen. Der Grundgedanke ist, daß bei einer Generalkarte die Details ohnehin nicht zu sehen wären, wenn sie kleiner als die darstellbare Einheit (1 Pixel) sind. Dann werden sie auch gar nicht gezeichnet.

Dafür verwendet man mehrere Karten, die auf die jeweilige Zoomstufe angepaßt sind. Zoomt der Anwender hinein, wird die jeweils nächstbessere Karte dargestellt.

Ausgehend von der bestaufgelösten Darstellung, generiert man die schlechteren durch Generalisierung. Für Punkte (Gridlets) ist der Generalisierungsalgorithmus recht einfach: aus jeweils 4 Pixel rechts oben, rechts unten, links oben, links unten selektiere den Wert, der am häufigsten vorkommt; der setzt sich bei der nächsten Stufe durch.

Dabei kann man auch Nebenbedingungen definieren, z.B. daß ein roter Punkt (Gebäude) nie von einer grünen Umgebung (Land) überschrieben werden kann. Oder man rechnet aus den 4 Punkten den Farbmittelwert aus. Oder, oder… da gibt es viele Möglichkeiten.

Gruß

Sancho
der früher mal so Dinge für Geografische Informationssysteme programmiert hat

Hallo Werner,

stell Dich mal auf eine etwas längere Wartezeit ein. :wink:
Du hast es ja nicht so eilig, also kann ich das in Ruhe angehen. Mit einem Schnellschuß wird das nichts. Du bekommst eine Mail, wenn ich ein Zwischenergebnis habe.

Gruß, Rainer

Hi
Hi Sancho
hat Sancho dafür auch ein Einfaches Bsp??? programmiert und zur Hand.

Mfg Werner

Hi!

hat Sancho dafür auch ein Einfaches Bsp??? programmiert und
zur Hand.

Leidere nein, weil das Thema an sich nicht wenig umfangreich ist. Zudem habe ich seinerzeit in Smalltalk (bzw. Magik, ein Derivat) programmiert, was dir nicht allzusehr helfen dürfte.

Das Prinzip ist so zu verstehen: angenommen, deine Karte besteht aus 100x100 = 10.000 Punkten. Die erste Generalisierung besitzt ein Viertel davon, nämlich 50x50 = 2.500 Punkte; die zweite 25x25, usw.

Der Generalisierungsalgorithmus muß jeweils 4 Punkte zu einem zusammenfassen, d.h. nach einer Berechnungsvorschrift abbilden. Dabei gilt:

p'(x, y) = B{p(2x, 2y), p(2x+1, 2y), p(2x, 2y+1), p(2x+1, 2y+1)}

Die Berechnungsvorschrift B ist eine Funktion, die verschiedene Ausprägungen haben kann; auf jeden Fall nimmt sie 4 numerische Argumente und liefert einen numerischen Wert zurück. Beispiele:

function B1( p1, p2, p3, p4 as integer) as integer
rem mittelt einfach die Werte
begin
 B1 = (p1 + p2 + p3 + p4) / 4
end function

function B2( p1, p2, p3, p4 as integer) as integer
rem häufigster Wert gewinnt, p1 hat Priorität bei Gleichheit
rem keine Ahnung, wie das unter VB elegant zu lösen ist,
rem unter Smalltalk oder Java hätte man schönere Möglichkeiten :smile:
dim h as integer
begin
 h = p1
 if (p1 = p2) or (p1 = p3) or (p1 = p4) then
 h = p1
 else
 if (p2 = p3) or (p2 = p4) then
 h = p2
 else
 if (p3 = p4) then
 h = p3
 end if
 end if
 end if
 B2 = h 
end function

Mittels einer dieser Funktionen (oder anderer, wie gesagt gibt es mehrere mögliche Generalisierungsvorschriften) kann man in einer verschachtelten Schleife für alle p’(0…49, 0…49) den neuen Wert berechnen.

Einigermaßen klar?

Gruß

Sancho