Java Vector3D und Parallele

MiMi

Erfahrenes Mitglied
Hi,

da dies nicht wirklich ins 3D forum gehoert habe ich es einfach mal hier geoeffnet. Falls es doch woanders hingehoert bitte verschieben ^^

Es geht draum das ich eine Gerade zeichne durch 2 angegebene Punkte (vektor3D). Nun moechte ich das eine parrallele zu dieser Geraden angezeigt wird mit nem bestimmten Abstand. Wie laesst sich dies am besten loesen? Da ja schon das berechnen einer parallenen Geraden im 2D ziemlich kompliziert ist.
Momentan zeichne ich einfach eine zweite Gerade mit den werten der ersten geraden und erhoehe einfach den X wert. Jedoch funktioniert das nur wenn die Gerade waagerecht ist.

Vielen Dank im Vorraus.


EDIT: Also ich hatte mir ueberlegt ob man nicht die Geradengleichung bestimmen koennte und dann 2 normalenvektoren, die jeweils durch die Punkte laufen die auch schon die gerade angeben. haben diese beide die gleiche Laenge koennt ich mit diesen beiden dann auch direkt die Parallele Gerade zeichnen. (siehe Zeichnung)
 

Anhänge

  • parallele.png
    parallele.png
    2,5 KB · Aufrufe: 19
Zuletzt bearbeitet:
Da kann Dir schon geholfen werden, so kompliziert ist das nicht. Jedoch musst Du etwas genauer werden: eine Gerade in 3D hat auch bei gegebenem Abstand unendlich viele Parallelen.
 
Hi,
Momentan zeichne ich einfach eine zweite Gerade mit den werten der ersten geraden und erhoehe einfach den X wert. Jedoch funktioniert das nur wenn die Gerade waagerecht ist.
Also Du kannst doch einfach 2 Punkte irgendwie verschieben, hauptsache auf identische weise.
Also P1 und P2 seien die Punkte deiner zuerst gezeichneten Geraden
und P1' und P2' seien die Punkte durch die Deine zweite Gerade läuft

P1' sei dann (x1'= x1+x'; y1'= y1+ y'; z1'=z1+ z' )
P2' sei dann (x2'= x2+x'; y2'= y2+ y'; z2'=z1+ z' )

Insofern verstehe ich nicht warum das bei deinem Verschiben in X nur bei waagerechten Geraden funktionieren sollte :confused:

EDIT: Also ich hatte mir ueberlegt ob man nicht die Geradengleichung bestimmen koennte und dann 2 normalenvektoren, die jeweils durch die Punkte laufen die auch schon die gerade angeben. haben diese beide die gleiche Laenge koennt ich mit diesen beiden dann auch direkt die Parallele Gerade zeichnen. (siehe Zeichnung)
Hmm Geraden sind doch eigetnlich unendlich lang also alle Geraden müssten strenggenommen gleich lang sein, oder irre ich mich da?
 
Insofern verstehe ich nicht warum das bei deinem Verschiben in X nur bei waagerechten Geraden funktionieren sollte :confused:
Weil nur in diesem trivialen Fall der Abstand dann der gewünschte ist. Wird eine Parallele zu einer Geraden mit 45° Steigung durch Verschiebung um den Vektor (1,1) erzeugt, ist deren Abstand nicht 1.

Hmm Geraden sind doch eigetnlich unendlich lang also alle Geraden müssten strenggenommen gleich lang sein, oder irre ich mich da?
Wir verwenden hier etwas unsauber die beiden Begriffe Geraden und Vektoren. Ich nehme an, es geht um Vektoren und die haben eine Länge.
 
Also der Z Wert spielt keine Rolle, da ich die Parallele "nur" im 2D zeichnen werde da dies schon kompliziert genug ist ^^.

Also ich meine eine Strecke zwischen 2 Punkten die definiert sind durch 2 Vektoren.

Und mir wurde gesagt ich koennte die Parallele einfach horizontal zeichnen und diese dann mit einem transform in die richtige Position bringen. Nur so richtig deutlich ist mir das noch nicht
 
Hi MiMi,

keine Angst, ist nicht kompliziert. Ich mach's nicht über eine Transformation, sondern mittels guter alter analytischer Geometrie ;) Schau Dir meine Demo an, ist alles gut dokumentiert. Die mathematischen Grundlagen nennen sich Normalvektor und Einheitsvektor, kennst Du in jeder Formelsammlung nachschlagen.

Java:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;

public class DemoPanel extends javax.swing.JPanel{
 
    public DemoPanel() {
        super();
    }
    
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        
        // erster Punkt der Geraden       
        int x1 = 50;
        int y1 = 100;
        // zweiter Punkt der Geraden
        int x2 = 300;
        int y2 = 200;
        
        // Abstand der Parallelen
        int distance = 40;
        
        // erste Linie zeichnen
        g.setColor(Color.BLACK);
        g.drawLine(x1, y1, x2, y2);
        
        // Normalvektor berechnen
        // einfach in 2D: x und y vertauschen und ein Vorzeichen ändern
        double nx = -(y1-y2);
        double ny = x1-x2;
        // Länge des Normalvektors auf gewünschte Distanz bringen
        double nl = Math.sqrt(nx*nx+ny*ny);
        nx = nx/nl * distance; 
        ny = ny/nl * distance;        
                
        // zu beiden Punkten nun den Normalvektor addieren, um parallel zu verschieben
        int px1 = (int)Math.round(x1 + nx);
        int py1 = (int)Math.round(y1 + ny);
        int px2 = (int)Math.round(x2 + nx);
        int py2 = (int)Math.round(y2 + ny);        

        // Parallele zeichnen        
        g.setColor(Color.RED);
        g.drawLine(px1, py1, px2, py2);        

        // Normalvektoren für Demo einzeichnen
        g.setColor(Color.GREEN);
        g.drawLine(x1, y1, px1, py1);          
        g.drawLine(x2, y2, px2, py2);                
    }
 
    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setSize(400, 350);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(new DemoPanel());
        f.setVisible(true);
    }
    
}
 
Zuletzt bearbeitet:
Hey super. Ja ich hatte das schonmal in der Schule mit Normalenvektoren etc. Aber wenn man es nie danach nutzt verdraengt man das ganz schnell wieder ^^
Ich werds spaeter mal testen und berichten :D

Edit: Normalenrechnung hatte ich bei google genug gefunden, aber nirgendwie wie ich die normale an einem bestimmten Punkt errechne. Bzw brauchte ich immer eine Geradegleichung dazu. Und dann wurde noch die Steigung der Geraden mit einbezogen etc. Aber wenn das wirklich so einfach ist wie du jetzt dort gezeigt hast versteh ich nicht warum die das so kompliziert erklaert ahben ^^ Mal sehen
 
Zuletzt bearbeitet:
Hm also wenn ich es auf dem Papier durchrechne stimmt es. Aber beim zeichnen geht was schief. Aber danke erstmal ich muss mich mal durch den Code wurschteln :D

Edit: Also zeichnen tut er es jetzt korrekt aber nur an bestimmten Stellen. Aber nur bei grad 45-90 (Wenn man davon ausgeht das 0 grad bei 0 Uhr auf ner Uhr ist und dann im Uhrzeigersinn rechnet) und bei 235-270. Beim rest sieht es sehr merkwuerdig aus. Entweder ist die Parallele total verschoben oder in der anderen Geraden drin

Edit2: Anhaenge mal entfernt
 
Zuletzt bearbeitet:
Mein Code funktioniert unabhängig von irgendwelchen Gradzahlen. Poste mal Deinen Quelltext, dann kann man Dir helfen.
 
Zurück