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;
}
...