Schnittpunkt zweier Geraden < Lin. Algebra/Vektor < Oberstufe < Schule < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 20:50 Fr 19.09.2008 | Autor: | davidz |
Aufgabe | Gegeben sind:
- belibig viele Punkte im R²
- einen Winkel k (Kamerarichtung).
Edit: Der Wert ist in meinem Programm ein Wert zwischen 0 und bzw. 0-360°.
- eine Sichtweite: 60°Edit: , 30° links und 30° rechts vom Kamerawinkel.
Edit: Die Sichtweite wird sich (je nach Monitor/Auflösung/Proportionen) später noch ändern; Sie muss nur als Variable mit einfliessen. Ich habe es aber so gemeint: - je 30° nach links und rechts.
Gesucht ist eine Position P, die so liegt, dass im Blickfeld der Kamera alle Objekte sichtbar sind.
Da die Objekte nicht still im Raum stehen, wird eine allgemeine Lösungsformel benötigt. |
Hintergrund:
Ich habe in einen 3D-Raum Objekte, die von einer Kamera erfasst werden sollen. Die Ausrichtung der Kamera soll nicht verändert werden, sondern nur die Position auf der Ebene. (Höhenangaben werden komplett ignoriert).
Lösungsansatz:
1. Mittelpunkt M aller Objekte (hier die Punkte Objekt1 und Objekt2) auf der Ebene bestimmen.
2. Mit diesem Mittelpunkt M und der Richtung der Kamera eine Gerade g bestimmen, auf der die Kamera Positioniert werden soll.
3. Für jedes Objekt bestimmen, an welchen Punkt auf g das Objekt in den Blickpunkt kommt. (hier Punkt S1 und S2)
4. Gefundenen Schnittpunkt mit der größten Distanz zu M als Kameraposition nehmen(Hier S2).
Skizze:[Dateianhang nicht öffentlich]
Zuerst habe ich den Mittelpunkt zwischen den beiden Punkten Objekt1 und Objekt2 ermittelt.
[mm] \overrightarrow{M} [/mm] = [mm] \underline{\overline{A} + \overline{B}}
[/mm]
2
Mit dem Richtungswinkel der Kamera und dem Mittelpunkt habe ich die Gerade g erzeugt:
Steigung der Geraden anhand der Richtung bestimmen:
[mm] \overrightarrow{K}=\underline{tan(k)}
[/mm]
1
[mm] g\mapsto\overrightarrow{M}+d*\overrightarrow{K}
[/mm]
Jetzt kommt der Teil, bei dem es Hakt:
Suche des Schnittpunktes von g und o
Ich habe nun zwei Geraden:
[mm] x=\overrightarrow{P1}+r*\overrightarrow{o}
[/mm]
[mm] x=\overrightarrow{P2}+s*\overrightarrow{p}
[/mm]
Allg. Gleichsetzungsformel:
[mm] x=\overrightarrow{P1}+r*\overrightarrow{o}=\overrightarrow{P2}+s*\overrightarrow{p}
[/mm]
Wegen der Vektoren ergeben sich nun zwei Gleichungen [mm] (\overrightarrow{P1} [/mm] = [mm] \vektor{P1x \\ P1y}):
[/mm]
I. P2x + s * px = P1x + r * ox
II. P2y + s * py = P1y + r * oy
I. nach r aufglöst:
r = [mm] \underline{P2x + s * px - P1x}
[/mm]
ox
dies in I. eingesetzt ergibt:
P2x + s * px = P1x [mm] +\underline{P2x + s * px - P1x} [/mm] * oy
ox
und nach s auflösen:
s [mm] =\underline{ P1y * ox + P2x * oy - P1x * oy * ox}
[/mm]
py * ox - px * oy
Die Steigungsvektoren o und p haben als oy bzw. py immer den Wert 1, da die Steigung durch [mm] \vektor{tan(a) \\ 1} [/mm] erzeugt wurde.
Edit: a ist hier nur ein belibiger Winkel. Dies soll verdeutlichen, dass die 'untere' zahl = 1 ist, und damit in der folgenden Gleichung weggekürzt werden kann.
s [mm] =\underline{ P1y * ox + P2x - P1x * ox}
[/mm]
ox - px
s ist nun der Wert, der, wenn in die Grundform eingesetzt mein Ergebnis liefern sollte.
s in den lnken Teil von I. und II.
S1 = [mm] \vektor{Sx \\ Sy}
[/mm]
Sx = P2x + s * px
Sy = P2y + s * py
Diese Koordinaten sollten nun auf dem Punkt S1 (siehe Skize) liegen. tun sie aber nicht.
Was mach ich Falsch ?
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt
Dateianhänge: Anhang Nr. 1 (Typ: jpg) [nicht öffentlich]
|
|
|
|
Hallo David !
zuerst einmal: Gratulation zu der interessanten
Fragestellung !
Ich habe einmal alles bis zu den Gleichungsumformungen
durchgesehen und da meine Anmerkungen gemacht.
Es lohnt sich nicht, Details von Gleichungen zu prüfen,
wenn die Gleichungen selber noch nicht ganz klar sind.
LG
> Gegeben sind:
> - belibig viele Punkte im R²
> - einen Winkel k (Kamerarichtung).
wie ist dieser Winkel genau definiert ?
> - eine Sichtweite: 60°
(gesamter Blickfeldwinkel; je 30° links und rechts
von der Blickrichtung zum Mittelpunkt)
> Gesucht ist eine Position P, die so liegt, dass im
> Blickfeld der Kamera alle Objekte sichtbar sind.
>
> Da die Objekte nicht still im Raum stehen, wird eine
> allgemeine Lösungsformel benötigt.
> Hintergrund:
> Ich habe in einen 3D-Raum Objekte, die von einer Kamera
> erfasst werden sollen. Die Ausrichtung der Kamera soll
> nicht verändert werden, sondern nur die Position auf der
> Ebene. (Höhenangaben werden komplett ignoriert).
also nimmst du an, dass es nicht möglich ist oder
nichts ausmacht, dass einzelne Objekte oben oder
unten aus dem Blickfeld verschwinden (?)
> Lösungsansatz:
> 1. Mittelpunkt M aller Objekte (hier die Punkte Objekt1
> und Objekt2) auf der Ebene bestimmen.
> 2. Mit diesem Mittelpunkt M und der Richtung der Kamera
> eine Gerade g bestimmen, auf der die Kamera Positioniert
> werden soll.
> 3. Für jedes Objekt bestimmen, an welchen Punkt auf k
sollte wohl heissen: "Punkt auf g"
> das Objekt in den Blickpunkt kommt. (hier Punkt S1 und S3)
Punkt S1 und S2 !
> 4. Gefundenen Schnittpunkt mit der größten Distanz zu M
> als Kameraposition nehmen(Hier S2).
> Skizze:[Dateianhang nicht öffentlich]
>
>
> Zuerst habe ich den Mittelpunkt zwischen den beiden Punkten
> Objekt1 und Objekt2 ermittelt.
>
> [mm]\overrightarrow{M}[/mm] = [mm]\underline{\overline{A} + \overline{B}}[/mm]
> 2
>
> Mit dem Richtungswinkel der Kamera und dem Mittelpunkt habe
> ich die Gerade g erzeugt:
>
> Steigung der Geraden anhand der Richtung bestimmen:
> [mm]\overrightarrow{K}=\underline{tan(a)}[/mm]
> 1
??? Das sollte wohl ein Vektor sein
Und was ist hier a ??
Oben hast du von einem Kamerawinkel k geschrieben
Es ist wichtig, dass du dich um die exakte
Definition der benützten Winkel kümmerst !
> [mm]g\mapsto\overrightarrow{M}+d*\overrightarrow{K}[/mm]
>
>
> Jetzt kommt der Teil, bei dem es Hakt:
> Suche des Schnittpunktes von g und o
>
> Ich habe nun zwei Geraden:
> [mm]x=\overrightarrow{P1}+r*\overrightarrow{o}[/mm]
> [mm]x=\overrightarrow{P2}+s*\overrightarrow{p}[/mm]
Auch hier: wie definierst du die Richtungsvektoren genau ?
Und wie berechnest du sie ?
>
> Allg. Gleichsetzungsformel:
>
> [mm]x=\overrightarrow{P1}+r*\overrightarrow{o}=\overrightarrow{P2}+s*\overrightarrow{p}[/mm]
>
> Wegen der Vektoren ergeben sich nun zwei Gleichungen
> [mm](\overrightarrow{P1}[/mm] = [mm]\vektor{P1x \\ P1y}):[/mm]
>
> I. P2x + s * px = P1x + r * ox
> II. P2y + s * py = P1y + r * oy
>
> I. nach r aufglöst:
> r = [mm]\underline{P2x + s * px - P1x}[/mm]
> ox
>
>
> dies in I. eingesetzt ergibt:
> P2x + s * px = P1x [mm]+\underline{P2x + s * px - P1x}[/mm] * oy
> ox
> und nach s auflösen:
>
> s [mm]=\underline{ P1y * ox + P2x * oy - P1x * oy * ox}[/mm]
>
> py * ox - px * oy
>
> Die Steigungsvektoren o und p haben als oy bzw. py immer
> den Wert 1, da die Steigung durch [mm]\vektor{tan(a) \\ 1}[/mm]
> erzeugt wurde.
>
> s [mm]=\underline{ P1y * ox + P2x - P1x * ox}[/mm]
> ox - px
>
> s ist nun der Wert, der, wenn in die Grundform eingesetzt
> mein Ergebnis liefern sollte.
>
> s in den lnken Teil von I. und II.
>
> S1 = [mm]\vektor{Sx \\ Sy}[/mm]
> Sx = P2x + s * px
> Sy = P2y + s * py
>
> Diese Koordinaten sollten nun auf dem Punkt S1 (siehe
> Skize) liegen. tun sie aber nicht.
>
> Was mach ich Falsch ?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 01:31 Sa 20.09.2008 | Autor: | davidz |
Danke für deine Antwort.
Ich werde mich bemühen, die offenen Fragen gut zu beantworten.
>- einen Winkel k (Kamerarichtung).
>
> wie ist dieser Winkel genau definiert ?
>
Der Wert ist in meinem Programm ein Wert zwischen 0 und [mm] 2\pi [/mm] bzw. 0-360°.
> - eine Sichtweite: 60°
>
> (gesamter Blickfeldwinkel; je 30° links und rechts
> von der Blickrichtung zum Mittelpunkt)
>
Die Sichtweite wird sich (je nach Monitor/Auflösung/Proportionen) später noch ändern; Sie muss nur als Variable mit einfliessen. Ich habe es aber genau so gemeint, wie du sbeschrieben - je 30° nach links und rechts.
>> 3. Für jedes Objekt bestimmen, an welchen Punkt auf k
>
> sollte wohl heissen: "Punkt auf g"
>
...
>> das Objekt in den Blickpunkt kommt. (hier Punkt S1 und S3)
>
> Punkt S1 und S2 !
...
>
> ??? Das sollte wohl ein Vektor sein
> Und was ist hier a ??
> Oben hast du von einem Kamerawinkel k geschrieben
> Es ist wichtig, dass du dich um die exakte
> Definition der benützten Winkel kümmerst !
Dreimal genau! - ich werde versuchen das im Text zu korrigieren.
>
>Auch hier: wie definierst du die Richtungsvektoren genau ?
> Und wie berechnest du sie ?
>
Die Richtungsvektoren habe ich durch addition bzw. subtraktion von 30° zu dem Kamerawinkel k berechnet.
Dieser wird variabel vom Benutzer eingestellt (z.B. durch Mausbewegung)
Wenn die Kamera auf zB. 90° ausgerichtet ist, sind die Richtungsvektoren 60° und 120°.
Es gilt wohl noch zu prüfen, od der Punkt rechts oder links von der Kamera aus gesehen liegt.
In der SKizze bedeutet es:
Wenn die Kamera auf Punkt S1 plaziert werden würde, dann wäre das Objekt 1(mittelpunkt) genau am Bildrand, weil die Kamera ja genau 30° links von diesem Objekt den Mittelpunkt hat.
Ich hoffe damit sind die Unklarheiten beseitigt.
|
|
|
|
|
Guten Morgen David,
danke für die Präzisierungen. Mit k bezeichnest du
also den Richtungswinkel in der x-y-Ebene, in der
üblichen Weise von der x-Achse aus gemessen,
für die Richtung von der Kamera zum Mittelpunkt M
der Objekte (oder gerade umgekehrt ? ...)
Ich würde einmal vorschlagen: Richtung, in welche
die Kamera "blickt", also Richtung von der Kamera
zur abzubildenden Szene.
Damit du (besonders bei vielen Punkten) zu einfachen
Rechnungen kommst und dich nicht mit all den
Geradengleichungen herumschlagen musst, möchte
ich dir folgendes Vorgehen empfehlen:
Der Richtungsvektor [mm] \vec{k} [/mm] der Kamerablickrichtung
ist
[mm] \vec{k}=\vektor{cos(k)\\sin(k)}
[/mm]
Der Richtungsvektor vom Objektiv zum rechten
Bildfeldrand hat den Richtungswinkel [mm] k-\varepsilon
[/mm]
[mm] (\varepsilon=halber [/mm] Öffnungswinkel der Kamera)
Der nach rechts aussen zeigende Normalenvektor
zu dieser Begrenzungsgeraden [mm] b_1 [/mm] hat den Richtungs-
winkel [mm] k-\varepsilon-\bruch{\pi}{2}.
[/mm]
Der Einheitsvektor mit dieser Richtung ist
[mm] \vec{n}_1=\vektor{n_1_x\\n_1_y}=\vektor{cos(k-\varepsilon-\bruch{\pi}{2})\\sin(k-\varepsilon-\bruch{\pi}{2})}=\vektor{sin(k-\varepsilon)\\-cos(k-\varepsilon)} [/mm]
Nun denken wir uns durch jedes Objekt eine Parallele
zu [mm] b_1. [/mm] Alle diese Geraden haben Gleichungen der
Form [mm] n_1_x*x+n_1_y*y=const [/mm] . Dabei bedeutet die
Konstante auf der rechten Seite den Abstand der Geraden
vom Koordinatenursprung, und zwar (von der Kamera
aus gesehen) nach rechts gemessen. Nun sucht man
dasjenige Objekt aus, für welches diese Konstante am
grössten ist (nicht grösster Betrag !). Die entspre-
chende Gerade geht durch die gesuchte Kameraposition.
Nun macht man dasselbe nochmals mit der linken
Begrenzungsgeraden [mm] b_2. [/mm] Ihr Normalenvektor [mm] \vec{n}_2 [/mm] hat den
Richtungswinkel [mm] k+\varepsilon+\bruch{\pi}{2}, [/mm] also haben wir
[mm] \vec{n}_2=\vektor{n_2_x\\n_2_y}=\vektor{cos(k+\varepsilon+\bruch{\pi}{2})\\sin(k+\varepsilon+\bruch{\pi}{2})}=\vektor{-sin(k+\varepsilon)\\cos(k+\varepsilon)} [/mm]
Der Rest geht ganz analog. Wieder sucht man das
Objekt mit dem grössten Wert von [mm] n_2_x*x+n_2_y*y.
[/mm]
Der Schnittpunkt beider Geraden bestimmt die Position
der Kamera.
LG
Bemerkungen:
1.) Zuerst dachte ich auch, dass man zuerst einen
"Mittelpunkt" der Szene bestimmen müsse. Erst
nachdem ich ein (deutlich komplizierteres) "Rezept"
für die Lokalisation der Kamera geschrieben hatte,
merkte ich, dass es auch einfacher geht...
2.) Die Idee hinter dem oben dargestellten Konzept
zum Aufstellen der Geradengleichungen ist in der
"Hesseschen Normalform" zu finden.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 13:07 Sa 20.09.2008 | Autor: | davidz |
Vielen lieben Danke !!!
Ich habe deine Lösung nun soweit umgesetzt.
Zwar brauchte mein ungeschulter Kopf, etwas um alles nachvollziehen zu können und in mein Programm zu transferieren, aber hat dann doch geklappt.
Ich habe auch erkant, worin der unterschid zu meinem Ansatz liegt und dass ein Mittelpunkt als Focus nicht nur unnötig, sondern sogar falsch ist.
Ich kann inzwischen variabel viele Objekte prüfen und es werden bis zu zwei Objekte ausgewählt, die die 'Extrema' bilden(linker und rechter Kamerarand).
|
|
|
|
|
sehr gut !
jetzt hast du dir das Wochenende verdient ...
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:23 Sa 20.09.2008 | Autor: | davidz |
Aufgabe | Gesucht ist eine Allgemeine Formel, um den Schnittpunkt [mm] S=\vektor{Sx \\ Sy} [/mm] von zwei Geraden zu erhalten. |
Nachdem nun die richtigen Objekte gewählt sind, brauch ich ja 'nur noch' den SChnittpunkt.
Mein Ansatz funktioniert leider nicht - wo mach ich was falsch ?
Ich versuche mal, alles gleich richtig zu definieren.
Gegeben sei:
Ein Winkel a = [mm] \alpha [/mm] (Kamerablickrichtung)
und ein zweiter Winkel b = [mm] \beta [/mm] (halber Blickwinkel der Kamera)
I. G1 = [mm] \overrightarrow{P} [/mm] + r * [mm] \overrightarrow{p}
[/mm]
P = [mm] \vektor{Px \\ Py}
[/mm]
p = [mm] \vektor{cos(a-b) \\ sin(a-b)}
[/mm]
II. G2 = [mm] \overrightarrow{Q} [/mm] + s * [mm] \overrightarrow{q}
[/mm]
Q = [mm] \vektor{Qx \\ Qy}
[/mm]
q = [mm] \vektor{cos(a+b) \\ sin(a+b)}
[/mm]
Durch die Gleichsetzung erhalte ich:
[mm] \overrightarrow{Q} [/mm] + s * [mm] \overrightarrow{q} [/mm] = [mm] \overrightarrow{P} [/mm] + r * [mm] \overrightarrow{p}
[/mm]
Da es zweidimensinale Vektoren sind, werden daraus folgende Gleichungen Abgeleitet:
III. Sx = Qx + s * qx = Px * r * px
IV. Sy = Qy + s * qy = Py * r * py
III wird nach s aufgelöst:
Qx + s * qx = Px * r * px
[mm] \Rightarrow [/mm] s= [mm] \bruch{Px + r * px - Qx}{qx}
[/mm]
s wird nun in IV eingesetzt, um nach r auflösen zu können.
Qy + s * qy = Py * r * py
[mm] \Rightarrow [/mm] Qy + [mm] \bruch{Px + r * px - Qx}[b]{qx}[/b] [/mm] * qy = Py + r * py | *qx[/i]
[mm] \Rightarrow [/mm] Qy * qx + (Px + r * px - Qx)* qy = Py * qx + r * py * qx |klammer lösen
[mm] \Rightarrow [/mm] Qy * qx + Px*qy + r * px*qy - Qx*qy = Py * qx + r * py * qx |-r*px*qy
[mm] \Rightarrow [/mm] Qy * qx + Px*qy - Qx*qy = Py * qx + r * py * qx - r * px*qy |-Py*qx
[mm] \Rightarrow [/mm] Qy * qx + Px*qy - Qx*qy - Py * qx = r * py * qx - r * px*qy |r ausklammern
[mm] \Rightarrow [/mm] Qy * qx + Px*qy - Qx*qy - Py * qx = r * (py * qx - px*qy) |* [mm] \bruch{1}{py * qx - px*qy}
[/mm]
[mm] \Rightarrow \bruch{Qy * qx + Px*qy - Qx*qy - Py * qx }{py * qx - px*qy} [/mm] = r
[mm] \Rightarrow [/mm] r = [mm] \bruch{Qy * qx + Px*qy - Qx*qy - Py * qx }{py * qx - px*qy}
[/mm]
dies nun in einen Teil von III. und IV. einsetzen, im einen Punkt/ Vektor zu bekommen(=Schnitpunkt?)
III. Sx = Px * [mm] \bruch{Qy * qx + Px*qy - Qx*qy - Py * qx }{py * qx - px*qy} [/mm] * px
IV. Sy = Py * [mm] \bruch{Qy * qx + Px*qy - Qx*qy - Py * qx }{py * qx - px*qy}* [/mm] py
Wenn ich nun aber diese Formeln benutze erhalte ich eine falsche Position.
[Dateianhang nicht öffentlich]
Zu sehen sind:
grüne Gerade : linker Blickwinkel
rote Gerade : rechter Blickwinkel
blaue Gerade: Kamerablickwinkel
türkiesfarbenes Quadrat: errechnete Position
schwarze Rechtecke : Testpositionen der Objekte mit 'Entfernungskennwerten' zu den jeweiligen Geraden
liebe Grüße
David
Dateianhänge: Anhang Nr. 1 (Typ: jpg) [nicht öffentlich]
|
|
|
|
|
Hallo David,
offenbar hast du dein Wochenende doch noch nicht
angetreten.
Wir hatten ja vorher schon Koordinatengleichungen
der beiden begrenzenden Geraden [mm] b_1 [/mm] und [mm] b_2:
[/mm]
[mm] b_1: n_{1x}*x+n_{1y}*y=C_1
[/mm]
[mm] b_2: n_{2x}*x+n_{2y}*y=C_2
[/mm]
[mm] (C_1 [/mm] und [mm] C_2 [/mm] sind die jeweiligen Maximalwerte,
die beim Einsetzen der Objektpunkte in den
linken Seiten entstanden sind. Diese solltest
du speichern)
Um den Schnittpunkt zu bestimmen, ist dieses
Gleichungssystem zu lösen. Mit der Determinan-
tenmethode komme ich z.B. auf:
[mm] x=\bruch{C_1*n_{2y}-C_2*n_{1y}}{n_{1x}*n_{2y}-n_{2x}*n_{1y}}
[/mm]
LG
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 08:52 So 21.09.2008 | Autor: | davidz |
Guten Morgen !
Aaaahsooo !
Na, dann werd ich mir heute mitteg mal Zeit nehmen, und diese Art der Schnittpunktermittlung nachvollziehen.
Ich danke dir schonmal für deine Geduld und Mühe.
Nach Bearbetung werd ich noch ein Feedback geben, wie es funktioniert hat.
Danke sehr - ein großartiges Forum!
David
|
|
|
|