C# Vektorrechnung/Positionierung

PapstRatze

Lt. Junior Grade
Registriert
Aug. 2008
Beiträge
436
saarland(3).png
Eigentlich kein wirkliches Programmierproblem, hoffe es passt aber trotzdem hier rein :)

Auf dem angehängten Bild ist abgebildet das Saarland. Für die Erstellung werden Daten von OpenStreetMap verwendet, es handelt sich also um eine Ansammlung von Punkten.

Alle Punkte werden in ein Bild gemalt. Damit eine durchgängige Linie entsteht wollte ich nun die Punkte verbinden. Die Verbindungen sind im Bild rot. Einige schießen leider aber übers Ziel hinaus.

Für die Berechnung habe ich den letzten Punkt als Vektor und der Punkt der als nächstes verarbeitet werden soll. Aus der Subtraktion der Beiden erstelle ich einen Richtungsvektor. Diese multipliziere ich von 0.01 bis 0.99 und Rechne den Vektor des letzten Punktes dazu. Dadurch entstehen neue Punkte, die ich wie die anderen noch skaliere und dann in das Bild schreibe.

Code:
foreach (var item in points)
    {
        Vector last = new Vector(0, 0), now = new Vector(0, 0);
        foreach (Point po in item)
        {
            now = new Vector(po.X, po.Y);
            if (last.X != 0 && last != now)
            {
                Vector dir = last - now;
                for (double i = 0.01; i < 1; i+= 0.01)
                {
                    Vector inuse2 = new Vector((last.X + dir.X * i)*scale-minX*scale, (last.Y + dir.Y * i)*scale*-1-minY*scale);
                    bt.SetPixel((int)(inuse2.X + 10), (int)(inuse2.Y + 10), roundColor);
                }
            }
            Vector inuse = new Vector(po.X*scale-minX*scale,po.Y*scale*-1-minY*scale);
            bt.SetPixel((int)(inuse.X+10), (int)(inuse.Y+10), choosenColor);
            last = now;
        }
    }

Anmerkung: Aktuell steht das Saarland Kopf, was daraus resultiert, dass geografisch gesehen 0 am Äquator ist, während beim Bild 0 oben ist.
 
Zuletzt bearbeitet: (Bild vergessen :))
Täusche ich mich, oder berechnest du dir Richtung falsch rum?
Zeile 9 müsste doch statt
Code:
Vector dir = last - now;
folgendermaßen aussehen:
Code:
Vector dir = now - last;

oder?
 
Zuletzt bearbeitet:
Mit etwas Geschick kannst du die Pixel direkt setzen und musst nicht 100mal (darunter je nach Abstand mehrfach dieselben) Pixel setzen.
 
Öhm, nein.
Du kannst einfach das Verhältnis der Richtungsvektorkomponenten ausrechnen und dementsprechend x Schritte nach linksrechts gehen bis du einen y Schritt nach oben/unten machen kannst.
 
Zurück
Oben