# Sechsecke, erkennen von bestimmten Werten



## Turakar (8. Nov 2012)

Hallo,

im Voraus, dieser Thread ist wahrscheinlich nur für Mathematiker etwas gutes... :rtfm:

Ich habe ein paar Fragen zu Hexagons. Ich glaube das die Grafik mein Problem verdeutlichen kann.

Gruß Turakar

PS: mit linker oberer Ecke ist die linke obere Ecke eines Rechtecks gemeint, in dem das Hexagon liegt.

PSS: Kein Problem falls ihr keine Idee habt wie das gehen soll. Wär aber cool. :toll:

[EDIT]Muss mich korrigieren, die länge a des Quadrats in dem das Hexagon hineinpasst ist gerfagt.[/EDIT]


----------



## Melfis (8. Nov 2012)

[EDIT]Ups, hab übersehn daß das secheck von einem Quadrat umhülllt ist.[/EDIT]


----------



## bERt0r (8. Nov 2012)

Was willst du nochmal genau wissen? Auf wikipedia ist so ziemlich alles erklärt was man über Sechsecke wissen will: Sechseck ? Wikipedia


----------



## pappawinni (9. Nov 2012)

also mal angenommen du wolltest diese Sechsecke zeichnen lassen und brauchtest immer 
die Positon der linken obere Ecke eines Quadrats, um das Sechseck da hinein zu zeichnen.
Da müsstest du in der horziontalen Richtung immer um die Breite sw des Sechsecks verschieben.
Bei jeder zweiten Zeile müsste am Anfang der Zeile zuerst einen Sprung von sw/2 erfolgen.
In vertikaler Richtung überlappen die umgebenden Quadrate die der vorangegangene Zeile.
Wir können also nicht einfach einen vertikalen Sprung von sh machen.
Es gilt sh=sw. 
Wenn ich mich nicht irre, wäre die Kantenlänge a = sw / Wurzel(3)
Damit der vertikale Vorschub dV dann = sw/2+a/2 oder
dV = sw/2 * (1 + 1/Wurzel(3))
Für das Quadrat mit dem Sechseck A musst du von links oben 
nach rechts 4 * sw und 2*dV nach unten
Für das Quadrat mit dem Sechseck B musst du von links oben
nach rechts 4.5 * sw und 3*dV nach unten


----------



## Landei (9. Nov 2012)

Die Berechnung von Hexagons ist ganz einfach, wenn man sie in 6 gleichseitige Dreiecke zerlegt, und dann noch weiß, dass die Höhe eines gleichseitigen Dreiecks s*sqrt(3)/2 ist.


----------



## Turakar (9. Nov 2012)

> Wenn ich mich nicht irre, wäre die Kantenlänge a = sw / Wurzel(3)



Die Seitenlänge beträgt laut Wikipedia:

```
r = a / 2 * Wurzel(3)
```

Ändern sollte sich ansonsten nichts, oder?

[EDIT]Hat sich erledigt, hab da was verwechselt[/EDIT]


----------



## Turakar (9. Nov 2012)

*Das Rätsel ist gelöst!* :toll: :toll: :toll: :toll: :toll: :toll: :toll:

Größtenteils haben mir die Formeln von pappawinni geholfen, eine sehr gute Leistung!

Eine Sache musste ich ändern, die Formel zum berechnen des Y Abstands hat nicht geklappt.
Hier meine Version:

```
sw / 2 + a * 2 + sw / 10 - 2
```

Trotzdem an alle Danke! :applaus: :applaus: :applaus:



Spoiler: Code zum erstellen des Polygons





```
int[] x = new int[6];
		int[] y = new int[6];
		
		for (int i = 0; i < 6; i++) 
		{
			x[i] = (int)Math.round(xxx / 2 + 50 + xxx*Math.sin(i*Math.PI/3.0));
		    y[i] = (int)Math.round(xxx / 2 + 50 + xxx*Math.cos(i*Math.PI/3.0));
		}
		
		hexa = new Polygon(x, y, 6);
```


----------



