Terdapat 2 cara utnuk mendeteksi suatu lintasan yaitu dengan deteksi koordinat lintasan dan deteksi warna piksel lintasan (tidak dibahas di panduan ini).
Gerakan obyek dilakukan dengan transformasi translasi seperti yang sudah dibahas sebelumnya,yakni :
X’=x+Tx dan y’=y+Ty
Lintasan dengan titik deteksi lintasan dapat diilustrasikan dibawah ini
1. obyek bergerak dari lintasn datar menuju lintasan miring/menanjak
2. Pada lintasan menanjak ini, obyek bergerak miring mengikuti jalur lintasan dan kemirinan obyek juga akan berubah sesuai sudur miring lintasan
Sudut ini akan memiliki 3 fungsi, yakni
- membuat sudut lintasan
- menentukan arah gerakan vertikal. Dimana akan menentukan Ty (faktor penggeseran vertikal)
- sudut putar dari obyek krn harus mengikuti sudut lintasan seperti yang lazim terjadi di dunia nyata.
Faktor Ty ini dapat dihitung dari Tx (pada program Tx=transformasi,dengan transformasi adalah faktor translasi mendatar)
Ty=Tx*tan q
Diatas adalah sedikit teori yang membingungkan tentang program yang akan kita buat, langsung saja ya teman-teman
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.GeneralPath;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.*;
public class Gabungan7_1 extends JFrame{
private JPanel buttonPanel;
private Mobil gambar;
private JButton btGerak;
public JTextField masukan;
private int faktor, a;
public float Ax2,Bx2,Cx2;
public int Ty;
public int sensorDepan, sensorBelakang;
public float lintasan,sudut,sudut_b,sudut_c;
Timer timer = new Timer();
public Gabungan7_1() {
super("Mobil Genius");
gambar= new Mobil();
gambar.setBackground(Color.white);
btGerak = new JButton( "Start" );
btGerak.addActionListener(new ActionListener() {
public void actionPerformed( ActionEvent event ) {
gerakkan(true);
}
});
buttonPanel = new JPanel();
buttonPanel.setLayout( new GridLayout( 1, 1 ) );
buttonPanel.add(btGerak);
Container container = getContentPane();
container.add( gambar, BorderLayout.CENTER );
container.add( buttonPanel, BorderLayout.SOUTH);
setSize(800, 500);
setVisible( true );
}
public static void main( String args[] ){
Gabungan7_1 application = new Gabungan7_1();
application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
}
class putar extends TimerTask{
private boolean mundur;
public void run() {
try{
//faktor=Integer.parseInt(masukan.getText());
if(mundur){
a -= faktor;
gambar.draw(Mobil.GERAK, a);
if(sensorBelakang <= 40)
mundur = false;
}else
{
if(sensorDepan>Ax2 && sensorDepan<=Bx2)
sudut=sudut_b;
else if(sensorDepan>Bx2)
sudut=sudut_c;
else
sudut=0;
a += faktor;
gambar.draw(Mobil.GERAK, a);
if(sensorDepan >= Cx2)
gerakkan(false);
//mundur=true;
//mundur = true;
}
}catch(Exception e){}
}
}
public void gerakkan(boolean laju){
if(laju){
faktor=1;
timer.schedule(new putar(), 0, 50);
}
else if (laju == false)
faktor=0;
}
class Mobil extends JPanel {
public final static int GERAK = 1;
private int shape;
int transformasi = 0;
Color warna,warna1;
@Override
public void paintComponent( Graphics g ) {
super.paintComponent( g );
Graphics2D g2=(Graphics2D) g ;
//koordinan klintasan
float Ax1,Ay1,Ay2,Bx1,By1,By2,Cx1,Cy1,Cy2,Asdt,Bsdt;
//lintasan A
Ax1=50;Ay1=400;
Ax2=300;Ay2=400;
//lintasan B
Bx1=Ax2;By1=Ay2;
Bx2=400;By2=200;
//lintasan C
Cx1=Bx2;Cy1=By2;
Cx2=800;Cy2=400;
//hitung sudur lintasan B
float B_dx=Bx2-Bx1;
float B_dy=By2-By1;
float sudut_rad_b=(float) Math.atan(B_dy/B_dx);
sudut_b=- (sudut_rad_b/3.14f)*180f;
//hitung sudut lintasan C
float C_dx=Cx2-Cx1;
float C_dy=Cy2-Cy1;
float sudut_rad_c=(float) Math.atan(C_dy/C_dx);
sudut_c=-(sudut_rad_c/3.14f)*180f;
// Rangka Mobiil
int mX1 = 90, mY1 = 390;
int mX2 = 180, mY2 = 390;
int mX3 = 90, mY3 = 350;
float sudut_rad=-((sudut/180f)*3.14f);
float cos_sdt=(float) Math.cos(sudut_rad);
float sin_sdt=(float) Math.sin(sudut_rad);
float fmX1=(float) mX1;
float fmY1=(float) mY1;
float fmX2=(float) mX2;
float fmY2=(float) mY2;
float fmX3=(float) mX3;
float fmY3=(float) mY3;
float ffmX1= fmX1*cos_sdt-fmY1*sin_sdt ;
float ffmY1= fmX1*sin_sdt+fmY1*cos_sdt;
float ffmX2= fmX2*cos_sdt-fmY2*sin_sdt ;
float ffmY2=fmX2*sin_sdt+fmY2*cos_sdt;
float ffmX3= fmX3*cos_sdt-fmY3*sin_sdt ;
float ffmY3= fmX3*sin_sdt+fmY3 *cos_sdt;
//titik pusat putar di titik 1
float dx= ffmX1-fmX1;
float dy= ffmY1-fmY1;
fmX1=ffmX1-dx;
fmY1=ffmY1-dy;
fmX2=ffmX2-dx;
fmY2=ffmY2-dy;
fmX3=ffmX3-dx;
fmY3=ffmY3-dy;
mX1=(int) fmX1;
mY1=(int) fmY1;
mX2=(int) fmX2;
mY2=(int) fmY2;
mX3=(int) fmX3;
mY3=(int) fmY3;
//hitung perubahan gerak vertukal
double trf=(double) transformasi;
if(sensorDepan>Ax2 && sensorDepan<Bx2 )
Ty= (int) ((trf-Bx1+100)*Math.tan(sudut_rad));
else if(sensorDepan>=Bx2)
Ty= (int) ((trf-Cx1-320)*Math.tan(sudut_rad));
Polygon mobil = new Polygon();
mobil.addPoint(mX1 + transformasi, mY1+Ty );
mobil.addPoint(mX2 + transformasi, mY2+Ty );
mobil.addPoint(mX3 + transformasi, mY3+Ty );
warna = new Color(80, 164, 245);
g2.setColor(warna);
g2.fill(mobil);
g2.drawPolygon(mobil);
int R1_x=mX1 + transformasi+15;
int R1_y=mY1+Ty-5 ;
int R2_x=R1_x+40;
int R2_y=R1_y;
Stroke ban =new BasicStroke(8);
g2.setStroke(ban);
warna = new Color(0, 0, 0);
Ellipse2D roda1=new Ellipse2D.Double(R1_x,R1_y,15,15);
Ellipse2D roda2=new Ellipse2D.Double(R2_x,R2_y,15,15 );
g2.setColor(warna);
g2.setPaint(warna);
g2.draw(roda1);
g2.draw(roda2);
//pembuana lintasa
warna1 = new Color(50, 0, 50);
Stroke lbjalan =new BasicStroke(10,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND);
//Lintasan
GeneralPath lintas=new GeneralPath();
lintas.moveTo(Ax1,Ay1);
lintas.lineTo(Ax2,Ay1);
lintas.lineTo(Bx2,By2);
lintas.lineTo(Cx2,Cy2);
g2.setStroke(lbjalan);
g2.setColor(warna1);
g2.setPaint(warna1);
g2.draw(lintas);
String str="Mobil :"+ String.valueOf(sensorDepan)+"-->"+String.valueOf(sudut);
g2.drawString(str, 130 + transformasi, 420);
//sensor depan dan belakang
sensorDepan = mX2+transformasi ;
sensorBelakang = mX1+transformasi ;
if ( shape == GERAK){
transformasi += faktor;
}
}
public void draw( int shapeToDraw, int fak) {
shape = shapeToDraw;
transformasi = fak;
repaint();
}
}
}
Hasil yang akan di keluarkan :
SEMOGA BERMANFAAT
1 comments:
Write commentsmampir kesini bentar ah. sekalian belajar.. :D
Reply