Newsgroup: it.comp.java
Titolo: disegno di un triangolo

Ciao a tutti.
Ho il seguente problema che mi sta facendo perdere più tempo del previsto e
spero che qualcuno di voi l'abbia già risolto e mi voglia dare una mano.
Devo disegnare su un Panel un triangolo equilatero e ho i seguenti dati:
(x1,y1)     : uno dei vertici del triangolo
(x2,y2)     : punto non appartenente al triangolo, ma che si trova sulla
stessa retta sulla quale giace la bisettrice dell'angolo il cui vertice è
(x1,y1)
lung          : lunghezza di tale bisettrice.
Si ha cioè una situazione del seguente tipo:
                     |\
(x2,y2)------ | \(x1,y1)
                     |/
Dove lung è la lunghezza del segmento che parte da (x1,y1) e termina
all'intersezione della retta che congiunge (x1,y1) a (x2,y2) e la base.
Ho disegnato il frammento di retta passante per (x1,y1) e (x2,y2) come se
fosse parallelo all'asse x, ma potrebbe non essere così.
In effetti il mio problema è identificare gli altri due vertici del
triangolo, poi mi basterà usare il metodo drawPolygon.
Grazie.
Ciao!

 ha scritto nel messaggio
news:AsHCa.54013$Ny5.1...@twister2.libero.it...

Da un punto di vista matematico, un triangolo equilatero ha gli
angoli interni di 60° (e fino qui...)
Sfruttando questa cosa, insieme al fatto che hai la bisettrice, possiamo
dire che la lunghezza del lato obliquo che si vede in figura (quello
superiore e quello inferiore...e quindi anhe la base!...
è data da     lung / cos30°
   ---> metà base  =   lung / (2*cos30°)
Riesci ad andare avanti da solo?
                 IL SANTO


Ti ringrazio per la tua cortesia. In effetti ero già riuscito a calcolare la
lunghezza del lato, ma sono stato molto impreciso nell'altro post e non sono
andato al cuore del problema.
Il mio problema in effetti è, dati i punti (x1,y1) e (x2,y2), disegnare un
arco orientato. Non ho alcun vincolo sulla forma della punta della freccia,
ma la scelta più ovvia è quella di disegnare un triangolo isoscele, che per
semplicità ho preferito anche equilatero.
Il metodo drawPolygon ha come parametri i 3 vertici del triangolo, e il mio
problema sta proprio nell'individuare i due vertici incogniti.
Grazie ancora. Ciao!

problema sta proprio nell'individuare i due vertici incogniti.
A dire la verità si tratta di geometria piuttosto elementare... ;-)
Non so se ho interpretato correttamente il ruolo dei dati di cui parli, ma 
prova a vedere se ti piace il codice che segue.
Eisterebbe anche la classe Affinetransform...
import java.awt.*;
import javax.swing.*;
public class Qwk extends JPanel {
    private final double threeSqrt = Math.sqrt(3);
    private Point x1y1 = new Point(100, 100);
    private Point x2y2 = new Point(200, 50);
    private int lung = 20;
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        // punti del triangolo-freccia base + estremo
        int semilato = (int)(lung / threeSqrt);
        int[] yT = {-semilato, 0, semilato, 0};
        int[] xT = {-lung, 0, -lung, -lung};
        // vettore s --> e
        int vx = (x1y1.x - x2y2.x);
        int vy = (x1y1.y - x2y2.y);
        // calcolo angolo linea
        double distance = Math.sqrt((vx * vx) + (vy * vy));
        double cos = vx / distance;
        double sin = vy / distance;
        // nuove coord triangolo-freccia
        int[] nXT = new int[xT.length];
        int[] nYT = new int[yT.length];
        // calcolo rototraslazione
        for (int i = 0; i < nXT.length; i++) {
            nXT[i] = (int)((xT[i] * cos) - (yT[i] * sin) + x1y1.x);
            nYT[i] = (int)((xT[i] * sin) + (yT[i] * cos) + x1y1.y);
        }
        g.setColor(Color.black);
        g.drawPolygon(nXT, nYT, 3);
        g.drawLine(nXT[3], nYT[3], x2y2.x, x2y2.y);
    }
    public static void main(String[] args) {
        JFrame f = new JFrame("qwk");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setSize(640, 480);
        Container c = f.getContentPane();
        c.setLayout(new BorderLayout());
        c.add(new Qwk(), BorderLayout.CENTER);
        f.setVisible(true);
    }
}
HTH
-- 
Ciao
	Fabrizio C.

 prova a vedere se ti piace il codice che segue.
Grazie mille!