JAVA的OPENGL,JOGL入门例子(三)-----点斜控制(2D)



package com.jogl.second; 

import java.awt.BorderLayout;

import java.awt.Component;

import java.awt.Dimension;

import java.awt.HeadlessException;

import java.awt.Toolkit;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.media.opengl.GLCanvas;

import javax.media.opengl.GLCapabilities;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JTextField;

import javax.swing.SwingUtilities;

import com.sun.opengl.util.Animator;

import com.sun.opengl.util.FPSAnimator;

 

publicclassLineGraphAppextendsJFrameimplements ActionListener{

     LineGLEventListener listener = newLineGLEventListener();  //初始化我们的GLEventListener

     GLCanvas glcanvas=null;

     JTextField ajtf = newJTextField("3", 3);              //定义一个输入框   ajtf

     JTextField bjtf = newJTextField("2", 3);              //定义一个输入框   bjtf

     JTextField mjtf = newJTextField("-1", 6);             //定义一个输入框   mjtf

 

     publicstaticAnimator animator=null;

 

     public LineGraphApp() throws HeadlessException {

         super("点斜计算");

         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         JPanel jp = newJPanel();                          //定义一个JPANEL

         jp.add(newJLabel("x:"));                          //给JPANEL添加JLabel

        jp.add(ajtf);                                      //给JPANEL添加输入框ajtf

        jp.add(newJLabel("   y:"));                       //给JPANEL添加JLabel

        jp.add(bjtf);                                      //给JPANEL添加输入框

        jp.add(newJLabel("   slope: "));                  //给JPANEL添加JLabel

        jp.add(mjtf);                                      //给JPANEL添加输入框

        JButton jb = newJButton("重画");                  //定义一个按钮

        jb.addActionListener(this);                        //给按钮添加事件

        jp.add(jb);                                        //给JPANEL添加一个按钮  

        getContentPane().add("South", jp);                 //给窗体添加JPANEL,位置为南

        GLCapabilities glcaps = newGLCapabilities();      //定义GL渲染

          GLCanvas canvas = newGLCanvas(glcaps);           //定义GLCanvas

             canvas.addGLEventListener(listener);           //给GLCanvas添加GLEventListener

             getContentPane().add(canvas, BorderLayout.CENTER);     //给窗体添加GLCanvas,位置为中

            

             animator=newFPSAnimator(canvas,20,true);      //初始化FPSAnimator动画线程,每秒20帧

             setSize(500, 300);

             centerWindow(this);

        

     }

 

     privatevoid centerWindow(Component frame) {           //居中窗体

         Dimension screenSize =

                Toolkit.getDefaultToolkit().getScreenSize();

             Dimension frameSize  = frame.getSize();

             if (frameSize.width  > screenSize.width )

                frameSize.width  = screenSize.width;

             if (frameSize.height > screenSize.height)

                frameSize.height = screenSize.height;

             frame.setLocation (

                 (screenSize.width  - frameSize.width ) >> 1,

                 (screenSize.height - frameSize.height) >> 1

             );

        

     }

 

     publicstaticvoid main(String[] args) {

         finalLineGraphApp app = newLineGraphApp();

        // 显示窗体

        SwingUtilities.invokeLater (

            new Runnable() {

                publicvoid run() {

                    app.setVisible(true);

                }

            }

        );

       

        //动画线程开始

        SwingUtilities.invokeLater (

                new Runnable() {

                  publicvoid run() {

                  animator.start( );

                  

                  

                  }

                }

              );

     }

 

 

     publicvoid actionPerformed(ActionEvent e) {        //按钮的动作

 

         listener.a = Double.parseDouble( ajtf.getText() );            //获得ajtf输入框的值,给listener

         listener.b = Double.parseDouble( bjtf.getText() );            //获得bjtf输入框的值,给listener

         listener.m = Double.parseDouble( mjtf.getText() );            //获得mjtf输入框的值,给listener

 

     }

 

}

 

 



 

 

 

package com.jogl.second;

 

import javax.media.opengl.GL;

import javax.media.opengl.GLAutoDrawable;

import javax.media.opengl.GLEventListener;

import javax.media.opengl.glu.GLU;

 

publicclassLineGLEventListenerimplements GLEventListener {

 

     publicdouble m = -1;

     publicdouble a = 3;

     publicdouble b = 2;

     float red;

     float green;

     float blue;

 

     publicvoid display(GLAutoDrawable arg0) {

         GL gl = arg0.getGL();

         drawGraph(gl);                     //预先画上背景,也就是网格和两轴。

 

         red = 1.0f;

         green = 0.2f;

         blue = 0.2f;

         gl.glColor3f(red, green, blue);     //设置画图的颜色,也就是画刷颜色

         //

         gl.glBegin(GL.GL_POINTS);

         double a1 = a * 10;

         double b1 = b * 10;

         for (int x = -250; x <= 250; x++) {

              gl.glVertex2d(x, (m * (x - a1) + b1));        //画点,看起来像一条斜线

         }

         gl.glEnd();

         //

         red = 1.0f;

         green = 1.0f;

         blue = 1.0f;

         gl.glColor3f(red, green, blue);

         gl.glPointSize(4.0f);

         //

         gl.glBegin(GL.GL_POINTS);

         gl.glVertex2d(a1, b1);    //画你输入的端点

         gl.glEnd();

         //

         gl.glPointSize(2.0f);     //设置点的大小为2.0f     

     }

 

     privatevoid drawGraph(GL gl) {

         float red;

         float green;

         float blue;

         gl.glClear(GL.GL_COLOR_BUFFER_BIT);

       red = 0.3f;

         green = 0.3f;

         blue = 0.3f;

         gl.glColor3f(red, green, blue);      

         // 画网格

         gl.glBegin(GL.GL_LINES);

         // 先画水平线

         for (int x = -250; x <= 250; x += 10) {

              gl.glVertex2d(x, -150);

              gl.glVertex2d(x, 150);

         }

         // 画直线

         for (int y = -150; y <= 150; y += 10) {

              gl.glVertex2d(-250, y);

              gl.glVertex2d(250, y);

         }

         gl.glEnd();

         // 画 x轴 和 y轴

         red = 0.0f;

         green = 0.3f;

         blue = 0.5f;

         gl.glColor3f(red, green, blue);

         gl.glBegin(GL.GL_LINES);

         gl.glVertex2d(0, 140);

         gl.glVertex2d(0, -140);

         // line for x-axis

         gl.glVertex2d(240, 0);

         gl.glVertex2d(-240, 0);

         gl.glEnd();

    

         // 画X轴和Y轴的箭头

         gl.glBegin(GL.GL_TRIANGLES);

         gl.glVertex2d(0, 150);

         gl.glVertex2d(-5, 140);

         gl.glVertex2d(5, 140);

         gl.glVertex2d(0, -150);

         gl.glVertex2d(-5, -140);

         gl.glVertex2d(5, -140);

         gl.glVertex2d(250, 0);

         gl.glVertex2d(240, -5);

         gl.glVertex2d(240, 5);

         gl.glVertex2d(-250, 0);

         gl.glVertex2d(-240, -5);

         gl.glVertex2d(-240, 5);

         gl.glEnd();

     }

 

     publicvoid displayChanged(GLAutoDrawable arg0, boolean arg1, boolean arg2) {

 

 

     }

 

     publicvoid init(GLAutoDrawable arg0) {

         GL gl = arg0.getGL();

         GLU glu = newGLU();                               //定义GLU

         gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);           //设置背景颜色,0,0,0为黑

         gl.glLineWidth(2.0f);                              //设置线宽

         gl.glPointSize(2.0f);                              //设置点的大小

         gl.glViewport(-250, -150, 250, 150);               //设置可视区域

         gl.glMatrixMode(GL.GL_PROJECTION);                 //设置场景平滑

         gl.glLoadIdentity();                                     

         glu.gluOrtho2D(-250.0, 250.0, -150.0, 150.0);     

         //使坐标系统出现的GL里,从X轴-250到250,从Y轴-150到150

 

     }

 

     publicvoid reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3,

              int arg4) {

        

 

     }

 

}

运行效果:多点从例子里找到乐趣,只要你喜欢,比如把点的颜色改为全随机颜色,画垂直线等等。



 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值