Seite 1 von 1

Fehler in Berrechnung

Verfasst: Di Mär 23, 2010 9:22 pm
von cloidnerux
Also, ich will berechnen ob ein beliebiger Punkt p auf dem Bogen einer Ellipse liegt.
Ich habe dazu den Anfang der Zeichenmethode der Ellipse Extrahiert und in die Funktion eingefügt, damit ich die gleichen Berrechnungen des Zentrums, Radiuses und Stauchungsfaktors habe.
Jetzt wollte ich einfach ein Vektor zwischen dem Zentrum und P aufspannen und mir über den Winkel des Vektors die Länge errechnen, die der Vektor haben müsste, um auf der Bogenlinie zu liegen.
Doch wenn ich den Code teste, wird ein Punkt p als True markiert, der überhaupt nicht auf der Ellipse liegt, sondern darüber, das geschieht aber nur bei Punkten über der Krümmung, also nicht nahe den äußersten Punkten.
Hier der Code:

Code: Alles auswählen

        
public override bool IsPointOnObject(PointF p)
{
    PointF center = new PointF(BorderRect.X + (BorderRect.Width / 2),
                                            BorderRect.Y - (BorderRect.Height / 2));
    double radius = BorderRect.Height / 2;
    double scaleQuotient = BorderRect.Width / BorderRect.Height;
    VectorF v = new VectorF(center, p);
    double length = System.Math.Sqrt(
           System.Math.Pow(System.Math.Cos(v.GetRad()) * radius * scaleQuotient, 2) + 
           System.Math.Pow(System.Math.Sin(v.GetRad()) * radius, 2)
           );
    if ((v.GetLength() >= (length - (double)Intolerance)) && (v.GetLength() <= (length + (double)Intolerance)))
    {
            return true;
    }
    return false;
}
VectorF stellt wieder die Vektor-Klasse dar, die ich schon häufiger erwähnt habe.
Intolerance ist ein Klassenmember, das eine Bedingte Intoleranz angibt.
BorderRect ist das Rechteck das die Ellipse umschließt.

PS: Ich weiß das der Titel nicht ganz Treffend ist, bin aber gerade ein wenig Müde.

Re: Fehler in Berrechnung

Verfasst: Di Mär 23, 2010 9:58 pm
von Kerli
Auf den ersten Blick sehe ich da einmal keinen Fehler, aber wenn die Ellipse eh in erster Hauptlage liegt, was spricht dann gegen ein Einsetzen in x^2/a^2 + y^2/b^2 = 1? Das ist zusätzlich noch deutlich weniger Rechenaufwendig, da du eigentlich nur zwei Quadrate berechnen musst...

Re: Fehler in Berrechnung

Verfasst: Mi Mär 24, 2010 6:07 pm
von cloidnerux
Auf den ersten Blick sehe ich da einmal keinen Fehler, aber wenn die Ellipse eh in erster Hauptlage liegt, was spricht dann gegen ein Einsetzen in x^2/a^2 + y^2/b^2 = 1? Das ist zusätzlich noch deutlich weniger Rechenaufwendig, da du eigentlich nur zwei Quadrate berechnen musst...
Habe ich gleich mal Implementiert, stoße dabei aber auf folgendes Problem:
Da ich die Punktprüfung zum Fangen des Mauszeigers brauche, ist diese natürlich von der Skalierung und Mausposition abhänig. Da jetzt aber, z.B für den Nutzer, der Mauszeiger über der Ellipse liegt, muss das noch nicht heißen, das die Umrechnung der absoluten Mauskoordinaten in die Relativen Koordinaten des Programms einen Punkt erzeugt, der auf der Ellipse liegt. Um das zu vereinfachen müsste ich wie in meinem ersten Code eine Intoleranz einbauen, was aber bei der Rechnung problematisch ist, da dadruch auch Koordinaten, die Definitiv nicht auf der Ellipse liegen, erfasst werden.
Hier noch mein Code:

Code: Alles auswählen

        public override bool IsPointOnObject(PointF p)
        {
            double a, b;
            a = BorderRect.Width / 2;
            b = BorderRect.Height / 2;
            double result = (((p.X * p.X) / (a * a)) + ((p.Y * p.Y) / (b * b)));
            if (result >= 0.99 && result <= 1.01)
            {
                return true;
            }
            return false;
        }
Ich hoffe auf Hilfe, Anrgeungen oder andere Konzepte.

MfG cloidnerux.

Re: Fehler in Berrechnung

Verfasst: Do Mär 25, 2010 5:17 pm
von cloidnerux
So, Problem gelöst.
Fehler war, das ich die Absoluten Koordinaten des Punktes für die Rechung genutz hatte, aber die Relativen Koordianten zum Mittelpunkt der Ellispe benötige.
Mit diesem wissen, konnte ich die Richitgen Werte für X und Y bekommen und aus einem anderen Forum die Information nutzen, das bei einem Wert < 1 der Punkt innerhalb der Ellipse liegt. So konnte ich dann auch die Intoleranz mit einbeziehen.
Danke für die Hilfe Kerli.