Drehbares 9-Eck

Folgende Aufgabe wurde von hellboy19 gestellt:

1) Schreibe ein Programm wo mit Hilfe von Polygonen ein 9-Eck gezeichnet wird
2) Mit einem Linksklick soll es anfangen sich langsam nach links zu drehen. Je öfter man klickt, desto schneller wird die Drehung.
3) Bei einem Rechtsklick soll es widerum langsamer werden (also wie beim schneller werden, jeöfter man klickt) bzw sich (nach dem Stillstand) nach rechts drehen.

Anstatt Links- oder Rechtsklick können natürlich auch irgendwelche Butons o.ä. verwendet werden.
 
Original von ivegotmail
In diesem Forum werden in unregelmäßigen Abständen neue Programmieraufgaben gestellt, die von euch gelöst werden sollen.

Die Aufgaben werden meist so gestellt sein, dass sie mit einer beliebigen Programmiersprache gelöst werden können. Das heißt wir programmieren hier keine 3D-Engines, sondern konzentrieren uns eher auf mathematische oder ähnliche Probleme die euer Hirn etwas fordern.
*ohne worte*
 
Abgesehen davon das ein 9-Eck (genauso wie ein Dreieck, Viereck,...) ein Polygon ist und das eine solche Darstellung nur mit einer 3D-Engine möglich ist, bzw man sie dann selber schreiben müsste (wenns um die Mathematik geht)...
 
Ein drehendes Polygon braucht doch keine 3D-Engine... läuft schließlich alles in einer Ebene ab ;)
 
sehr witzig ;)
Aber wo soll das mathematische Problem sein? Wenn es ja nicht um die Grafik geht...

Wenn es um die Mathematik ginge, wäre die Aufgabenstellung anders. Es ist nämlich egal, wie "schnell" es sich dreht. Es wäre gegeben, um welchen Punkt es sich dreht und ob es sich in der Ebene oder im Raum dreht. Und vor allem wäre es egal ob 9-Eck oder Gerade und die Grafik wäre überflüssig...
 
Es ist ja auch nur Schwierigkeitsstufe 1, und für Anfänger keine schlechte Aufgabe. Schon wie man die Animation unabhängig von der Framerate macht bereitet einigen Probleme. Dazu noch Sinus/Cosinus, verschachtelte For-Schleife und Mauseingabe Auswertung.
Die mathematischen Probleme sind Sin/Cos und die Drehung des 9-Ecks.
 
Ich zitiere auch einmal:

"beliebige programmiersprache"

Das heisst für mich, dass ich jede Sprache verwenden kann, die ich kenne. In PHP ist dies meiner Meinung nach nicht möglich. Bei dieser Aufgabe geht es ganz klar um das Programmieren einer Oberfläche, die auf Ereignisse reagiert, somit werden schon einige Sprachen ausgeschlossen. Mathematisch mag es ja sein, genauso wie die Einstufung "Schwierigkeit 1", allerdings, wie gesagt, ist es nicht mit jeder Sprache lösbar.

Aber trotzdem nette, einfache Aufgabe. Werde mich bei Zeit mal dransetzen und mich in java dran versuchen.
 
Original von fetzer Das heisst für mich, dass ich jede Sprache verwenden kann, die ich kenne. In PHP ist dies meiner Meinung nach nicht möglich.

Wie kommst du denn darauf? Klar kann man mit php Bilder erstellen! Da kann man dann auch Poligone verwenden. ;)

MfG
freak
 
Original von freak4fun
Original von fetzer Das heisst für mich, dass ich jede Sprache verwenden kann, die ich kenne. In PHP ist dies meiner Meinung nach nicht möglich.

Wie kommst du denn darauf? Klar kann man mit php Bilder erstellen! Da kann man dann auch Poligone verwenden. ;)

MfG
freak

Und jetzt dreh das ganze bitte mal, wenn die rechte Maustaste gedrückt wird ;)
 
Ich bin dabe, ist aber gar nicht so einfach. :( Ich übergebe dem Bild dann den startparameter und dann dreht sich das Polygon entsprechend. (Oder sollte zumindest :D).

MfG
freak
 
So schwer ist das nicht die Matrizenformeln und Starhlensätze gibts haufenweise im I-net man muss sie nurnoch in ein Programm umsetzen. Ich seh in der Aufgabe kein Problem.

MFG -=HKA=-
 
So, ich hab endlich mein erstes Java-Programm (eigentlich ist es ein Applet) fertig :D
Im Zip-Archiv befinden sich Quellcode, HTML-Datei und Applet.

Wenn man in den rechten Teil des Fensters klickt, dreht sich das ganze schneller nach links (bzw. langsamer nach rechts), im linken Teil andersherum.

Code:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class neuneck extends Applet implements Runnable, MouseListener
{
    int[] polyx = {0,0,0,0,0,0,0,0,0};
    int[] polyy = {0,0,0,0,0,0,0,0,0};
    int wpos;
    int add = 0;
    int speed = -1;
    private Image dbImage;
    private Graphics dbg;

    public void init()
    {
        setBackground(Color.white);
        addMouseListener(this);
    }

    public void start()
    {
        // Schaffen eines neuen Threads, in dem das Spiel läuft
        Thread th = new Thread(this);
        th.start();
    }

    public void stop()
    {
    }

    public void destroy()
    {
    }

    public void run()
    {
        while(true)
        {
            wpos = 0;
            add += speed;

            for(int i=0; i<9; i++) {
                polyx[i] = 200 + (int)(Math.sin(Math.toRadians(wpos+add)) * 100);
                polyy[i] = 200 + (int)(Math.cos(Math.toRadians(wpos+add)) * 100);

                wpos += 40;
            }

            repaint();

            try {
                Thread.sleep(50);
            } catch(InterruptedException e) {
                // do nothing
            }
        }
    }

    public void paint(Graphics g)
    {
        g.drawPolygon(polyx, polyy, polyx.length);
        g.drawString("Rechts", 100, 100);
        g.drawString("Links", 270, 100);
    }

    public void update(Graphics g)
    {
        if(dbImage == null) {
            dbImage = createImage(400, 400);
            dbg = dbImage.getGraphics();
        }

        dbg.setColor(getBackground());
        dbg.fillRect(0, 0, 400, 400);

        dbg.setColor(getForeground());
        paint(dbg);

        g.drawImage (dbImage, 0, 0, this);
    }

    public void mouseClicked(MouseEvent e)
    {

    }

    public void mouseEntered(MouseEvent e)
    {

    }

    public void mouseExited(MouseEvent e)
    {

    }

    public void mousePressed(MouseEvent e)
    {
        if(e.getX() < 200)
            speed--;
        else
            speed++;
    }

    public void mouseReleased(MouseEvent e)
    {

    }

    public void mouseMoved(MouseEvent e)
    {
    }

    public void mouseDragged(MouseEvent e)
    {
    }
}
 
Die Logik hier ist eigentlich auch ganz einfach. Man braucht die 9 Punkte nur mit sinus bzw. cosinus rotieren lassen und Linien dazwischen einzeichnen.
 
Zurück
Oben