# Vieleck



## Schaaaf (17. Sep 2011)

Hallo,

gibt es eine Möglichkeit ein Vieleck nach Anzahl des eingegebenen Int Werts zu zeichnen ?
Also wenn ich z.B. eine 3 eingebe, soll ein Dreieck gezeichnet werden, bei Eingabe einer 5 ein Fünfeck usw. Gibts da ne Möglichkeit?

Danke schon einmal


----------



## Opi3 (17. Sep 2011)

Nur eine Idee.

Du hast einen Mittlepunkt,
und weist wie viel grad ein Kreis hat.
Jetzt setzt du die Punkte in der Entnervung n jeweils um KreisGrad/Anzahl um den Mittelpunkt gedreht angeordnet.

So, das müsste klappen...

Opi3

[EDIT]
Da bei meiner verdrehte Satzstellung eventuell nicht klar wird was ich meine:
AS3 (Fühle ich mich einfach heimischer)
//Mit var name:Art = ... werden in As3 Variablen deklariert.

```
var A:Number = 360 / ecken;
	for (var i:int = 0; i<ringe; ++i)//Das mit den Ringen, kommt daher das ich den Codeausschnitt    
                                    //aus einem Mühlespiel das ich gemacht habe entnommen habe.
	{
		var E:int = (i+1)*50;
		for (var i2:int = 0; i2<ecken; ++i2)
		{
			var A2:Number = (A*i2+(A/2))/180*Math.PI;
			new Point(Math.sin(A2) * E,Math.cos(A2) * E);
		}
	}
```
[/EDIT]


----------



## Marco13 (17. Sep 2011)

Eigentlich fast das gleiche wie http://www.java-forum.org/awt-swing-swt/124382-elemente-kreis-aufstellen.html - die "Objekte" sind hier die Ecken des Polygons.


----------



## tuttle64 (18. Sep 2011)

Für Dein Problem kann man Java2D verwenden resp. entweder die Klasse Polygon oder auch die Klasse GeneralPath. Zum GEneralPath kann ich auch ein Beispiel aus dem Buch "Grundkurs Computergrafik mit Java" von F. Klawonn liefern. Zuerst das Programm GeneralPathExample.java:


```
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.GeneralPath;

public class GeneralPathExample extends Frame {

	private static final long serialVersionUID = 1L;

	public GeneralPathExample() {
		addWindowListener(new MyFinishWindow());
	}
	
	public void paint(Graphics g) {
		Graphics2D g2d = (Graphics2D)g;
		g.setColor(Color.red);
		GeneralPath gp = new GeneralPath(); 
		gp.moveTo(60, 120); 
		gp.lineTo(80, 120); // vordere Unterboden
		gp.quadTo(90, 140, 100, 120); // Vorderreifen
		gp.lineTo(160, 120); // mittlere Unterboden
		gp.quadTo(170, 140, 180, 120); // Hinterreifen
		gp.lineTo(200, 120);
		gp.curveTo(195, 100, 200, 80, 160, 80); // Heck
		gp.lineTo(110, 80); // Dach
		gp.lineTo(90, 100); // Frontscheibe
		gp.lineTo(60, 100); // Motorhaube
		gp.lineTo(60, 120); // Front
		
		g2d.draw(gp);

	}
	
	public static void main(String[] args) {
		GeneralPathExample f = new GeneralPathExample();
		f.setTitle("GeneralPath Example");
		f.setBounds(100, 100, 500, 400);
		f.setVisible(true);
	}
}
```


und den Code für die Klasse MyFinishWindow


```
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MyFinishWindow extends WindowAdapter {

	public void windowClosing(WindowEvent arg0) {
		System.exit(0);

	}
}
```


Details zur Klasse Polygon findest Du hier: Polygon (Java Platform SE 6)


----------



## Marco13 (18. Sep 2011)

Polygon wirkt in vieler Hinsicht... Antiquiert. GeneralPath ist besser, aber auch schon "legacy". Eigentlich wurde das jetzt aber alles zu Path2D zusammengefasst, die für solche Sachen das Mittel der Wahl darstellt: Path2D (Java Platform SE 6)


----------



## Schaaaf (19. Sep 2011)

Vielen Dank. Werde jetzt Path2D benutzen. Manchmal muss man einfach mal nur davon hören...
Jetzt noch kurz ein Hinweis bitte, wie ich das ganze in Abhängigkeit der Anzahl der Variablen lösen kann?!


