Newsgroup: it.comp.java
Titolo: Freccia Java2D

Ciao,
sto cercando di realizzare una semplice freccia in Java 2D, composta da 
tre g2d.drawLine();
la struttura della freccia dovrebbe essere la seguente:
  \
-
  /
Ovviamente la freccia può avere un orientamento qualsiasi.
Come posso disegnare le linee laterali? Le loro coordinate (da mettere 
in drawline) cambiano sempre, a seconda della linea centrale...
Qualche idea?
Grazie

Ciao,
il tuo problema può essere risolto tramite l'utilizzo di pitagora, seno 
e coseno dai un'occhiata a 
http://it.wikipedia.org/wiki/Sistema_di_coordinate_polari
Ciao,
Tommaso
Michele ha scritto:


> Grazie
Ma Java2D non utilizza un sistema di coordinate cartesiano (x,y), per 
cui le x aumentano andando verso destra, e le y aumentano andando verso 
il basso...
O si possono usare le coordinate polari?

In Java2D non puoi utilizzare le coordinate polari, però puoi sempre 
convertire da te le coordinate polari in coordinate cartesiane :)
Praticamente ciò che devi fare è:
- Trovare l'angolo del tuo segmento principale: chiamiamolo "ang"
- definire gli angoli e la luncghezza dei 2 segmenti che definiscono la 
punta della freccia: LEN = lunghezza segmento punta, ANGLE_SX = angolo 
segmento sx, ANGLE_DX = angolo segmento dx
A questo punto puoi convertire le tue coordinate polari in cartesiane:
getPolarPoint(Punto orig, double r, double theta) {
   x = orig.x + r * Math.cos(theta);
   y = orig.y + r * Math.sin(theta);
}
Se ti serve il codice completo fammelo sapere...


> O si possono usare le coordinate polari?
Ciao,
ti ringrazio per la risposta.
In effetti non ho capito molto bene come intendi fare, magari del codice 
in più sarebbe d'aiuto (ovviamente se puoi...).
Grazie!

Ecco il codice (non guardare lo stile xchè l'ho buttato giù in fretta ed 
in modo da avere tutto in una classe per semplicità), cambiando le 
coordinate nel metodo main vedi la freccia spostarsi (non ho modificato 
l'origine degli assi, quindi y aumenta verso il basso).
Ciao,
Tommaso
/*
  * $Id$
  * $Revision$
  * Last modified on $Date$ by $Author$
  */
package it.tommasonolli.newsgroup.g2d;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.HeadlessException;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
/**
  * @author Tommaso Nolli
  * @version $Revision$
  */
public class Freccia extends JPanel
{
	// Attributes ...................................
	private static final int LEN = 10;
	private static final double ANGLE_SX = Math.toRadians(90 + 45);
	private static final double ANGLE_DX = -ANGLE_SX;
 
	private Punto from, to;
	private Punto sx, dx;
	private double m;
 
	// Constructors .................................
	public Freccia(double x1, double y1, double x2, double y2) throws 
HeadlessException
	{
		from = new Punto(x1, y1);
		to = new Punto(x2, y2);
		m = (y2 - y1) / (x2 - x1);
 
		double ang = getAngle();
 
		sx = new Punto(to, LEN, ang + ANGLE_SX);
		dx = new Punto(to, LEN, ang + ANGLE_DX);
 
		System.out.println(sx);
		System.out.println(dx);
		JFrame f = new JFrame("Freccia");
		f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		f.setSize(500, 500);
		f.getContentPane().setLayout(new BorderLayout());
		f.getContentPane().add(this, BorderLayout.CENTER);
		f.setVisible(true);
 
	}
	// Public methods ...............................
	public void paint(Graphics g)
   {
	  super.paint(g);
 
	  g.setColor(Color.YELLOW);
	  g.drawLine((int) from.x, (int) from.y, (int) to.x, (int) to.y);
 
	  g.drawLine((int) to.x, (int) to.y, (int) Math.round(sx.x), (int) 
Math.round(sx.y));
	  g.drawLine((int) to.x, (int) to.y, (int) Math.round(dx.x), (int) 
Math.round(dx.y));
 
   }
 
 
	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		//Freccia f = new Freccia(400, 300, 70, 150);
		//Freccia f = new Freccia(100, 0, 100, 400);
		Freccia f = new Freccia(400, 300, 90, 260);
	}
	// Protected methods ............................
	// Private methods ..............................
	private double getAngle()
	{
		double ang = 0d;
		double w = (to.x - from.x);
		double h = (to.y - from.y);
		if ((w < 0) && (h < 0))
		{
			ang = Math.atan(m) + Math.PI;
		}
		else if (w < 0 && h >= 0)
		{
			ang = Math.atan(m) + Math.PI;
		}
		else if (w >= 0 && h < 0)
		{
			ang = 2 * Math.PI + Math.atan(m);
		}
		else if (w >= 0 && h >= 0)
		{
			ang = Math.atan(m);
		}
		return ang;
	}
 
 
	private class Punto
	{
		double x, y;
		public Punto(double x, double y)
		{
			this.x = x;
			this.y = y;
		}
 
		/**
		 * Ottiene un punto espresso in coordinate polari
		 * @param orig il polo
		 * @param r la distanza
		 * @param ang l'angolo
		 */
		public Punto(Punto orig, double r, double ang)
		{
			x = orig.x + r * Math.cos(ang);
			y = orig.y + r * Math.sin(ang);
		}
 
		public String toString()
		{
			return "[x: " + x + ", y: " + y + "]";


 Tommaso
E' perfetto! Grazie mille Tommaso!
Ora analizzo il tuo codice in modo da capirlo meglio.
Ti ringrazio ancora!

 Ti ringrazio ancora!
sarebbe stato meglio se avessi abattuto un po' la testa con l'algebra
lineare a avessi risolto il problam da solo. fra due mesi se avrai un
problema simile sarai da capo...
Ciao Jack
-- 
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?

 Ciao Jack
--
Ciao Neo

 o in qualsiasi corso terra terra di trigonometria!
=> algebra lineare.


Michele ha scritto:

in ogni caso, per tua praticità,
sarebbe ideale scriverti un paio di funzioni che ti permettano di 
lavorare su un piano cartesiamo standard.
(anche solo 1 quadrante, con origine in basso a sx).
Lavori con le tue coordinate standard alle quali puoi applicare
tutti i calcoli matematici del caso e poi applichi ai risultati
una funzione per la y (la x non varia) che ti restituisca la y
nel sistema di coordinate java.

 => algebra lineare.
Ma no! Anzi ad algebra lineare io non ho fatto le coordinate polari!
Comunque non è che sia così importante.. Era solo per sottolineare che
un programmatore (o aspirante tale) dovrebbe almeno sapere le basi
della matematica. Così questi problemi si risolverebbero senza
chiedere niente....
