1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Deutsch
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

AsciiImage - Linien zeichnen mit Arrays

  • emptyvi
  • 14. Mai 2008 um 17:41
  • Unerledigt
  • emptyvi
    14
    emptyvi
    Logo 2012, Platz 2.
    Reaktionen
    102
    Punkte
    2.037
    Beiträge
    374
    • 14. Mai 2008 um 17:41
    • #1

    Hi!

    Ich bins mal wieder :winking_face:

    Hab diesmal folgendes Problem: Wir sollen ein Programm schreiben, dass ein Charakter Array erstellt, und dann mit der Funktion drawLine Linien zeichnen kann. Ich habe ein Problem mit der AsciiImage Klasse, da das im Drawline-Komplex aufgerufene AsciiImageObjekt anscheinend nicht von oben übernommen kann.. Alle anderen Probleme hab ich mal soweit ausgemerzt, auch wenn in der Formel zur Linienzeichnung sicher gröbere Logikfehler sind. Der Algorythmus ist der Bresenhams line algorythm:


    Java
    import java.util.Scanner;
    
    
    class AsciiAplication
    {
        public static void main(String[] args)
        {
            Scanner arraydaten = new Scanner(System.in);
            int breite = arraydaten.nextInt();
            int hoehe = arraydaten.nextInt();
            AsciiImage bildi = new AsciiImage(breite, hoehe);
    
    
            int x0 = arraydaten.nextInt();
            int y0 = arraydaten.nextInt();
            int x1 = arraydaten.nextInt();
            int y1 = arraydaten.nextInt();
            String ch1 = arraydaten.next();
            char[] ch2 = ch1.toCharArray();
            char ch = ch2[0];
    
    
            bildi.drawLine(x0, y0, x1, y1, ch);
            bildi.toString();
    
            while(arraydaten.hasNext())
            {
    
    
            x0 = arraydaten.nextInt();
            y0 = arraydaten.nextInt();
            x1 = arraydaten.nextInt();
            y1 = arraydaten.nextInt();
            ch1 = arraydaten.next();
            ch2 = ch1.toCharArray();
            ch = ch2[0];
    
    
            bildi.drawLine(x0, y0, x1, y1, ch);
            bildi.toString();
            }
        }
    }
    Alles anzeigen


    Java
    import java.lang.Math;
    
    
    class AsciiImage
    {
        private int breite;
        private int hoehe;
        private int x0;
        private int y0;
        private int x1;
        private int y1;
        private char ch;
        private int y;
        private String toString;
    
        AsciiImage(int breite, int hoehe)
        {
            this.breite = breite;
            this.hoehe = hoehe;
    
    
            char[][] AsciiImage = new char[hoehe][breite];
    
    
            for(int i = 0; i<hoehe; i++)
            {
                for(int j = 0; j<breite; j++)
                {
                    AsciiImage[i][j] = '-';
                }
            }
        }
    
    
        
        public void clear()
        {
    
    
            char[][] AsciiImage = new char[hoehe][breite];
    
    
            for(int i = 0; i<hoehe; i++)
            {
                for(int j = 0; j<breite; j++)
                {
                    AsciiImage[i][j] = '-';
                }
            }
        }
    
    
    
        public void drawLine(int x0, int y0, int x1, int y1, char ch)
        {
            this.x0 = x0;
            this.y0 = y0;
            this.x1 = x1;
            this.y1 = y1;
            this.ch = ch;
    
    
            boolean steep = Math.abs(this.y1 - this.y0) > Math.abs(this.x1 - this.x0);
            if(steep)
            {
                swap(this.x0, this.y0);
                swap(this.x1, this.y1);
            }
            if(x0 > x1)
            {
                swap(this.x0, this.x1);
                swap(this.y0, this. y1);
            }
            int deltax = this.x1 - this.x0;
            int deltay = Math.abs(this.y1 - this.y0);
            int error = -deltax / 2;
            int ystep;
            int y = this.y0;
            this.y = y;
    
    
            if(this.y0 < this.y1)
            {
                ystep = 1;
            }
            else
            {
                ystep = -1;
            }
    
    
            for( ; this.x0<=this.x1; this.x0++)
            {
                if(steep)
                {
                    AsciiImage[this.y][this.x0] = this.ch;
                }
                else
                {
                    AsciiImage[this.x0][this.y] = this.ch;
                }
    
    
                error = error + deltay;
                if(error > 0)
                {
                    y = y + ystep;
                    error = error - deltax;
                }
            }
        }
    
    
        private void swap(int a, int b)
        {
            int tausch = a;
            a = b;
            b = tausch;
        }
    
    
        public String toString()
        {
            for(int i=0; i<this.hoehe; i++)
            {
                for(int j=0; j<this.breite; j++)
                {
                    this.toString = this.toString + AsciiImage[i][j];
                }
                this.toString = this.toString + "\n";
            }
            return this.toString;
        }
    
    }
    Alles anzeigen


    Bin für jede Hilfe dankbar,


    L.G.: emptyvihttp://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm


    ¤¸¸.•´¯`•¸¸.•..>> Join the herd, join "My Little Pony @ TU-Wien" <<..•.¸¸•´¯`•.¸¸¤
    ¤¸¸.•´¯`•¸¸.•..>> (100% Twilight Sparkle approved) <<..•.¸¸•´¯`•.¸¸¤


    PP-Tutor WS2011 - WS2014
    EVC-Tutor SS2015


  • Vevusio
    6
    Vevusio
    Mitglied
    Reaktionen
    1
    Punkte
    371
    Beiträge
    71
    • 14. Mai 2008 um 21:42
    • #2

    uhm du machst in deinem constructor ein 2d char array namens "AsciiImage"

    diese variable hat nur einen lokalen gültikgeitsbereich (existiert nur innerhalb vom constructor) und in der drawLine funktion gibt es diese variable nicht mehr also kannst du auch nicht auf sie zugreifen so wie du es dir vorstellst

    du musst dieses 2d char array zu den member variablen (attributen) der klasse dazuhauen damit es innerhalb der instanz deiner klasse für alle methoden bekannst ist

    das kompiliert ja auch sicher nicht oder? ich denke java sollte dich die variable garnicht so nennen lassen wie die klasse (klasse heißt AsciiImage und dieses 2d char array heißt auch AsciiImage)

    man sollte variablennamen immer kleinschreiben und du solltest dem eher nen namen geben wie "imageData" oder so

    also auf die art

    Code
    class AsciiImage
    {
        char[][] imageData = null;
       ....
    
    
        public AsciiImage()
        {
            imageData = new char[...][...]; // statt .. halt was auch immer für dimensionen du haben willst
        }
    
    
        pubilc drawLine(Point start, Point end, char fillCharacter)
        {
            ....
            imageData[...][...] = fillCharacter;
        }
    }
    Alles anzeigen

    und gleichzeitig macht es auch nicht viel sinn diese ganzen variablen die du nur innerhalb von nur einer funktion immer brauchst in den klassen scope (klassen variablen = member variablen = attribute) zu hauen

    zb der string toString, es reicht wenn du den einfach nur in die toString() methode reintust und nicht in die klasse gleich (du brauchst ihn ja nur in toString()) - abgesehen davon wäre "imageString" oder so auch nen besserer name als toString

    [FONT=Arial, Helvetica, sans-serif](\__/) [/FONT]
    [FONT=Arial, Helvetica, sans-serif] (='.'=) [/FONT]This is Bunny. Copy Bunny into your signature to help
    [FONT=Arial, Helvetica, sans-serif](")_(")[/FONT] him on his way to world domination.

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung

  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  • Deutsch
  • English
Zitat speichern