Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Hilfe bei Grafik / ausschnitt und zoom (Weltkarte)

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
charly013



Anmeldungsdatum: 21.02.2023
Beiträge: 12
Wohnort: deutschland

BeitragVerfasst am: 21.02.2023, 19:14    Titel: Hilfe bei Grafik / ausschnitt und zoom (Weltkarte) Antworten mit Zitat

hallochen,

i bin in FB ein Frischling und bitte daher um ein bisschen hilfe

i moechte folgendes "realisieren":
i habe eine Weltkarte als grafik, zb 3200x1600, i bekomme dann 2 Punke als koordinaten, zb. Berlin und Ulm,
die entfernung und richtung kann ich schon berechnen, das funktioiert.
NUN moecht ich zb. Ulm als mittelpunkt annehmen und aus der Welkarte ein ausschnitt um Ulm bis Berlin
in zb 640 * 480 grafik Fenster darstellen und eine Linie von Ulm nach Berlin zeichnen.
WO die Punkte in der Grafik liegen kann i ja ueber den laengen- und breitengrad berechnen, nur wie ich den
Bereich Ulm-Berlin hochzoome bzw. bei anderen entfernungen runterzoome hab ich keinen ansatz (leider)
meine Vorstellung ist das die Weltkarte beim programmstart geladen wird und nach jeder eingabe von
2 Punkten wird der entsprechende "Bereich" gezoomt und dargestellt
i hoffe das ist verstaendlich genug erklaert und jemand kann mir den sogenannte stups in die richtige Richtung,

vielen Dank!

vLG
Charly

https://share-your-photo.com/40b14e4efc


[img]https://share-your-photo.com/40b14e4efc[/img]
_________________
Fliegen Fliegen hinter Fliegen dann fliegen Fliegen Fliegen nach
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 21.02.2023, 23:37    Titel: Antworten mit Zitat

Hallo charly013 und willkommen im Forum. lächeln

Die prinzipielle Vorgehensweise: Zunächst einmal kopierst du einen rechteckigen Bereich aus der Ursprungsgrafik heraus, in dem Ulm in der Mitte liegt und Berlin am Rand und der das gleiche Seitenverhältnis hat wie der gewünschte Ausschnitt (640:480 bzw. 1:0,75). Anschließend vergleichst du die Größe dieses Ausschnitts mit der Größe der gewünschten Grafik (also 640 x 480) und berechnest daraus einen Maßstab. Dann gehst du den Ausschnitt pixelweise durch, berechnest mithilfe des Maßstabs die Koordinate, die der Pixel in deinem Grafikfenster haben soll und kopierst ihn dort hin.

Unter diesem einfachen Verfahren wird die Bildschärfe relativ stark leiden, aber du hast zumindest erst einmal ein Ergebnis.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
charly013



Anmeldungsdatum: 21.02.2023
Beiträge: 12
Wohnort: deutschland

BeitragVerfasst am: 22.02.2023, 10:26    Titel: Antworten mit Zitat

Hallo Grindstone,

danke f. die Antw., zur weiteren erklaerung, es geht hier um nix hochgenaues, es ist nur zur "Anschauung", als Grundidee hab i mir gedacht i hab eine Weltkarte 3600x1800 das ist dann 1 Pixel pro 0.1 grad.
es muss auch nicht genau nur 'der' ausschnitt im Fenster gezeigt werden wenn da noch 10% mehr gezeigt werden ist kein Problem, eben so mit der Genauigkeit, wenn das mal 5 km daneben ist macht das auch nichts
i hab schon das ein oder andere in Basic gemacht, aber noch gar nix mit Grafik, daher steh i im Moment so quasi im dunkeln, haste event. so ne grobe Richtung oder ein Beispiel was i mir an befehlen ansehen kann/muss?, danke

VlG
Charly
_________________
Fliegen Fliegen hinter Fliegen dann fliegen Fliegen Fliegen nach
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 22.02.2023, 12:58    Titel: Antworten mit Zitat

Zum Skalieren habe ich früher ganz gern MULTIPUT verwendet - das ist schnell und unkompliziert, allerdings mit ziemlichen Einschränkungen bezüglich optischer "Schönheit". Wenn ich mich recht erinnere, fuktioniert das aber nur mit der 32bit-Funktion des Compilers; und ob es mit dem aktuellen Compiler überhaupt noch klappt, weiß ich ehrlich gesagt gar nicht.

Professionellere Ergebnisse bekommst du mit Bibliotheken wie FreeImage. Da habe auch einen Codeschnipsel herumliegen, wenn es dich interessiert. Dazu muss aber die passende lib.a-Datei in den FreeBASIC-Installationsordner kopiert werden - für die 32-Bit-Version des Compilers habe ich sie vorliegen.
Die Handhabung ist etwas komplizierter als z. B. Multiput, weil FreeBASIC ein anderes Bildformat verwendet als FreeImage. D. h. am besten hält man das Originalbild als FreeImage-Bild bereit, skalliert es entsprechend und wandelt das skallierte Bild in ein FB.Image um.

