2010-08-21 4 views
28

Diciamo che ho un (x, y) che è sempre lo stesso per il punto iniziale di una linea e un (x, y) che cambia per il punto finale di quello stesso linea. Anche la linea è sempre lunga 40px. All'inizio del programma la linea ha origine in un orientamento verticale (chiamiamola 0 gradi). Sulla base di un input dell'utente, ho bisogno che la linea sia ridisegnata di un numero specifico di gradi dalla sua origine cambiando solo la fine (x, y).Disegna una linea con un angolo specifico in Java

ALCUNI PIU 'DI RIFLESSIONE se ne avete bisogno:

Sono in una carreggiata cercando di calcolare questo e farlo funzionare in Java. Posso fare in modo che la matematica lavori per calcolare il punto in base alla lunghezza dell'arco di un segmento di cerchio, ma non so come farlo fare a Java.

Penso che sarebbe più facile lavorare sulla base di angoli triangolari poiché conoscerò sempre la lunghezza dei due lati di un triangolo (un lato formato dalla linea lunga 40 px e l'altro lato formato dal punto iniziale di quella linea e il bordo dello JPanel) e l'angolo che formano queste due linee. Tuttavia, il mio cervello è in difficoltà a cercare di capirlo. Qualsiasi aiuto sarebbe molto apprezzato.

UPDATE:

@casablanca mi ha fatto sulla strada giusta. Ho approfondito le mie funzioni trigonometriche ed ecco come l'ho fatto funzionare.

Prima di tutto, non mi rendevo conto che 90 gradi erano dritti, ma una volta ho realizzato che ho fatto riflettere la mia soluzione. Stavo disegnando la mia linea partendo dal centro in basso della cornice. Dal momento che il lato opposite del triangolo si trova sul lato destro dello schermo quando l'angolo dato dal mio utente è inferiore a 90 gradi ed è sul lato sinistro dello schermo quando l'angolo dato dal mio utente è maggiore di 90 gradi ho avuto per regolare la formula per tenere conto di questo fatto, quindi ho quattro metodi, uno per la coordinata x sul lato sinistro dello schermo (quando l'angolo dato dall'utente è maggiore di 90 gradi), uno per la coordinata y sul lato sinistro dello schermo (quando l'angolo dato dall'utente è maggiore di 90 gradi) e la stessa cosa per il lato destro dello schermo quando l'angolo dato dall'utente è inferiore a 90 gradi. Lo int length in tutti i metodi è la lunghezza dell'ipotenusa. Grazie ancora per il tuo aiuto @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

considerano alterare la grafica contesto di trasformare Inoltre, mostrato qui: http://stackoverflow.com/questions/3420651 – trashgod

+0

Si potrebbe prendere in considerazione l'incapsulamento questo funzionalità in una classe; per esempio. Vector2D. In questo modo puoi costruire un Vector2D con le coordinate xey o una lunghezza e un angolo, e fornire metodi come getMagnitude(), getAngle(), getX(), getY(), rotateClockwise (double), ecc. – Adamski

+0

Vorrei amore, ma penso che sia un po 'oltre le mie capacità in questo momento. Mi ci è voluto quasi un giorno intero per capirlo :) – ubiquibacon

risposta

64

E 'questo quello che stai cercando?

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

e tracciare una linea da (startx, starty) a (EndX, Endy) in qualsiasi API che si sta utilizzando.

Si noti inoltre che angle è in radianti. Se tu avessi in gradi, è necessario convertirlo prima:

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

Spero che Dio non sia così semplice, ma se lo farai, andrai alla torta della frutta questo Natale! Sono troppo stanco per provarlo ora, ma prima cosa al mattino ... grazie per la rapida risposta! – ubiquibacon

+1

@Jim Lewis: In realtà le convenzioni trigonometriche sono il contrario. L'ho cambiato perché OP voleva che 0 gradi fosse verticale: 'sin 0 = 0' quindi' endX = x' e 'cos 0 = 1' quindi' endY = y + 40'. – casablanca

+0

@casablanca: D'oh! Certo che hai ragione ... forse dovrei smettere di commentare i post di matematica il venerdì sera. –