Avatar billede h0vler Nybegynder
30. marts 2004 - 20:54 Der er 6 kommentarer og
1 løsning

variable vHjul might not have been initialized

Jeg er ved at lave et program, der skal simulere styretøjet på en bil i forbindelse med min uddannelse.
programmet er bygget op af nogle metoder, en af dem skal beregne vHjul, som er en vinkel. Beregningen laves i en motode fordi den skal bruges flere gange. Tidliger havde jeg lavet hele beregningen der hvor den skal bruges, og dengang virkede programmet.
Variablen vHjul bliver brugt i en anden metode, der skal tegne hjulene og nogle hjælpelinier.
Jeg har prøvet at sætte vHjul = 0 i starten af programmet, det hjælper ikke.
Jeg bruger NetBeans IDE 3.5.1
Avatar billede arne_v Ekspert
30. marts 2004 - 21:03 #1
Vi skal se noget kode for at kune forklare det.
Avatar billede h0vler Nybegynder
30. marts 2004 - 21:11 #2
her er det væsenligste af koden.
...
public class steering21 extends javax.swing.JFrame {
    int position, vinkel;
    double vinkelFor, vinkelBag, stodstang;
    double vHjul;
    int xpos = 50, ypos = 50;
    double tandstangFor = 184.65; //målt
    double hjulafstandFor = 600; //antaget, fra bilens midte til hjulet
    double stodstangFor; //skal beregnes i steering2
    double hjulopFor = 49; //antaget
    double tandstang_aksel = 100; //antaget
    double ackermanVinkel = 0.261799387799; //0.1745329252; //antaget (10 grader)
    /** Creates new form steering2 */
    public steering21() {
        initComponents();
        laengdeStodstang(ackermanVinkel, tandstang_aksel, hjulafstandFor);
        stodstangFor = stodstang;
    }
...
    public void paint(){
        Graphics page = getGraphics();
        page.setColor(Color.white);
        page.fillRect(0, 67, 604, 398);
        page.setColor(Color.black);
       
        /** Følgende kode tegner rettet i hjørnet af programmet */
        int x1, y1, x2, y2;
        double v2;
        v2 = (double)(vinkel) / 180 * Math.PI;

        page.drawOval(5, 80, 50, 50); //Her tegnes to cirkler
        page.drawOval(6, 81, 48, 48);

        /* Beregn to punkter, som egerne i rettet skal gå ud til. Der er 90
        *grader mellem de 2 eger*/
        x1 = (int)(23 * Math.cos(5 * Math.PI / 4 + v2));
        y1 = (int)(23 * Math.sin(5 * Math.PI / 4 + v2));
        x2 = (int)(23 * Math.cos(-Math.PI / 4 + v2));
        y2 = (int)(23 * Math.sin(-Math.PI / 4 + v2));
       
        page.drawLine(30, 105, 30 - x1, 105 - y1);//tegner en eger
        page.drawLine(30, 105, 30 - x2, 105 - y2);
       
        paintBox(280, 160, vinkel, 1);
        paintBox(320, 160, -vinkel, 0);
       
        //vinkelBag =vinkelFor * (double)(position) * 0.01;
        //paintBox(270, 300, vinkelBag);
        //paintBox(330, 300, vinkelBag);
    }
    private void paintBox(int xp, int yp, int vinkel, int venstre){
        int x1, y1, x2, y2, x3, y3, x4, y4;
        double bredde = 4, radius = 12, vHjul;
        double h, v;
        int xLinie, yLinie;
        Graphics page = getGraphics();
        /* Beregn afstanden fra midten af hjulet og ud til hjørnerne
        (der er lige langt alle steder)*/
        h = Math.sqrt(bredde * bredde + radius * radius);
        /* Beregn vinklen mellem x-aksen og vektoren, der går ud til hjørnet i
        *den første kvadrant*/
        v = Math.atan(radius / bredde);
       
        vJul(vinkel, ackermanVinkel, tandstang_aksel, stodstangFor, hjulopFor);
       
        /* Hvis der er tale om højre forhjul, skal v2 være negativ.*/
        page.setColor(Color.red);
        if (venstre == 0){
            vHjul = -vHjul;
            if (vHjul < 0){
                xLinie = 270;
                yLinie = -(int)(270 * Math.tan(vHjul));
                page.drawLine(xp, yp, xp + xLinie, yp + yLinie);
            } else {
                xLinie = -330;
                yLinie = (int)(300 * Math.tan(vHjul));
                page.drawLine(xp, yp, xp + xLinie, yp + yLinie);
            }
        }
        if (venstre == 1){
            if (vHjul > 0){
                xLinie = -270;
                yLinie = (int)(270 * Math.tan(vHjul));
                page.drawLine(xp, yp, xp + xLinie, yp + yLinie);
            } else {
                xLinie = 330;
                yLinie = -(int)(300 * Math.tan(vHjul));
                page.drawLine(xp, yp, xp + xLinie, yp + yLinie);
            }
        }
        page.setColor(Color.black);

        /* beregn koordinater til hjørnerne på hjulet. Bemærk at punkt 2 er
        *en spejling af 1 i y-aksen (den y-akse, der drejer med hjulet)*/
        x1 = (int)(h * Math.cos(v - vHjul));
        y1 = (int)(h * Math.sin(v - vHjul));
        x2 = (int)(h * Math.cos(Math.PI- v - vHjul));
        y2 = (int)(h * Math.sin(Math.PI- v - vHjul));
        x3 = (int)(h * Math.cos(v + Math.PI - vHjul));
        y3 = (int)(h * Math.sin(v + Math.PI - vHjul));
        x4 = (int)(h * Math.cos(-v - vHjul));
        y4 = (int)(h * Math.sin(-v - vHjul));
        xpos = xp;
        ypos = yp;

        /* linierne tegnes, xpos og ypos lægges til fordi x1, y1 osv. beskriver
        *hjulet i et relativt koordinatsystem */
        page.drawLine(x1 +xpos, y1 +ypos, x2 +xpos, y2 +ypos);
        page.drawLine(x2 +xpos, y2 +ypos, x3 +xpos, y3 +ypos);
        page.drawLine(x3 +xpos, y3 +ypos, x4 +xpos, y4 +ypos);
        page.drawLine(x4 +xpos, y4 +ypos, x1 +xpos, y1 +ypos);
    }
    private void laengdeStodstang(double vAcker, double a, double h){
        /* Denne funktion skal bruge arckermanVinkel som input på første plads,
        *a er afstenden mellem "akslen" og tandstangen, og h er afstanden mellem
        *hjulets centrum, og der hvor stødstangen virker.
        */
        stodstang = Math.sqrt((600+h*Math.sin(vAcker)-184.65)*(600+h*Math.sin(vAcker)
        -184.65)+(a-h*Math.cos(vAcker))*(a-h*Math.cos(vAcker)));
    }
    private void vJul(int vRat, double vAcker, double a, double s, double h){
        /*vRat = så meget, som derer drejet på rettet. vAcker = ackermanVinkel.
        *a = Afstanden mellem "akslen" og tandstangen. s = længden af stødstangen.
        *h = afstenden fra hjulets centrum til der, hvor stødstangen virker.
        */
        double v3, v4, m, vHjul;
        m = Math.sqrt(a*a + (600 - (184.65 + 0.1608 * (double)(vRat)))*(600 -
        (184.65 + 0.1608 * (double)(vRat))));
        /* 600 er havdelen af sporvidden (skal rettes hvis hjulophæng ænder det)
        *184.65 er halvdelen af tandstangens længde.
        *0.1608 er en konstant, der giver forholdet mellem drejning på rettet
        *og tandstangens position.
        */
        v3 = Math.acos((m*m + h*h - s*s) / 2 / m / h);
        v4 = Math.asin(a / m);
        vHjul = Math.PI / 2 + vAcker - v3 - v4;
    }
...
Avatar billede arne_v Ekspert
30. marts 2004 - 21:19 #3
Prøv og ændre:
...
double vHjul;
...
double bredde = 4, radius = 12, vHjul;
...
til:
...
double vHjul = 0;
...
double bredde = 4, radius = 12;
...
Avatar billede h0vler Nybegynder
30. marts 2004 - 21:29 #4
Tak for hjælpen. Jeg havde bare defineret vHjul to gange. Jeg skal vist lige æve mig lidt mere i det her java.
Avatar billede arne_v Ekspert
30. marts 2004 - 21:37 #5
Så ligger jeg et svar
Avatar billede arne_v Ekspert
12. april 2004 - 20:36 #6
Lukke tid ?
Avatar billede h0vler Nybegynder
13. april 2004 - 19:42 #7
det er i orden
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Lead DevSecOps

AP Pension

Løsningsarkitekt

Unik System Design A/S

DevOps Engineer