Autor Beitrag
darkdester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Mo 22.09.08 14:33 
Hiho

folgendes Prob:

hab mir ein Koordinatensystem(XYZ) zeichnen lassen mit canvas. Gezeichnet wird ja über X und Y... sprich Höhe und Breite.
Das Problem ist jetzt wenn ich mit Vektoren rechne oder Punkte im 3D raum habe muss ich diese mit ihren 3D Punkten irgendwie in 2D umwandeln. Sprich ich muss XYZ mit XY zeichnen.

Hat jemand ne Idee wie ich das einfach lösen könnte? Möchte nicht erst in OpenGL nen 3D Raum coden müssen.

danke im Vorraus

mfg

darkdester
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Mo 22.09.08 14:37 
Das Stichwort lautet Projektion.

AXMD
darkdester Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Mo 22.09.08 14:41 
ja I know aber

a) hab ich versucht mich da schlau zu machen aber es ist gescheitert
b) haben 2 Freunde (beide Mathestudenten) versucht mein Problem zu lösen und sind auch gescheitert *g*

desweiteren ist ne hilfreiche Antwort nicht nur 1 Wort ;)
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Mo 22.09.08 14:44 
user profile icondarkdester hat folgendes geschrieben:
a) hab ich versucht mich da schlau zu machen aber es ist gescheitert

Woran ist es gescheitert? Wenn du uns nicht sagst, wo genau das Problem liegt, wird dir niemand helfen können.

user profile icondarkdester hat folgendes geschrieben:
desweiteren ist ne hilfreiche Antwort nicht nur 1 Wort ;)

Du hattest nicht gesagt, dass du bereits nach Projektion gesucht hast; demnach wäre das der erste Ansatzpunkt gewesen.

AXMD

OT:
user profile icondarkdester hat folgendes geschrieben:
b) haben 2 Freunde (beide Mathestudenten) versucht mein Problem zu lösen und sind auch gescheitert *g*

Nun, dann sollten sie vielleicht besser Botanik studieren :lol:
darkdester Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Mo 22.09.08 14:47 
das problem ist das ich nicht weiß wie ich z(3te Raumkoordinate) verrechnen soll

die anderen probleme fallen mir grad nicht ein *g* aber das war jedenfalls das hauptproblem
ace1905
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 73



BeitragVerfasst: Mo 22.09.08 15:04 
hi
also nehmen wir mal an jede deiner einheiten auf der x2 und x3 achse sind 50 pixel groß...
da ja die x1 achse nur halb so lange einheiten hat beträgt ihre länge also 25 pixel. ich denk mal das hast du ja shcon bei deinem koodinatensystem mit einbezogen.
nehmen wir jetzt den punkt (1,1,1).
um ihn zu zeichnen musst du eine eiheit in jede richtung gehen.
x1 --> du gehst 25 pixel runter und 25 nach links
x2 --> du gehst 50 pixel nach rechts
x3 --> du gehst 50 pixel hoch
wenn du dir das jetzt 2 - dimensional vorstellst bedeutet das, dass du in der x ebene 50 nach recht un wieder 25 nach links gehst --> also gehst du insgesamt nur 25 :-P
in der y-Ebene gehst du 50 pixel nach oben und wieder 25 nach unten --> du hast also nur 25 nach oben
ich hoff du verstehst das prinzip :lol:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
// (1,1,1)
x := Trunc(Image1.width div 2-25*11*50);    // weil ja dein koordinatensystem in der Mitte des Images 0 ist 
                                                  // teilst du die Länge durch 2
y := Trunc(Image1.height div 2+25*11*50);
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Mo 22.09.08 15:12 
Hi,

Du hast Punkte im 3D-Raum und projizierst diese auf eine 2D-Ebene =). Ein Blick ist ein Strahl, also eine Halbgerade. Gegeben sind für die Projektion eines Punktes P der Punkt P selbst, sowie der Blickpunkt Q des Beobachters.

Diese zwei Punkte legen die Gerade fest; die Projektion ist nun der Schnittpunkt dieser Gerade mit deiner Projektionsfläche.

Nun lässt sich das Problem auf 2D übertragen: Du hast eine Strecke S sowie zwei Punkte P und Q(der Beobachter, dafür wählst du einfach einen beliebigen Fixpunkt im negativen z-Bereich vor der Strecke) und suchst den Schnittpunkt der Gerade durch diese zwei Punkte mit der Strecke S.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure Project2D(x, y, z: Integer);
begin
  result.X := Schnittpunkt(Gerade(TPoint(x, z), TPoint(-10)), Gerade(Y=0));
  result.Y := Schnitt(Gerade((y, z), (-10)), Gerade(y=0));
end;


Dann kann ich ja jetzt die letzten zwei Jahre Schule überspringen und direkt mit dem Studium anfangen 8)

mfG,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
ene
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: Mo 22.09.08 15:17 
Ich hab auch noch ne Lösungsmöglichkeit. Mach eine Höhenkarte daraus, wenn du den z-Wert auch zur Veranschaulichung brauchst. Dann ist z der Farbwert des Pixels.

_________________
Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 22.09.08 15:54 
Wenn du Lust hast, kannst du dir mal diesen Thread von mir anschauen. Ich habe erstmal ohne fremde Hilfe versucht, das Problem 3D zu 2D zu lösen - und bin auf diese Lösungsformel gekommen:

user profile iconYogu hat folgendes geschrieben:
Je weiter ein Punkt enternt ist, desto näher neigt er zur Betrachtermitte. Ein Punkt, der genau vor der Nase (oder besser vor den Augen) schwebt, dehnt sich über die Gesamte Anzeigefläche aus. Weiter hinten sind die Punkte enger zusammen, deshalb erscheinen die Objekte dort kleiner.


Im verlinkten Thread findest du ein paar Methoden, die richtig zusammengesetzt 3D-Linien anzeigen können. Das ganze basiert zwar auf Canvas.Pixels (:oops:), aber da es doublebuffered ist, läuft das Ganze doch ganz flüssig.

(Ich hoffe mal, dass ich dir dadurch jetzt nichts falsches beibringe. Vielleicht gibt es bessere Wege.)
darkdester Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 100



BeitragVerfasst: Mo 22.09.08 16:28 
danke leute :)

hab jetzt nochmal rumprobiert und jetzt scheints zu funktionieren..

nur einwas ist komisch...: mein diagonalengerade (45° wie im schulhefter) verläuft korrekt, allerdings wenn ich die koordinaten mit wurzel2 verrechne sind die punkte etwas zu weit links und wenn ich mit 1/2 mach dann siehts aus als würde er auf 22,5° laufen...

denk ich falsch oder was läuft da falsch *g*?