2015-04-16 7 views
5

Ho una matrice di un oggetto Unità e l'oggetto unità ha centro cx, cy e raggio cr. Voglio solo il contorno dei cerchi da mostrare (pensa a un diagramma ven senza i bit sovrapposti). Sono riuscito a farlo, ma lo rende estremamente lento in quanto è un ciclo annidato. Ecco il codice:Come ottimizzare questo codice per mostrare solo il contorno di una serie di cerchi?

(questo è tutto in un metodo che cicli attraverso tutte le unità)

ArrayList<Integer> validangles = new ArrayList<Integer>(); 

    public void getValidAngles(ArrayList<Unit> units) { //get all the angles that aren't overlapping 
    ArrayList<Integer> invalidAngles = new ArrayList<Integer>(); 
    for (int i = 0; i < units.size(); i++) { //cycle through all other units 
     Unit c2 = units.get(i); 
     if (this != c2) { //make sure it is not the same unit 
      for (int ia = 0; ia < 360; ia += 10) { //cycle through the angles 
       double ca = Math.toRadians(ia); 
       Point p = new Point(//point on the circle 
         (int) Math.round((c2.getCx() + (cr * Math.cos(ca)))), 
         (int) Math.round((c2.getCy() + (cr * Math.sin(ca))))); 
       if (overlapping(p)) { 
        invalidAngles.add(ia-180); //this angle should not be shown 
       } 
      } 
     } 

    } 
    validangles.clear(); 
    for (int i = 0; i < 360; i += 10) { 
     if (!invalidAngles.contains(i-180)) { 
      validangles.add(i-180); 
     } 

    } 
} 

public void drawValidAngles(Graphics g2) { 

    for(int i : validangles) { 
     int x = (int)Math.round(cx+cr*Math.cos(Math.toRadians(i))); 
     int y = (int)Math.round(cy+cr*Math.sin(Math.toRadians(i))); 
     g2.drawLine(x, y, x, y); 
    } 
} 

Il problema è che se ho verso l'alto di un paio di centinaia di unità, che sarà comune, rallenta il programma di un tonnellata a causa dell'annidamento di un forloop di unità in un altro forloop di unità.

risposta

0

È possibile utilizzare la classe Area per combinare le ellissi (ogni ellisse rappresenta la forma Unit). Per esempio.

Shape s=new Ellipse2D.Float(10,10,200,100); 
    Area a=new Area(new Ellipse2D.Float(150,20,100,200)); 
    a.add(new Area(s)); 

Quindi è possibile utilizzare la somma dell'area come struttura. Vedi l'esempio di lavoro here

Problemi correlati