--- title: "K.A.R.L" date: 2021-04-01 cover: ./images/Indicatrices_of_Distortion.png license: "CC-BY-SA:4.0" featured: true toc: true icon: /projects/karl/favicon.png links: [ ["live", "https://max-richter.dev/karl"], ["git", "https://git.max-richter.dev/max/karl"], ] --- import Crosswalk from "./images/crosswalk.jpg" import CrosswalkMask from "./images/crosswalk_mask.png" import Image from "@components/Image.astro" import Distorion from "./images/Indicatrices_of_Distortion.png" import ImageGallery from "@components/ImageGallery.svelte" *[Header by Justin Kunimune - Own work, CC BY-SA 4.0](https://commons.wikimedia.org/w/index.php?curid=66467577*)* > K.A.R.L ist eine WebApp die einem dabei hilft 360Grad Panoramas in Sektionen einzuteilen, (Himmel, Boden, Bäume usw...) und dann den Anteil der einzelnen Sektionen am Gesamtbild festzustellen. # Einleitung Das Projekt ist aus der Zusammenarbeit mit zwei Freunden entstanden. Der eine steckt gerade mitten in der Konzeptionsphase seiner Bachelorarbeit (Geographie), die sich mit der Auswirkung von Vegetation auf das Stadtklima beschäftigt. Dazu hat er an verschiedenen Orten in Köln Albedo Messungen vorgenommen, also quasi "wieviel Licht kommt vom Himmel, und wieviel davon wird vom Boden reflektiert". Um diese Messungen in den richtigen Kontext zu setzen hat er von jedem Messort 360 Panoramas angelegt, diese sehen ungefähr so aus: Image of a crosswalk Dazu brauchte er jetzt Angaben wieviel Prozent der Sicht zum Beispiel Vegetation, Himmel und Boden sind. Um das zu messen hat er in Gimp per Hand eine Segmentationsmap erstellt, eine Segmentationsmap sieht etwas so aus: Segmentationsmap # Problemstellung Wenn wir jetzt einfach naiv hingehen und die Pixel der einzelnen Farben zählen und daraus eine prozentuale Verteilung machen kriegen wir das klassische Problem mit der Verzerrung das die Menschheit schon seit Jahrhunderten mit Karten hat. Undzwar lassen sich Kugeln nur sehr ungern zwei dimensional darstellen, dabei kommt es immer zu Verzerrungen, wie folgendes Bild visualisiert. Indicatrices of Distortion Zum Glück passiert diese Verzerrung nur in der Breite, wir brauchen also eine Formel die uns für die Höhe eines Pixels eine Gewichtung gibt um diese Verzerrung auszugleichen. Nach vielen Versuchen sind wir bei dieser Formel gelandet: ```javascript /* height: height of the image in pixels calibrationFactor: 1.333, somehow this works, dont ask why, we dont either y: y position of the pixel */ const pixelValue = Math.cos( (((360 / height ** 2) * y ** 2 + (-360 / height) * y + 90) / 360) * (2 + calibrationFaktor) * Math.PI ) ``` Diese Formel ist eigentlich dafür gedacht für einen bestimmten Breitengrad den Abstand zwischen zwei Längengraden zu berechnen, aber für unsere Zwecke funktioniert sie auch sehr gut. Hier noch einiger der ersten Versuch in Desmos (fantastisches Tool btw):