Code:
#include once "fbgfx.bi"
#include once "FreeImage.bi"
declare sub mmxcopy cdecl alias "fb_hMemCpyMMX"(byval dest as any ptr, byval src as any ptr, byval size as integer)

function FIBitmap2FBImage(byval dib as FIBITMAP ptr) as FB.Image ptr
  dim as uinteger bpp, breit, hoch, pitch
  FreeImage_FlipVertical(dib)
  dib = FreeImage_ConvertTo32Bits(dib)
  breit = FreeImage_GetWidth(dib)
  hoch = FreeImage_GetHeight(dib)
  dim as any ptr image = ImageCreate(breit, hoch), ximage = image
  dim as uinteger ptr buffer = image
  dim as ubyte ptr FIpixel = FreeImage_GetBits(dib)

  bpp = buffer[1]
  if bpp <> 4 then return NULL
  pitch = buffer[4]
  ximage += 32
  for i as integer = 1 to hoch
    mmxcopy ximage, FIpixel, breit * bpp
    FIpixel+= (breit * bpp)
    ximage += pitch
  next
  return image
end function

screenres 800, 600, 32
'PNG als FreeImage-Bild laden
dim as FIBITMAP ptr FIimg = FreeImage_Load(FIF_PNG, "logo.png")
'hochskaliern
dim as FIBITMAP ptr FIscaled = FreeImage_Rescale(FIimg, 800, 800, FILTER_BOX)
'in FB.Image umwandeln
dim as FB.Image ptr fbImg = FIBitmap2FBImage(FIscaled)
put (250, 150), fbImg, (50, 50)-(350, 350)

' aufraeumen
FreeImage_Unload FIimg
FreeImage_Unload FIscaled
imagedestroy fbImg

sleep


Schnipselpaket: https://users.freebasic-portal.de/nemored/skalieren.zip
libfreeImage.dll.a muss nach {FreeBASIC-Installationsordner}\lib\win32
z. B. C:\Program Files (x86)\FreeBASIC\lib\win32
und läuft, wie gesagt, mit der 32-Bit-Version. Für 64-Bit gibt es sicher ebenfalls eine passende Bibliothek.

Beim Testen ist mir übrigens aufgefallen, dass das Programm bestimmte Kombinationen von Pixel-Angaben nicht mag. Da steckt bestimmt ein System dahinter, das mit korrekten Vielfachen zu tun hat, aber da habe ich nicht weiter nachgeforscht.

De Weiteren: Mein Beispiel ist ziemlich grob, weil ich das gesamte FreeImage-Bild in ein FB.Image umwandle, obwohl man auch gezielt den gewünschten Ausschnitt herausgreifen könnte. Dazu komme ich aber im Moment nicht.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 23.02.2023, 11:31    Titel: Antworten mit Zitat

charly013 hat Folgendes geschrieben:
i hab schon das ein oder andere in Basic gemacht, aber noch gar nix mit Grafik, daher steh i im Moment so quasi im dunkeln, haste event. so ne grobe Richtung oder ein Beispiel was i mir an befehlen ansehen kann/muss?

Wenn du in FB überhaupt noch nie etwas mit Grafik gemacht hast, solltest du dir als erstes den Befehl SCREENRES ansehen, ohne den läuft grafikmäßig gar nichts.

Und um einen Überblick zu bekommen, empfehle ich die Tutorials zum Thema "Grafikprogrammierung mit FreeBasic".

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 23.02.2023, 19:19    Titel: Antworten mit Zitat

Habe ich mal wieder die Hälfte der Frage nicht gelesen ...
Hier noch die Übersicht zu den Grafik-Befehlen.

Aus dem Abschnitt Grafikbildschirm brauchst du, wie grindstone schon schrieb, auf jeden Fall mal SCREENRES; die anderen Befehle in diesem Abschnitt sind eher für Fortgeschrittene und erst einmal noch nicht so wichtig.

Die Abschnitte Farbe und zeichnen sind interessant, wenn das Programm selbst "händisch" Grafik erzeugen soll. PALETTE würde ich aber ehrlich gesagt beiseite schieben - nimm die Farbtiefe 32 (siehe SCREENRES) und nutze den 32-Bit-Farbraum, fertig. happy
COLOR braucht man immer mal wieder. Die anderen Befehle sind situationsabhängig; die würde ich mir dann anschauen, wenn ich sie brauchen kann.

Die Abschnitte Methoden und Image sind dann wichtig, wenn du mit Grafikpuffern arbeiten willst, also z. B. Bilder von der Festplatte einlesen (standardmäßig geht nur Windows-BMP), Bildschirmausschnitte kopieren, speichern usw. Da dann vor allem IMAGECREATE, IMAGEDESTROY, GET, PUT, PSET (ist bei mir zumindest die Standardmethode) und des Weiteren BLOAD und BSAVE - die sind auf der Seite nicht aufgeführt, weil es keine Grafikbefehle im eigentlichen Sinn sind.

Das wäre mal so meine Einschätzung für einen Einstieg.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz