drawLine(...) - Linie soll nur begrenzt lang sein

Willibergi

Mitglied
Hallo,
wenn ich mit drawLine(...) eine Linie zeichnen will, muss ich ja x- und y-Koordinaten des Start- und Endpunktes angeben.
Gibt es eine Möglichkeit, dass die Linie zwar zum Endpunkt hin gerichtet, aber z. B. nur 75px lang ist?
Danke schon mal!
 
Du hast mit Start- und Endpunkt eine Gerade. Diese besitzt eine Richtung und du willst vom Startpunkt aus als Länge der Gerade 75px. Das ist keine schwere Rechnung, das bekommt man mit ein bisschen Nachdenken zusammen.
 
Vermutlich sowas wie...
aber keine Garantie, nur runtergetippt.

Java:
int startX = 100;
int startY = 300;
int endX = 542;
int endY = 152;

int dx = endX-startX;
int dy = endY-startY;
double length = Math.sqrt(dx*dx+dy*dy);
double newLength = Math.min(length,75);
dx=(int)(dx*newLength/length);
dy=(int)(dy*newLength/length);
g.drawLine(startX,startY,startX+dx,startY+dy);
 
Mal ganz auf die Schnelle und getestet:
Java:
        Point start = new Point(10, 100);
        Point end = new Point(100, 10);
        Point startEnd = new Point(end.x - start.x, end.y - start.y);
        Point endStart = new Point(start.x - end.x, start.y - end.y);
        double len1 = Math.sqrt(startEnd.x * startEnd.x + startEnd.y * startEnd.y);
        System.out.println("len1 = " + len1);
        double len2 = Math.sqrt(endStart.x * endStart.x + endStart.y * endStart.y);
        System.out.println("len2 = " + len2);

        double skalar1 = 75.0 / len1;
        double skalar2 = 75.0 / len2;
        startEnd.x = (int) Math.round(startEnd.x * skalar1);
        startEnd.y = (int) Math.round(startEnd.y * skalar1);
        endStart.x = (int) Math.round(endStart.x * skalar1);
        endStart.y = (int) Math.round(endStart.y * skalar1);

        Point end2 = new Point(start.x + startEnd.x, start.y + startEnd.y);
        System.out.println("start = " + start);
        System.out.println("end2 = " + end2);

        Point start2 = new Point(end.x + endStart.x, end.y + endStart.y);
        System.out.println("start2 = " + start2);
        System.out.println("end = " + end);

        System.out.println("Zeichne von " + start + " bis " + end2 + " , oder von " + start2 + " bis " + end + " , fuer eine 75 Pixel lange Gerade ... ");

Code:
startEnd = java.awt.Point[x=90,y=-90]
endStart = java.awt.Point[x=-90,y=90]
len1 = 127.27922061357856
len2 = 127.27922061357856
start = java.awt.Point[x=10,y=100]
end2 = java.awt.Point[x=63,y=47]
start2 = java.awt.Point[x=47,y=63]
end = java.awt.Point[x=100,y=10]
Zeichne von java.awt.Point[x=10,y=100] bis java.awt.Point[x=63,y=47] , oder von java.awt.Point[x=47,y=63] bis java.awt.Point[x=100,y=10] , fuer eine 75 Pixel lange Gerade ...

Mir sind dabei 1000 Flüchtigkeitsfehler unterlaufen, bitte stets acht geben.

BITTE LASST DIE FORMEL FÜR GERADE(N) AU?EN VOR; BLEIBT BEI DER VEKTORRECHNUNG ! ! !
 
Also du hast eine Gerade von (10, 100) bis (100, 10) - kann auch jeder anderer Wert sein!!!! Diese Gerade hat ne Richtung usw. Und eine Länge von 127.27 ... Wenn die Gerade 75 (Pixel) lang sein soll, DANN zeichne sie von (10, 100) bis (63, 47) - oder von (47, 63) bis (100, 10)!!!! Dass es hierbei ne gewisse Symmetrie gibt, sei jetzt mal egal.

Das war doch jetzt mal Gutes deutsch ...
 
Geht doch auch viel einfacher?
Java:
  int startx=200;
  int starty=200;
  int endx=100;
  int endy=0;
  int length=75;
   
  double angle=Math.atan2(endy-starty, endx-startx);
  int x2=startx+(int)(Math.cos(angle)*length);
  int y2=starty+(int)(Math.sin(angle)*length);
  g.drawLine(startx,starty,x2,y2);
 
Was heißt einfacher? Etwas genauer ist meines. Und ich weiß halt nicht, ob von start 75 px Richtung end - oder von end 75 px Richtung start. Aber über die Winkel ist auch nice. 😉 🙂
 

Zurück
Oben