Minggu, 01 Juni 2014

Rian Saadillah

Menggerakkan animasi mengikuti lintasan

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 
  1. membuat sudut lintasan
  2. menentukan arah gerakan vertikal. Dimana akan menentukan Ty (faktor penggeseran vertikal)
  3. 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 

Rian Saadillah

About Rian Saadillah -

Author Description here.. Nulla sagittis convallis. Curabitur consequat. Quisque metus enim, venenatis fermentum, mollis in, porta et, nibh. Duis vulputate elit in elit. Mauris dictum libero id justo.

Subscribe to this Blog via Email :

1 comments:

Write comments
Unknown
AUTHOR
4 Juni 2014 pukul 21.51 delete

mampir kesini bentar ah. sekalian belajar.. :D

Reply
avatar