----------



## Marco13 (19. Sep 2011)

Hilft sowas wie im Verlinkten Beitrag http://www.java-forum.org/awt-swing-swt/124382-elemente-kreis-aufstellen.html#post806175 nicht?


----------



## Landei (19. Sep 2011)

Auf diese blauen, unterstrichenen Textabschnitte kann man draufklicken, und oft etwas dabei lernen. Versuche es doch einfach mal, tut auch nicht weh! Hier noch einmal der bereits von Marco vorgeschlagene: http://www.java-forum.org/awt-swing-swt/124382-elemente-kreis-aufstellen.html

[Edit] Oooch, zu langsam...


----------



## Schaaaf (19. Sep 2011)

Sorry...alles klar.... Hab es jetzt so versucht :


```
double x,y;
x = x0 - d/2*Math.cos(360/e); 
y = y0 + d/2*Math.sin(360/e);
```

Wobei, x0,y0 der Mittelpunkt ist, e die Anzahl der Ecken und d der Durchmesser des Kreises ist.

Das sieht auch erstmal ganz ok aus...Aber dann komme ich nicht weiter...

Also, ich habe mit obigem den ersten Punkt (z.B. eines Dreiecks) rausbekommen und diese mit meinem (freigewähltem) Startpunkt verbunden. Nun suche ich den dritten Punkt... Aber weiß nicht genau, was ich in der Formel verändern muss..


----------



## Andi_CH (20. Sep 2011)

Was willst du denn? Glaskugelmagie hilft auch nicht weiter.

Zeichnen - was hast du denn schon als GUI?


----------



## SpagettiMonster (20. Sep 2011)

Ich würde alle Punkte berechnen, nicht nur 1 ...

[Java]

for(int i = 1 ; i <= e ; i++) {
     new Point p;
     p.setX( x0 - d/2*Math.cos(360/e *i) ); 
     p.setY( y0 + d/2*Math.sin(360/e *i) );
     pointArray_ = p;
}
.
.
.
paintMethode(pointArray);

[/Java]

Oder ne Liste oder oder oder..._


----------



## Andi_CH (20. Sep 2011)

So nebenbei - aber es passt ja in etwa zum Thema: Bin ich blind oder gibt es wirklich keine vorgefertigte polar <-> rechtwinklig Transformation?


----------



## Landei (20. Sep 2011)

Ja, du bist blind  [c]Math.atan2[/c], [c]Math.hypot[/c]


----------



## Andi_CH (20. Sep 2011)

Landei hat gesagt.:


> Ja, du bist blind  [c]Math.atan2[/c], [c]Math.hypot[/c]




```
int x = (int)(Math.cos(a) * radius);
int y = (int)(Math.sin(a) * radius);
```

Das habe ich natürlich auch aber zu einem Punkt würde IMHO ein Konstruktor mit Distanz und Winkel gehören, genau so wie entsprechende getter. Na ja, Java ist halt alles andere als Vollständig 

So -es ist TO -Fütterungszeit 

Not fully tested and not optimzed! 


```
import java.awt.Point;
import java.util.Vector;

public class Vieleck {
	private final int abstand;
	private Vector<Point> points = new Vector<Point>();

	public Vieleck(int radius) {
		abstand = radius;
	}

	private void log(double ang, int x, int y) {
		System.out.println("Neuer Punkt: Winkel = " + Math.toDegrees(ang) + " Grad, X = " + x + ", Y = " + y);
	}

	public void generatePolygon( int anzahl) {
		points.removeAllElements();
		final double angle = Math.toRadians(360.0 / anzahl);
		for(double a=0.0; a<2*Math.PI; a+=angle) {
			int x = (int)(Math.cos(a) * abstand);
			int y = (int)(Math.sin(a) * abstand);
			log(a, x, y);
			points.add(new Point(x, y));
		}
	}

	@Override
	public String toString() {
		return points.toString();
	}

	public static void main(String[] args) {
		Vieleck ve = new Vieleck(10);
		for (int i=1; i<=4; i++) {
			ve.generatePolygon(i);
			System.out.println(ve);
		}
	}
}
```


----------



## Schaaaf (21. Sep 2011)

Vielen Dnk für eure Mühe und Ausdauer... Habe jetzt alles nach meinen Vorstellungen umgesetzt. Danke


----------

