MiniBCC #24 - Lief oder Rerelief
Übersicht

![]() |
HolzchopfMeisterpackerBetreff: MiniBCC #24 - Lief oder Rerelief |
![]() Antworten mit Zitat ![]() |
---|---|---|
Sicher wartet ihr gespannt auf den neuen MiniBCC. Also, los geht's:
MiniBCC #24 - Lief oder Rerelief In der Kartographie wird bei einem Relief die dritte Dimension oft vereinfacht als Schattenbild dargestellt. Solche Schattenbilder (oder -karten) werden aus 3D-Datensätzen generiert. Und ihr macht jetzt genau das umgekehrte: aus einem gegebenen Schattenbild generiert ihr einen möglichen 3D-Datensatz in Form einer Höhenkarte. Aufgabe Schreibt ein einfaches Programm, dass aus diesem Bild eine Heightmap macht. Die Ausgabe erfolgt aus Speicherplatz-Gründen nur auf dem Bildschirm. Quelle: map.geo.admin.ch Lichtquelle: Azimut 135°, Elevation 45° Damit ihr das Bild überhaupt laden dürft, kriegt ihr das Bonus-Element Grafik ![]() Insgesamt 256KiB Speicher für Grafiken, wobei die Vorlage schon 132KiB weg frisst ![]() Ihr dürft selbstverständlich auch andere Schattenkarten verwenden, die kleiner sind. Die Vorlage ist nur als Muster zu verstehen ![]() Code-Limit 6KiB Termin Sonntag, 07.12.2014, 23:59 Startschuss *peng* Jetzt PS: Ich weiss, dass Lief/Rerelief Wortkreationen und eine Heightmap lediglich eine andere Form der Darstellung von Reliefs sind. Aber hey, die Wortkreation bot sich halt an ![]() Edit Ihr dürft auch dieses Bild verwenden. Bei dem sind die Ränder auf einem Level, was die Rechnung einfacher macht. |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
- Zuletzt bearbeitet von Holzchopf am Do, Dez 25, 2014 20:36, insgesamt 2-mal bearbeitet
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ist das denn überhaupt ganz so möglich? Ich mein, ich habe eine Idee wie es geht, wenn es rund um die Karte einen Rand mit Höhe 0 geben würde. | ||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, ich sage, es ist möglich. Aber ich sage nicht, dass du nicht am Rand anfangen musst, um das herauszufinden ![]() |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
Klar, man kann eine Lösung schreiben, die genau für dieses Bild funktioniert, indem man den Fluss als Basis nimmt. Ist das die Aufgabe?
Eine generelle Lösung für jedes Bild wäre ziemlich schwierig. |
||
Gewinner der 6. und der 68. BlitzCodeCompo |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eine generelle Lösung ist tricky. Eine generelle Lösung, die auch möglichst genau abbildet, sogar sehr. Aber das Ergebnis wird ja wohl auch von niemandem auf Richtigkeit geprüft. Es gibt verschiedene/ verschieden-schwierige Möglichkeiten, die gescannten Linien in der Höhe so zu einander anzupassen, dass die generierte "Fläche" in etwa realistisch herauskommt.
Wer ohne diese Tricks weiterkommen will, verwendet dieses Bild: Quelle: map.geo.admin.ch MfG |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es gab zwar keine Einsendungen, aber ich weiss, dass es zumindest ein paar Leuten den Kopf zerbrochen hat. Allen voran DAK, der mich zu miniBCC-Laufzeiten per PN angeschrieben hatte. Auf sein OK hin veröffentliche ich hier mal seinen Kommentar, Zitat: Ich hab da noch mal drüber nachgedacht, und ich denke, mehr als eine ungefähre Abschätzung ist eigentlich gar nicht möglich.
Mal zuerst, ich möchte nicht deinen BCC schlechtreden, da die Idee sehr gut ist. So ein Tool wäre sehr nützlich und sowas programmieren finde ich sehr spannend. Ich denke aber, dass die Aufgabe nicht lösbar ist. Die Reliefkarte ist ja im Endeffekt eine Lightmap, und die Heightmap eine Bumpmap. Man muss hier also das Bumpmapping reversieren. Um von einer Bumpmap auf eine Lightmap zu kommen muss man zwei Schritte machen, die beide verlustbehaftet sind, nämlich muss man die Bumpmap in eine Normalmap umwandeln, und die dann eine Lightmap. Die Normalmap ist eine Umformung der ersten Ableitung der Bumpmap. Hierbei gehen die originalen Höheninformationen verloren, es bleiben nur mehr die Winkel jedes Texels übrig. Das lässt sich noch korrigieren, wenn es rund um das Bild einen Ramen mit Höhe 0 gibt (wie in deinem 2. Bild). Von der Normalmap zur Lightmap kommt man so: (für jedes Texel) lightmap[x,y] = dot(normalmap[x,y], lightvector) Leider ist das Dot-Product auch verlustbehaftet. Das sieht ja so aus: dot(v, u) = vx*ux + vy*uy + vz*uz Das heißt, wenn der Lightvector bekannt ist, und das Ergebnis des Dot-Products (steht ja in der Lightmap), die drei Koordinaten der Normalmap aber nicht, dann gibt es hier ein Problem: man muss 3 Variablen ein einer Gleichung finden, was nicht möglich ist. Man braucht immer mindestens so viele Gleichungen in einem Gleichungssystem wie Variablen die man lösen möchte. So gibt es einen ganzen "Ring" an möglichen Lösungsvektoren für jede dieser Gleichungen. So ist es bei einer Lichtquelle mit den Werte Azimut 135° und Elevation 45° nicht sicher, ob z.B. der Azimut des Normalvektors 130° oder 140° beträgt, oder die Elevation 40° oder 50° beträgt, da das Dot-Product nur die Abweichung der zwei Vektoren widerspiegelt. Problematischer wird es dann noch wenn es sich um eine Kombination der Abweichungen handelt, also wo sowohl Azimut und Elevation sich von der Lichtquelle unterscheiden (was leider fast immer der Fall sein wird). Hast du eine Idee wie man da noch drum rum kommen kann? Grüße, Dakkaron Worauf ich übrigens noch antwortete, Zitat: DAK hat Folgendes geschrieben:
mehr als eine ungefähre Abschätzung ist eigentlich gar nicht möglich.
Das ist korrekt. Manch ein Praktiker oder Mathematiker mag mir da sicher widersprechen, aber wenn's um meine Meinung geht, dann sieht die so aus, dass es nicht eindeutig rekonstruierbar ist. Ist ja aber auch nicht gefragt. Es reicht eine mögliche Rekonstruktion. Die Aufgabenstellung lässt es eigentlich sogar zu, den Rand als gleichhoch zu betrachten und dann in eine Richtung zu scannen. Der Mensch wird zwar einen Fehler erkennen, weil so auf eindeutig (=scheinbar) flachen Flächen Stufen entstehen. Selbstverständlich kann man unzählige Filter entwerfen, um solche Fehler zu kaschieren, aber zwingend notwendig ist das nicht. Die Idee, das als miniBCC-Aufgabe zu stellen, kam damals übrigens nicht aus dem Nichts ![]() ![]() Hier erst einmal mein "Zwischenstand", BlitzMax: [AUSKLAPPEN] SuperStrict Die weiterführende Idee war es
Ich hab's bis jetzt noch nicht umgesetzt ![]() Auf jeden Fall dachte ich mir: "Hey, das geht doch sicher auch anders. Man kann bestimmt auch das Bild aus der Lichtrichtung scannen." Und schwupps war die Idee da, das euch machen zu lassen ![]() ![]() Wie dem auch sei - der nächste miniBCC kommt bestimmt irgendwann ![]() mfG Holzchopf |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
MULTIPOST! ![]() ![]() Jetzt hört mal zu ihr Blitzer! Der Thread wäre schon fast auf Seite zwei in der Foren-Übersicht gelandet... Aber ich habe euch nicht vergessen! Mein Ansatz (oben beschrieben) konnte ich leider nicht ganz zu Ende umsetzen... Das zeug schwingt auf und ich hatte einfach nicht mehr den Nerv, das zu ende zu führen. Stattdessen habe ich mir was anderes überlegt: Im Prinzip handelt es sich um eine Faltung, die, je nach Steilheit des Reliefs (hier wird angenommen, dass heller als 180 = Pixel schräg rechts unten ist höher und dunkler als 180 = Pixel schräg rechts unten ist tiefer), die Pixel schräg rechts unten oder schräg links darüber erhöht oder abgesenkt werden. Die Resultate lassen sich sehen... Ich führe die Faltung im Moment noch mehrfach aus um das Ergebnis mit jedem Durchgang etwas zu verfeinern - besser wäre es wahrlich, den Faltungskern von Anfang an einfach direkt richtig zu gestalten und nur einmal zu falten! Aber je grösser der Faltungskern, umso länger die Rechenzeit, deshalb belasse ich das so. Hier gibt's das Ergebnis mit BMax-Source und .exe Die Faltung wird nur auf Leertastenanschlag erneut ausgeführt. Es wird schnell langsam ( ![]() Und ja, das war mein 5. Versuch. Ich geb's ja zu, die Aufgabe war überrissen. Beim nächsten Mal gebe ich mir mehr Mühe, eine umsetzbare Aufgabe zu stellen. MfG Holzchopf |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group