Fehler in Berrechnung

Die Programmiersprache C# und Programmierung im .NET Framework/Mono
Antworten
Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Fehler in Berrechnung

Beitrag von cloidnerux » Di Mär 23, 2010 9:22 pm

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Fehler in Berrechnung

Beitrag von Kerli » Di Mär 23, 2010 9:58 pm

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...
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Fehler in Berrechnung

Beitrag von cloidnerux » Mi Mär 24, 2010 6:07 pm

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Fehler in Berrechnung

Beitrag von cloidnerux » Do Mär 25, 2010 5:17 pm

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten