Announcement

Collapse
No announcement yet.

Koordinatenanpassung in einem Panel in VB08

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Koordinatenanpassung in einem Panel in VB08

    Hallo zusammen, mich plagt folgendes Problem:
    Ich möchte in einem Panel der Größe 350 x 350 mehrere Kreise und Ellipsen ausgeben, dabei sind sowohl negative als auch positive Koordinaten zugelassen. Desweiteren sollen Werte von (-) Unendlich bis (+) Unendlich als Eingabe (theoretisch) möglich sein.
    Ich bräuchte also ein dynamisches Koordinatensystem innerhalb des Panels, das seine Größe an die eingegebenen Koordinaten anpasst, also z.B von -20 bis +60 bei Werteingaben zwischen -10 und 50 für die x Achse und natürlich das Gleiche auch für die y Achse.
    Ich habe schon eine ganze Zeit lang "gegoogelt" aber leider nichts verwertbares gefunden. Wenn mir jemand helfen könnte, wäre das sehr schön.
    Gruß, Stefan

  • #2
    Ich habe nicht so viel Ahnung von .NET, um zu wissen, ob es dafür schon Standardfunktionen gibt aber im Grundsatz kann ich Dir helfen:

    Mal zur Basis der graphischen Datenverarbeitung: Erstens halte immer Modelldaten und Darstellungsdaten getrennt, Du kriegst nur Ärger, wenn Du so etwas vermischt.

    Zweitens: Dynamische Koordinatensysteme sind üblicherweise dadurch realisierbar, dass man selbst Koordinatentransformationsfunktionen schreibt, d.h. Du hast dein "Darstellungskoordinatensystem" oder auch "Gerätekoordinaten" und Du hast die Koordinaten deines Modells, auch "Weltkoordinaten"

    Irgendwann einmal, d.h. wenn Du die Ausmaße des Koordinatensystem kennst, musst Du die Transformationsberechnung initialisieren indem Du z.B. einer Transformationsklasse xminD,xminW,xmaxD,xmaxW,yminD,yminW und ymaxD und ymaxW übergibst. (die entsprechende Größe D ist die Geräte (device) Koordinate und W ist die WeltKoordinate)

    Dann schreibst Du Dir eine Transformationsfunktion z.B. (nicht genau nehmen, es fehlen Fehlerbetrachtung, Rundungsprobleme, Clipping für Bereiche außerhalb der Zeichnungsfläche usw. Funktion dient nur zur Prinziperläuterung)
    Code:
    public function BerechneGeraetekoordinaten(byRef WC As Point) As Point
       Dim DC as new Point
       DC.x=xminD+(WC.x-xminW)*(xmaxD-xminD)/(xmaxW-xminW)
       DC.y=yminD+(WC.y-yminW)*(ymaxD-yminD)/(ymaxW-yminW)
       return DC
    End Function
    Die Umrechnung von Radien und Strecken läuft ebenso nach dem Dreisatz.

    Achte darauf, dass wenn die Koordinatenrichtung wechselt (also y von oben nach unten gezählt wird statt von unten nach oben) in der Initialisierung den "kleineren" Wert als ymaxD zu übergeben.

    Nun musst Du nur noch, wenn Du die Koordinaten Deines Kreises angeben willst statt z.B. DrawPoint(myPoint) DrawPoint(BerechneGeraetekoordinaten(myPoint)) schreiben.

    Gruß
    Martin Dietz

    PS: Wenn Du der Stefan Dietz von Osram in München bist, hättest Du mich als Deinen Bruder auch direkt fragen können
    Zuletzt editiert von M.Dietz; 02.07.2008, 12:29. Reason: kleiner Fehler im Programmcode: musste (WC.x-xminW) nehmen, nicht nur WC.x

    Comment


    • #3
      Was mir heute auf dem Weg zur Arbeit eingefallen ist: Wenn Du Kreise zeichnen willst, die X-Richtung aber in einem anderen Verhältnis verzerrst als die Y-Richtung, musst Du dran denken, dass aus den Kreisen dann Ellipsen werden.

      Ich wollte es nur der Vollständigkeit halber erwähnt haben.

      Gruß
      Martin

      Comment

      Working...
      X