2010-08-21 5 views
28

Nehmen wir an, ich habe eine (x, y), die immer gleich ist für den Startpunkt einer Linie und eine (x, y), die für den Endpunkt der gleichen ändert Linie. Die Linie ist auch immer 40px lang. Am Anfang des Programms beginnt die Linie in einer vertikalen Ausrichtung (nennen wir es 0 Grad). Basierend auf einer Benutzereingabe muss die Linie um eine bestimmte Gradzahl von ihrem Ursprung neu gezeichnet werden, indem nur das Ende (x, y) geändert wird.Zeichnen Sie eine Linie in einem bestimmten Winkel in Java

etwas mehr DENKANSTOSS wenn Sie es brauchen:

ich in einer Furche bin versucht, dies zu berechnen und sie in Java arbeiten zu lassen. Ich kann die Mathematik dazu bringen, den Punkt basierend auf der Bogenlänge eines Kreissegments zu berechnen, aber ich weiß nicht, wie ich Java dazu bringen soll.

Ich denke, es würde einfacher funktionieren basierend auf einem Dreieck Winkel, da ich immer die Länge von zwei Seiten eines Dreiecks (eine Seite durch die 40px lange Linie und die andere Seite durch den Startpunkt dieser Linie und die Grenze der JPanel) und der Winkel, den diese beiden Linien bilden. Trotzdem ist mein Gehirn muffig, um es herauszufinden. Jede Hilfe würde sehr geschätzt werden.

UPDATE:

@casablanca hat mich auf dem richtigen Weg. Ich habe meine trigonometrischen Funktionen verbessert und hier habe ich es zum Laufen gebracht.

Zunächst einmal habe ich nicht realisiert, dass 90 Grad geradeaus war, aber sobald ich erkannte, dass ich meine Lösung diese Tatsache widerspiegeln. Ich zeichnete meine Linie ausgehend von der unteren Mitte des Rahmens aus. Da die opposite Seite des Dreiecks ist auf der rechten Seite des Bildschirms, wenn der Winkel von meinem Benutzer gegeben ist weniger als 90 Grad und ist auf der linken Seite des Bildschirms, wenn der Winkel von meinem Benutzer gegeben ist größer als 90 Grad ich hatte Um die Formel anzupassen, um diese Tatsache zu berücksichtigen, habe ich vier Methoden, eine für die x Koordinate auf der linken Seite des Bildschirms (wenn der Benutzer gegeben Winkel größer als 90 Grad), eine für die y Koordinate auf der linken Seite des Bildschirms (wenn der vom Benutzer angegebene Winkel größer als 90 Grad ist) und das Gleiche für die rechte Seite des Bildschirms, wenn der vom Benutzer angegebene Winkel weniger als 90 Grad beträgt. Die int length in allen Methoden ist die Länge der Hypotenuse. Nochmals vielen Dank für Ihre Hilfe @casablanca!

public double leftSideX(double angle, int length){ 
    double x = frameWidth/2 - (length * Math.cos(Math.toRadians(90-(Math.toDegrees(angle)-90)))); 
    return x; 
} 

public double leftSideY(double angle, int length){ 
    double y = frameHeight - (length * Math.sin(Math.toRadians(90-(Math.toDegrees(angle)-90)))); 
    return y; 
} 

public double rightSideX(double angle, int length){ 
    double x = frameWidth/2 + (length * Math.cos(angle)); 
    return x; 
} 

public double rightSideY(double angle, int length){ 
    double y = frameHeight - (length * Math.sin(angle)); 
    return y; 
} 
+0

Sehen Sie sich auch die Grafikkontext der Transformation zu verändern, hier: http://stackoverflow.com/questions/3420651 – trashgod

+0

Vielleicht möchten Sie Einkapseln dies berücksichtigen Funktionsfähigkeit in einer Klasse; z.B. Vektor2D. Auf diese Weise können Sie ein Vector2D mit x- und y-Koordinaten oder einer Länge und einem Winkel konstruieren und Methoden wie getMagnitude(), getAngle(), getX(), getY(), rotateClockwise (double) usw. bereitstellen. – Adamski

+0

würde ich Liebe zu, aber ich denke, das ist ein bisschen über meine Fähigkeit jetzt. Ich brauchte fast einen ganzen Tag, um das herauszufinden :) – ubiquibacon

Antwort

64

Ist das wonach Sie suchen?

startX = x; 
startY = y; 
endX = x + 40 * Math.sin(angle); 
endY = y + 40 * Math.cos(angle); 

Und eine Linie ziehen von (startX, startY) bis (ENDX, Endy) in welcher API Sie verwenden.

Beachten Sie auch, dass angle im Bogenmaß ist. Wenn Sie es in Grad hatte, müssen Sie es zuerst konvertieren:

angle = angle * Math.PI/180; 
+1

Ich hoffe zu Gott, dass es nicht so einfach ist, aber wenn es ist, wirst du dieses Weihnachten Obstkuchen bekommen! Ich bin zu müde, um es jetzt auszuprobieren, aber als erstes am Morgen ... danke für die schnelle Antwort! – ubiquibacon

+1

@Jim Lewis: Eigentlich sind die trigonometrischen Konventionen umgekehrt. Ich habe es umgeschaltet, weil OP wollte, dass 0 Grad vertikal ist: "sin 0 = 0", also "endX = x" und "cos 0 = 1", also "endY = y + 40". – casablanca

+0

@casablanca: D'oh! Natürlich hast du Recht ... vielleicht sollte ich aufhören, am Freitagabend Mathe-Posts zu kommentieren. –