📄 新建 文本文档.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 + -