| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3360 人关注过本帖
标题:[讨论]用java实现精确画任意曲线
只看楼主 加入收藏
closer
Rank: 1
等 级:新手上路
帖 子:76
专家分:0
注 册:2004-5-25
收藏
 问题点数:0 回复次数:6 
[讨论]用java实现精确画任意曲线

不知道算不算 难题

请教

搜索更多相关主题的帖子: java 曲线 难题 讨论 
2004-05-30 21:02
lhn_lhn
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2004-5-25
收藏
得分:0 

我记得有本java书叫java foundation classes,就是《java基础类库》,上面详细介绍了各种几何图形的做法。

画任意曲线当然也是可以了,可惜我忘记了具体用哪个类了。我用过java里面的这些类,总的感觉来说不太好用,就是不能够做到很好精确。

2004-05-31 09:19
closer
Rank: 1
等 级:新手上路
帖 子:76
专家分:0
注 册:2004-5-25
收藏
得分:0 

是啊 java的鼠标响应 好象 扫描率 比较低的

用鼠标事件 快速的画 任意曲线的话 就会 很 不精确


2004-05-31 10:49
jellen
Rank: 1
等 级:新手上路
威 望:1
帖 子:107
专家分:0
注 册:2004-5-3
收藏
得分:0 

用一小段一小段直线模拟吧,只要间距足够小,精度还是可以的。

我以前在C和VB里就是这样实现画任意函数图象的,Java还没有试过。


再见,理想!
2004-06-17 19:44
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

大家看看我写的这道作业题。

程序实现画一个函数曲线

函数 y = a + b*x + c*x*x + d*x*x*x + e*x*x*x*x;

其中 a, b, c, d, e 为该函数的系数。 大家可以通过按键来动态改变设置各系数,从而改变图形。比如按下 a 键,系数a 以 0。1 为单位增加, shift + a, 则是 0。1 为单位减少。

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

public class DrawMyFunction extends Canvas { static final Color BG_COLOR = Color.WHITE; static final Color FG_COLOR = Color.BLACK; double a = -2.2, b =-2.3, c = 1, d = 1.5, e = 0.1; final double SCHRITTE = 0.1;

DrawMyFunction() { setBackground(BG_COLOR); addKeyListener(new MyKeyListener()); setFocusable(true); requestFocus(); }

public void paint(Graphics g) { int width = getSize().width; int xRaster = width/18; width = xRaster*18;

int height = getSize().height; int yRaster = height/18; height = yRaster*18; setForeground(FG_COLOR);

// draw x-axis g.drawLine(0, height/2, width, height/2); for(int ix = xRaster; ix<width; ix += 2*xRaster) g.drawLine(ix, height/2, ix, height/2-5); g.drawString("0", width/2-10, height/2+15); g.drawString("2", width-xRaster-5, height/2+15); g.drawString("x", width-10, height/2-5); g.drawString("-2", xRaster-5, height/2+15);

// draw y-axis g.drawLine(width/2, 0, width/2, height); for(int iy = yRaster; iy<height; iy += 2*yRaster) g.drawLine(width/2, iy, width/2+5, iy); g.drawString("4", width/2-10, yRaster+5); g.drawString("-4", width/2-20, height-yRaster+5); g.drawString("y", width/2+10, yRaster+5);

// draw koeffiziente NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMaximumFractionDigits(2); String sExpression = "a=" + nf.format(a) + " b=" + nf.format(b) + " c=" + nf.format(c) + " d=" + nf.format(d) + " e=" + nf.format(e); g.drawString( sExpression, 5, height-5);

// draw the function double x_step = 4./(8*2*xRaster-1); double y_step = 8./(8*2*yRaster-1); double x, y;

int x0, y0, x1, y1; x0 = xRaster; x = -2; y = a + b*x + c*x*x + d*x*x*x + e*x*x*x*x; y0 = (y>=0)?(height/2-(int)(y/y_step+0.5)):(height/2+(int)(Math.abs(y)/y_step+0.5)); x += x_step; for( ;x<=2; x += x_step) { x1 = x0+1; y = a + b*x + c*x*x + d*x*x*x + e*x*x*x*x; y1 = (y>=0)?(height/2-(int)(y/y_step+0.5)):(height/2+(int)(Math.abs(y)/y_step+0.5));

g.drawLine(x0, y0,x1, y1); x0 = x1; y0 = y1; } } public static void main(String [] args) { JFrame window = new JFrame("Draw my function"); window.setSize(560, 400); window.setLocation(100,100); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.getContentPane().add(new DrawMyFunction()); window.setVisible(true); } //----------------------------------------------- class MyKeyListener extends KeyAdapter { public void keyPressed(KeyEvent ke) { if(ke.getKeyChar()=='A') a = a - SCHRITTE; if(ke.getKeyChar() == 'a') a = a + SCHRITTE; if(ke.getKeyChar()=='B') b = b - SCHRITTE; if(ke.getKeyChar() == 'b') b = b + SCHRITTE; if(ke.getKeyChar()=='C') c = c - SCHRITTE; if(ke.getKeyChar() == 'c') c = c + SCHRITTE; if(ke.getKeyChar()=='D') d = d - SCHRITTE; if(ke.getKeyChar() == 'd') d = d + SCHRITTE; if(ke.getKeyChar()=='E') e = e - SCHRITTE; if(ke.getKeyChar() == 'e') e = e + SCHRITTE; repaint(); } } }


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2004-06-18 10:53
closer
Rank: 1
等 级:新手上路
帖 子:76
专家分:0
注 册:2004-5-25
收藏
得分:0 

啊! 不错!

整理到 源代码 区了


2004-06-18 11:16
jellen
Rank: 1
等 级:新手上路
威 望:1
帖 子:107
专家分:0
注 册:2004-5-3
收藏
得分:0 

我用我上面说的方法写了一个画:y = sin(x)图象的程序,只要改一下函数,就可以画任何函数图象了。 大家可以参考一下:

import java.awt.*; import javax.swing.*; import java.awt.geom.*; import java.util.*;

class MyPanel extends JPanel { ArrayList lines = new ArrayList(); double x = 20.0 - 200.0; double y = 50*Math.sin(Math.toRadians(x)) + 100.0; double px, py; MyPanel() { lines.ensureCapacity(720); for(int i = 0; i < 720; i++) { px = x + 1; py = 50*Math.sin(Math.toRadians(px)) + 100.0; lines.add(new Line2D.Double(x, y, px, py)); x = px; y = py; } } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.setColor(Color.BLUE); int size = lines.size(); for(int i = 0; i < size; i++) g2.draw((Line2D)lines.get(i)); } }

class PaintFrame extends JFrame { MyPanel panel = new MyPanel(); PaintFrame() { setTitle("PaintFrame"); setSize(410, 240); setResizable(false);

getContentPane().add(panel); } }

public class Paint { public static void main(String[] args) { PaintFrame jellen = new PaintFrame(); jellen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jellen.show(); } }


再见,理想!
2004-06-18 13:23
快速回复:[讨论]用java实现精确画任意曲线
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022844 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved