⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 新建 文本文档.txt

📁 linux下的clock()使用例子 一个很简单的例子,可以拿去稍修改
💻 TXT
字号:
 基本图形生成算法(一)



    摘要:这个是直线的扫描转换-数值微分法。
首先是算出直线的斜率 k = dy / dx

       dx = x1 - x0, dy = y1 - y0, (x0 ,y0)和(x1, y1)分别是直线的端点坐标。然后从直线的起点开始,确定最佳逼近直线的y坐标。假定端点坐标均为整数,让x从起点到终点变化,每步递增1,计算对应的y坐标,y = kx + B, 并取象素(x, round(y)). 用这种方法既直观,又可行,然而效率较低。因此, 当dx = 1时,有yi+1 = yi + k,即当x每递增1时,y递增k(即直线斜率)。

        一开始,我们取直线起点(x0, y0)作为初始坐标,这样就可以写出直线扫描转换的数值微分算法(Digital Differertial Analyzer 简称DDA) 下面的关键算法

int x0 = 0 , y0 = 0 , x1 = 600, y1 = 350;
  g.setColor(Color.red);
  
  
   int x, temp;
   float dx, dy, k, y;
   dx = x1 - x0;
   dy = y1 - y0;
   k = dy / dx;
   y = y0;
   for (x = x0; x <= x1; x++) {
    temp = (int)(y + 0.5);
    //System.out.println(temp);
    g.drawLine(x, (int)y, x + 1, temp);
    y = y + k;
  }


////////////////////////////////////////////////////////
关于图形学中的代码!


//控制台的一个类

import javax.swing.*;
import java.awt.event.*;

public class Console{
 // Create a title string from the class name:
 public static String title(Object o){
  String t = o.getClass().toString();
  // Remove the word "class":
  if(t.indexOf("class")!=-1)
   t = t.substring(6);
  return t;
 }
 
 public static void setupClosing(JFrame frame){
  // The JDK1.2Solution as an
  // anonymous inner class:
  frame.addWindowListener(new WindowAdapter(){
   public void windowClosing(WindowEvent e){
    System.exit(0);
   }
  });
  // The improved solution in JDK 1.3:
  // frame.setDefaultCloseOperation
  //  JFrame.EXIT_ON_CLOSE);
 }
 
 public static void run(JFrame frame,int width,int height){
  setupClosing(frame);
  frame.setSize(width,height);
  frame.setVisible(true);
 }
 
 public static void run(JApplet applet,int width,int height){
  JFrame frame = new JFrame(title(applet));
  setupClosing(frame);
  frame.getContentPane().add(applet);
  frame.setSize(width,height);
  applet.init();
  applet.start();
  frame.setVisible(true);
 }
 
 public static void run(JPanel panel,int width,int height){
  JFrame frame = new JFrame(title(panel));
  setupClosing(frame);
  frame.getContentPane().add(panel);
  frame.setSize(width,height);
  frame.setVisible(true);
 }
}///:~~

//把 关键算法 复制到paintComponent()这个方法里面便可运行

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;

class SineDraw extends JPanel {
 static final int SCALEFACTOR = 200;
 int cycles;
 int points;
 double[] sines;
 int[] pts;
 SineDraw() {
  setCycles(5);
 }
 
 public void setCycles(int newCycles) {//关键算法

  }
  
  repaint();
 }
 
 
 public void paintComponent(Graphics g) {
  int x0 = 0 , y0 = 0 , x1 = 600, y1 = 350;
  g.setColor(Color.red);
  
  
   int x, temp;
   float dx, dy, k, y;
   dx = x1 - x0;
   dy = y1 - y0;
   k = dy / dx;
   y = y0;
   for (x = x0; x <= x1; x++) {
    temp = (int)(y + 0.5);
    //System.out.println(temp);
    g.drawLine(x, (int)y, x + 1, temp);
    y = y + k;
    System.out.println(temp);
  }
  
 }
}

class Line extends JApplet {
 SineDraw sines = new SineDraw();
 JSlider cycles = new JSlider(1, 30, 5);
 public void init() {
  Container cp = getContentPane();
  cp.add(sines);
  cycles.addChangeListener(new ChangeListener() {
   public void stateChanged(ChangeEvent e) {
    sines.setCycles(((JSlider)e.getSource()).getValue());
   } 
  });
  cp.add(BorderLayout.SOUTH, cycles);
 }
 
 public static void main(String[] args) {
        Console.run(new SineDraw(), 700, 400);
    } 
}


//////////////////////////////////////////////////
摘要:这个是中点画线算法!!  
基本图形生成算法(二) 
假设直线的起点和终点分别是(x0, y0)和(x1, y1)。

则直线方程为:   F(x, y) = ax + bx + c =0

其中a = y0 - y1,b = x1- x0, c = x0y1 - x1y0.对于直线上的点,F(x, y) = 0;对于直线上方的点,F(x, y)>0;

而对于直线下方的点,F(x, y) < 0.设M是两个象素的中点 

因此构着判别式

d = F(M) = F(xp + 1, yp + 0.5) = a(xp + 1) + b(yp + 0.5) + c

当d<0时和d>=0时分别取不同的下一个象素点

则下一个点的判别式

d>=0时d1 = F(xp + 2, yp + 0.5) = a(xp+ 2) + b(yp + 0.5) + c = d+ a

d<0时 d2 = F(xp + 2, yp + 1.5) = a(xp + 2) + b(yp + 1.5) + c = d + a + b

再看d的初值d0 = F(x0, y0) + a + 0.5b = a + 0.5b

//关键算法

g.setColor(Color.red);
  int x0 = 0 , y0 = 0 , x1 = 600, y1 = 350;
  
   int a, b, delta1, delta2, d, x, y, temp1 = x0, temp2 = y0;
   a = y0 - y1;
   b = x1 - x0;
   d = 2 * a + b;
   delta1 = 2 * a;
   delta2 = 2 * (a + b);
   x = x0;
   y = y0;
   while(x < x1) {
    if(d < 0) {
     temp1++;
     temp2++;
     d += delta2;
    } else {
     temp1++;
     d += delta1;
    }
    
    g.drawLine(x, y, temp1, temp2);
    x = temp1;
    y = temp2;
    //System.out.println(y);
   }
  g.drawLine(50, 0, 650, 350);



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -