Punkt in Fläche? < Lin. Algebra/Vektor < Oberstufe < Schule < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 14:56 Sa 03.12.2005 | Autor: | unique24 |
Hallo
Ich habe folgendes Problem:
Ich habe eine x und y Koordinate (sowol ins + als auch ins -)
Ich möchte eine Fläche bestimmen darin mit, sagen wir mal 3 Punkten:
P1 = x:-45,y:2
P2 = x:5,y:57
P3 = x:59,y:2
Nun möchte ich herausfinden, ob der Punkt (a = x:30,y:-13) sich innerhalb dieser oben genannten Fläche (Dreieck) befindet.
Wie ist sowas zu lösen? Es wäre schön, wenn ich jegliche Fläche bestimmen kann, in der dann a sein kann oder nicht.
Vielen Dank
Hannes
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
|
|
|
|
Du kannst als erstes mit Hilfe der gegebenen drei Punkte die Ebenengleichung aufstellen und dann prüfen, ob der Punkt in dieser Ebene liegt. Dazu schaust du, ob die Paramter jeweils identisch sind.
Jennifer
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 20:59 Sa 03.12.2005 | Autor: | Fugre |
> Hallo
>
> Ich habe folgendes Problem:
>
> Ich habe eine x und y Koordinate (sowol ins + als auch ins
> -)
>
> Ich möchte eine Fläche bestimmen darin mit, sagen wir mal 3
> Punkten:
> P1 = x:-45,y:2
> P2 = x:5,y:57
> P3 = x:59,y:2
>
> Nun möchte ich herausfinden, ob der Punkt (a = x:30,y:-13)
> sich innerhalb dieser oben genannten Fläche (Dreieck)
> befindet.
>
> Wie ist sowas zu lösen? Es wäre schön, wenn ich jegliche
> Fläche bestimmen kann, in der dann a sein kann oder nicht.
>
> Vielen Dank
>
> Hannes
>
> Ich habe diese Frage in keinem Forum auf anderen
> Internetseiten gestellt.
Hallo Unique,
wenn ich dich richtig verstehe, hast du ein Dreieck, welches gegeben
ist durch die Punkte [mm] $P_1,P_2, P_3$ [/mm] und willst nun wissen, ob ein
bestimmter Punkt, in diesem Fall $A$, in ihm liegt. Um das zu überprüfen,
solltest du erst einmal die "beschränkte" Ebene des Dreiecks errechnen.
Das gleicht dem Aufstellen einer Ebene durch 3 Punkte.
Hier:
[mm] $E:\vec x=\vec p_1 [/mm] + [mm] \lambda (\vec p_2 [/mm] - [mm] \vec p_1) [/mm] + [mm] \mu (\vec p_3 [/mm] - [mm] \vec p_1)$
[/mm]
Jetzt musst du nur eine Besonderheit der Ebene beachten, knobel bitte erst mal
selbst.
Wenn du nicht mit Vektoren arbeiten willst oder sollst, kannst du die Aufgabe
natürlich auch lösen, indem du die Geraden bildest, die durch die Punkte verlaufen,
und dann die Lage des Punktes $A$ relativ zu diesen Geraden bestimmst.
Liebe Grüße
Nicolas
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 08:59 So 04.12.2005 | Autor: | unique24 |
Hallo
Danke für die Antworten. Ich möchte diese Berechnungen in ein Visual Basic Programm einbauen.
Was wäre aber wenn man eine Fläche mit 5-6 Punkten hat (P1,P2,P3;P4,P5)?
Gibts da eine Standart Formel zur Berechnung, ob ein Punkt innerhalb der Fläche ist?
Ich muss auch sagen, das ich zwar im Rechnerischen Abbung (Zimmerei) recht gut klar kam, aber diese Formeln übersteigen etwas mein Verständnis für Mathematik
Könnt ihr mir das so schreiben (mit Zwischenschritten?), das ich das auch Verstehe? :-(
Wäre echt nett von Euch.
Danke
Hannes
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 09:11 Mo 05.12.2005 | Autor: | Denny22 |
Hallo,
am besten Löst du dein Problem, indem du den Abstand zwischen Punkt und Ebene via Hessesche Normalform bestimmst. D.h. du musst deine Ebene in die Form
[mm] a_1x_1 [/mm] + [mm] a_2x_2 [/mm] + [mm] a_3x_3 [/mm] = b
umformen.
Hast du dies getan, so berechnest du den Abstand zwischen dem Punkt u= [mm] \vektor{u_1 \\ u_2 \\ u_3} [/mm] und der Ebene mit folgender Formel:
[mm] \frac{1}{\wurzel{a_1^2 + a_2^2 + a_3^2}} [/mm] * [mm] (a_1u_1 [/mm] + [mm] a_2u_2 [/mm] + [mm] a_3u_3 [/mm] - b)
und das ganze in Betrag. Ist das Ergebnis gleich 0, so ist der Punkt in deiner Fläche bzw. Ebene. Ist das Ergebnis ungleich null, so ist der Punkt nicht in der Fläche bzw. Ebene.
In Visual C++ gehst du folgende Schritte durch:
1. du legst die Vektoren bzw. Arrays an für a und u sowie eine Variable b und eine Variable abstand:
double a[3],u[3],b,abstand;
2. Berechnest du nun den Abstand:
double a_sum=0;
for (i=1;i<3;i++)
{
a_sum=a[i]*a[i]+a_sum;
}
double au=0;
for (i=1;i<3;i++=
{
au=a[i]*u[i]+au;
}
abstand = (au-b)/sqrt(a_sum);
3. Ausgabe, ob Punkt in ebene oder nicht
if(abstand==0)
cout << "Punkt in Ebene";
else
cout << "Punkt nicht in Ebene";
Ich hoffe, dass ich dir weiterhelfen konnte.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 08:11 Di 06.12.2005 | Autor: | unique24 |
Hallo Denny
Vielen dank. Leider programmiere ich in vb.net. Aber ich werde versuchen jemand zu finden, der den Code transformiert.
Wie würde es denn bei mehreren Ecken aussehen? Wenn ich zum Beispiel ein Polygon mit x Ecken habe?
Kann man deine Formel da einfach erweitern, oder ist dies nur für Dreiecke?
Vielen Dank
Hannes
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 09:01 Mi 07.12.2005 | Autor: | Denny22 |
Hallo,
vertu Dich nicht. Was ich Dir geschickt habe ist der Quelltext um den Abstand einer Ebene (d.h. ohne Eckpunkte) zu einem Punkt zu bestimmen und somit abzulesen, ob der Punkt in der Ebene liegt (ohne Eckpunkte !!!)
Wenn Du ein Polygon hast, dann kannst Du selbstverständlich auch eine Ebene konstruieren, so dass das gesamte Polygon darin liegt.
Das was ich Dir zuvor geschrieben habe, gibt den Abstand von einem Punkt zu einer Ebene im [mm] \IR^3 [/mm] an. Wie gesagt: Diese Ebene besitze jedoch keine Eckpunkte.
Der Quelltext vom letzten Mal lässt sich jedoch schnell umformen. Wichtig ist das Du dir darüber bewusst wirst, das sich die Veränderlichen nicht beliebig aus [mm] \IR [/mm] wählen lassen, d.h. diese [mm] x_1, x_2 [/mm] (bzw. [mm] \lambda [/mm] , [mm] \mu [/mm] ) dürfen nur aus einem vordefinierten Bereich kommen. Viele Worte wenig Sinn:
Machs am besten so:
Du berechnest zuvor wieder den Abstand von dem Punkt und der Ebene.
Falls der Abstand ungleich 0, so bist Du fertig und der Punkt kann nicht darin liegen.
Falls der Abstand gleich 0, so musst du eine weitere Bedingung überprüfen. Denn Du weißt jetzt, dass der Punkt in der Ebene liegt, aber noch nicht, ob er sich z.B.: in Deinem Polygonmit bestimmten Eckpunkten befindet. Dazu kannst Du z.B.: deine Eckpunktkoordinaten betrachten z.B.:
[mm] \vektor{1 \\ 0 \\ 0} [/mm] , [mm] \vektor{0 \\ 1 \\ 0} [/mm] und [mm] \vektor{0 \\ 0 \\ 1}
[/mm]
(das wäre jetzt ein Dreieck)
Die Ebene dazu wäre:
[mm] \vektor{x \\ y \\ z} [/mm] = [mm] \vektor{1 \\ 0 \\ 0} [/mm] + [mm] \mu [/mm] *( [mm] \vektor{0 \\ 1 \\ 0}-\vektor{1 \\ 0 \\ 0}) [/mm] + [mm] \lambda [/mm] * [mm] (\vektor{0 \\ 0 \\ 1}-\vektor{1 \\ 0 \\ 0})
[/mm]
Den Punkt [mm] \vektor{1 \\ 0 \\ 0} [/mm] erhälst Du, wenn [mm] \mu [/mm] =0 und [mm] \lambda [/mm] = 0
Den Punkt [mm] \vektor{0 \\ 1 \\ 0} [/mm] erhälst Du, wenn [mm] \mu [/mm] =1 und [mm] \lambda [/mm] = 0
Den Punkt [mm] \vektor{0 \\ 0 \\ 1} [/mm] erhälst Du, wenn [mm] \mu [/mm] =0 und [mm] \lambda [/mm] = 1
D.h. [mm] \mu [/mm] und [mm] \lambda [/mm] müssen zwischen 0 und 1 sein. Gilt das für deinen vorgegebenen Punkt so liegt er in der Ebene in deinem definierten Dreieck.
Habe ich nun einen weiteren Punkt z.B.:
[mm] \vektor{0 \\ -1 \\ 2} [/mm] (den erhält man für [mm] \mu [/mm] =-1 und [mm] \lambda [/mm] =2)
Dann erweiterst Du Deine Bereiche, so dass:
[mm] \lambda [/mm] zwischen 0 und 2 sein darf
und
[mm] \mu [/mm] zwischen -1 und 1 sein darf.
Der Quelltext war überings für C++. Wenn Du Microsoft Visual [mm] C\C++ [/mm] hast geht es. Mit Visual Basic habe ich nichts gemacht.
Ciao
|
|
|
|