## pappawinni (10. Nov 2012)

Oh..
Also wenn bei dem Sechseck die Kanten alle gleich lang sein sollen, dann wäre für sw = sh
die Kantenlänge a = sw * (wurzel(7)-1)/3
( für sw ungleich sh wäre die Kantenlänge a = 1/3 * ( Wurzel (4*sh^2+3*sw^2) - sh )  )
Dann aber dürften die Ecken des Sechsecks nicht über gleiche Mittelpunktswinkel aufgebaut werden.
für gleiche Mittelpunktswinkel entstehen unterschiedliche Kantenlängen.
Die vertikalen Kanten hätten eine Länge von sw / Wurzel(3), die ich dummerweise mit a bezeichnet habe.
In der Skizze ist es aber wohl die schräge Kante, die mit a bezeichnet ist.

Das 
	
	
	
	





```
sw / 2 + a * 2 + sw / 10 - 2
```
 erscheint mir jedenfalls mehr als merkwürdig.

Kannst du mal dein ganzes Programm posten ?


----------



## pappawinni (10. Nov 2012)

Also ich denke, dass hier

```
for (int i = 0; i < 6; i++) 
        {
            x[i] = (int)Math.round(xxx / 2 + 50 + xxx*Math.sin(i*Math.PI/3.0));
            y[i] = (int)Math.round(xxx / 2 + 50 + xxx*Math.cos(i*Math.PI/3.0));
        }
```

vielleicht stehen sollte:


```
x[i] = (int)Math.round( sw/ 2 +  sw / Math.sqrt(3) * Math.sin(i*Math.PI/3.0));
            y[i] = (int)Math.round( sw/ 2 +  sw /2             * Math.cos(i*Math.PI/3.0));
```

Die vertikale Kantenlänge des Sechsecks wäre damit = sw/2
Die in der Skizze mit a gekennzeichnete Kante a = sw/4 * wurzel(5)
Der erforderlich vertikale Vorschub dV = 3/4 * sw


----------



## pappawinni (10. Nov 2012)

Hier dann auch noch ein Programm, das Sechsecke zeichnet.


```
import java.awt.Color;
import java.awt.Polygon;
import java.awt.Graphics;
import javax.swing.JFrame;
 
public class Hexapi extends JFrame {
	
    int Jframe_height;
    int Jframe_width;

    public Hexapi(String newTitel) {
        super.setTitle(newTitel);
        Jframe_height = 600;
        Jframe_width = 600;			        
        setSize(Jframe_width, Jframe_height);
        setForeground(new Color(64,128,192));
        setBackground(Color.lightGray);
    }
    
    public static void main(String str[]) {
        Hexapi fenster = new Hexapi("Hexapi");
        fenster.setVisible(true);                
    }
    public void paint(Graphics g){
    	   

        Jframe_height = this.getSize().height;
        Jframe_width = this.getSize().width;
    	g.setColor(getForeground());
        int randoben = 30;
        int randlinks = 8;
        int sw=36; //Breite und Höhe des Sechsecks
        int vy= (int) (3.0/4.0 * sw);
        int nx=(Jframe_width-sw/2-randlinks)/sw;
        int ny=(int) ((Jframe_height-sw-randoben)/(3.0/4.0*sw)+1);
        for (int j=0;j<ny;j++){
            for (int i=0;i<nx;i++){
                int dx = j%2 * sw/2;
            	g.drawPolygon(makeHexagon(randlinks + dx + i*sw,randoben + j * vy, sw));        	
            }        	
        }

    }
    public Polygon makeHexagon(int posx, int posy, int sq){
        int[] x = new int[6];
        int[] y = new int[6];
        
        for (int i = 0; i < 6; i++) 
        {
            x[i] = (int) ( posx + sq/ 2 +  sq / Math.sqrt(3) * Math.sin(i*Math.PI/3.0));
            y[i] = (int) ( posy + sq/ 2 +  sq /2             * Math.cos(i*Math.PI/3.0));
        }
        return new Polygon(x,y,6);
    }
    
              
}
```


----------

