新普金娱乐网址



Trump第一各夫人伊凡(伊凡)娜3:奥地利凡外一个星球上的国度

Java 2D尖端绘图

  • 十二月 16, 2018
  • 数学
  • 没有评论

图片 1

知要:

文/金水木木

先是省 Java 2D的增长效率

—1—

概述、AWT图形能力的供不应求、Java 2D API

临到元日,接到一个特殊电话。之所以意料之外首要仍然盖电话这头的凡我暑假指引的奇异学生,这时执意要退学的少年说假诺失去市里参加奥数比赛。

仲节 图形绘制的大旨格局

二〇一九年暑假最为暖时,四姨硬给自己加了千篇一律份坚苦的家教补习,刚进来医院实习的自每一日过的比如就是筋疲力尽,在自回绝了N次之后,那么些顽劣少年都入住我家。直到有天电话这头又叨叨,说自姨家就这样一个孙,这才十二年度不读书能干嘛,不上学全人生还损坏了。我心痛又纠结,最终不得不妥协,收生了这有些屁孩。

更换Graphics2D对象、Graphics 类特性、绘图的性与中坚编程方法

自己之计划好粗略,既然是暑假就是无必要学的可是多,领会方法就足足了,先让他自己戏几天,我及大姨子领悟情状常惊呆了,说他外甥以蠢又笨,考试无会超越五十,每一回都是二三十,每一次试验完试回家都会合叫三弟训斥,可及最后一点打算还未从,这等同次等,孩子铁了心灵不要学了。

老三节 曲线问题之高等级应用开发

深谙了亮仔的景色未来,我起来开相应的计划。前几乎天可能是新鲜感的来由吧,这一个东西也克以得下马,就是未惦记效仿在先的东西,只想效仿新的。他的世界里知识且第一不佳才新鲜,从前的学问就是是他无会面之接触啊感觉是留饭般的餐的无味。

直线问题深切啄磨、贝塞尔(Bezier)曲线、自定义样条曲线编程、

—2—

用户数量的曲线显得、曲线用Applet展现的多少来问题

一致完美未来,针对复习内容我受他出了千篇一律学试卷,我以为他都会合了的事物,最终评分52分开。他说霎时是外随即同一年被数学的最高分,给丰硕了我之颜。这时候的自己吃一个孩做得倾家荡产,有接触罔知所措。

季省 字符串的高级处理

黄昏时段,大嫂来拘禁亮仔,走时哭着拜托我,孩子战绩好欠好无所谓,好歹让他朗诵毕中学,现在匪读书只可以在家呆着,过上几乎年特别组成部分了重复未达到出来打工也能勉强令人口放心。

TextLayout类、LineMetrics类

抑或第一不佳看到这么的叔叔二姑,为人口上下为子女操碎了内心。我主宰重新试试走上前亮仔的心灵深处。

第五节 构造几哪样子

图片 2

2D几啥地方样子的规划、构造型区域几哪样子、变换、缓冲的图像

图片来自网络

第六节 三维图形处理的计划技术

夜幕,我将在考卷回亮仔的屋里。这孩子看看分数以后无动于衷,说好就是是此水平。说在说着没有脚,然后叫自己咋舌的凡,我还无说他即使伸出手说:“你打自己吧,我精通这么的分给您发火了。”作为一个高等高校还并未毕业的本人转来了先辈的觉得,起初好面前的立即等同粗但。顺手搬了将椅子在外书桌前坐下,他也转身站立,一称即将挨训的神情。我叫他放轻松。这同样不良,不为二姨和导师的地点而是因为朋友学生的地点与他权且一权。

透视投影、透视图形的显得、隐蔽面消除问题

“亮仔你精晓为,四姨我上学时啊平常可是关,然而平昔没摈弃学习,现在才起时机学自己喜好的标准。”
“我听不进去了,感觉上课是种植折磨”
“能和自己说说为啥非思上呢?不欣赏听课?仍然为模仿非会合?”
“每便都考,考不佳就是受打,中学的科目变多了,被起啊改成了见惯司空。”面前的斯傲娇小王子于戳中软肋哭的专门难受“不喜发火的大伯姑姑,很可怕。”
“在我家住这一点而不用操心,只要你想模仿咱就学,我承担指引你莫相会责骂你,只是要你变太难为。”

第七节 同条件互相

自身说得了事后显得仔哭的双重不佳过了,我认为是外的逆反才促成今之面,没悟出有因仍旧生在三叔二姨的启蒙达。

GraphicsEnvironment类、GraphicsDevice类、GraphicsConfiguration类

对接下的等同健全,狂躁的略少年竟然安静了下,连自家阿姨都直赞他懂事。后来自及四姐四弟开了交换,他俩说为是首先破当爸妈,认识及自己落后的指引措施,也代表接下去会跟亮仔多交换。

首先节省 Java 2D底增高力量

—3—

一、概述:

自当我走心的指导有了肯定的功效,可自我或者低估了这么些十二年少年的演技。

是因为Sun公司及Adobe系统公司通力合作生产的Java 2D
API,提供了一个功效强大而且分外灵活的老二维图形框架。Java 2D
API扩大了java.awt包中定义之Graphics类和Image类,提供了强性能的亚维图形、图像和仿,同时以保了对现有AWT应用的卓越。

率先不行月考,亮仔语数外三科全及格,这不过乐坏了外爸妈,在吃本人打电话的当儿自己偷偷欣喜惊讶这孩子的灵气的高但仍旧叮嘱堂妹想被孩子自低谷心情走出去不是同码易之从,希望他们可以少一些训斥多有关爱,把注意力分散到生存被变化只看在分。

次、AWT图形能力的欠缺:

吓现象不长,才了了片两全,表妹去开家长会就给助教提醒亮仔有故意不写简单修的逆反倾向被它重回多教育。正好我国庆回家,顺便就去询问了生情况。

于 AWT 的始实现着,图形能力并无怪圆。因为支付 JDK
是打算用这视作平苏州立之兑现平台,所以那多少个本来的意义为限定受“最少公共职能”上,所有被帮忙的操作系统及确保提供这么些公职能;

图片 3

于 Java 2D
出现前,对绘制能力、字体操作及图像控制的襄助大少。而针对诸如用画图举行着色、形状操作和图片变换之类的关键操作的支撑则全没。

国庆节这天,亮仔拿在一样布置35私分的试卷被自身受他签约写评语,或许为自是单不称职又未汇合和他顶牛的前辈吧。

Java 2D 满意了超平台实现中针对这多少个效应及另力量的急需。

“呦呦呦,这35分凡你考的呀,厉害了”
“这才好不容易什么,我班还发生一个考试了27分割的也罢,反正上完就同一年本人即使出去打工了”
“你都试验了三十大多了还算是尽差?我读书的上可考了个位数的口,你连自家都不如”
“这来何难?”
“这我们打个赌博,你如在半年里各科全考单位数,我虽然援助您与你爸妈说说叫您免上去发展友好之爱好,前提是试卷不克闹其它的空,也非可以字迹马虎”
“这可若说之,说话算数”

三、Java 2D API:

简言之的针对白竟然成了自转亮仔人生之冲,我精通的明亮,那么些赌注有些非常,输了吧,是亮仔的前途吧是全家对己的怪,赢了的话语就是显示仔变好学了罢了,最后,毫无教学更的自依然在和一个学生下了成千上万的赌注。

其是JFC (Java Fundation Classes)的均等各项,加强了风AWT( Abstract
Windowing Toolkit )的勾效能。在 JDK1.2遭早就匡助 Java 2D
之利用。透过Java 2D API
,程序员可以轻松地刻画出自由的几乎啥地方图形、运用不同的填色效果、对图纸做旋转(
rotate)、缩放( scale)、扭曲( shear)等。如图所示,程序员透过2D
API所提供的效果,简单地动用不同类其余线或者填色效果绘出总括图,以界别出不同的资料。

死下午,我躁狂症了,甚至,我莫敢跟二姐二哥明说自己的计划。只是被她们叫亮仔半年缓冲期,无论孩子分数如何,只要安心乐意想学把他留下于该校虽是水到渠成。

其是按照Graphics2D类的绘图效用,是对准AWT中之Graphics类的逾的扩充以及增进。首要反映于:

一切都在朝正在自身计划的自由化前进,无论是周考依然月考,他的分一向还在不高不低的悬挂在,从五六十及三四十,却总达不至二十的边界线。意料中的凡那时良三分钟热度的男孩仍然为了考个位数很尽力的于习,六只月后,对习的极其厌恶变成了针对性只位数的酷渴望,兴趣火花起首现身。

1。对渲染质地之主宰:消除锯齿以平滑绘制对象的边缘

元朔前夕,亮仔波兰语取得有史以来最低分16,打电话来和自家汇报。说他就将达到目的线了,假诺做只让几区划的说话外虽暴发把握把加泰罗尼亚语分数控制在只位数。

2.推、合成和透明度:它们允许使用任意形状来界定绘制操作的界限。它们还提供对图纸举办分层和控制透明度和无透明度的力。

自家问话他这么自信的说辞,他说以完型阅读甚至填词写外还了然正确答案,只可是是明知故犯填错时态而已,电话就匹我生是兴奋,因为自之计划成了先河,怎奈现在子女的想法实在太过头简短,他无亮堂,个号数实际与类满分卷的性一样。

3.操以及填充简单与复杂的形制:这种效能提供了一个 Stroke 代理及一个
Paint
代理,前者定义用来绘制形状概况的笔(定义绘制的笔的宽和体裁),后者允许用纯色、渐变色和美术来填充形状。

亮仔的指导暂时得到的令人满足的坚守,未来的路途该如故不会晤尽顺利,我想有矣感兴趣后,我者幕后的教育工作者便会吃代了。

4。图像处理与换:Java 2D 同 Java 高级图像 API(Java Advanced Imaging
API (JAI))协作,襄助用大方图形格式处理千头万绪的图像。Java 2D
还为而提供了修改图像、形状和书字符的转移能力。

—4—

5。特殊的填情势,如梯度或者图案

教育心思学探讨已经声明:每个孩子接受外界条件之激励或压力都发肯定的度。在斯界限内,父母给予刺激、压力的强度和子女的“内驱力”成正比,压力就会成重力。假诺跨越了此界限,就会师促成孩子做出相反的举动,从而破罐子破摔。

6.高等字体处理及字符串格式化:允许象操作任何其余图形形状一样操作字体字符。除之之外,可以形象文字处理程序一样,通过也
String 中的字符应用性能和体裁信息来成立格式化文本。

基于美利哥教育心境学家的钻研“男孩易为非议影响,女孩易为称誉影响”,对于男孩,可适用采取一些激将法,对于女孩,则尽量少用激将法,以尊重互换教育为主。

java.awt.geom 包中的Areas类支援联集( union)、交集(
intersection)、差集(subtraction )、Exclusive OR
(XOR)等布尔运算。最後, AffineTransform
系列则提供图片物件做Scale(比例)、Shear(剪裁)
、Rotate(旋转)等座标上的转移。

在此间我而说的凡,即便对亮仔的傅得的有些底功能,对于迎接反劲头特足的孩子的话,让她们违反也正是一个好法子。当然啦,我连无提议每人家长都由此这种措施来教育子女,可是,我备感对于逆反的男女来说拔取激将法也可以当做同种植无奈之良策。

亚节 图形绘制的中坚方法

一、转换Graphics2D对象

绘制图形时,可以在Graphics对象要Graphics2D对象及展开,它们都代表了用绘图的区域,选拔大在是否要使用所扩大的Java2D的图样效用。但假使留意的凡,所有的Java2D图形操作都要在Graphics2D对象及调用。Graphics2D是Graphics的子类,同样包含在java.awt包中。

public void paintComponent(Graphics comp)

{ Graphics2D comp2D=(Graphics2D)comp;

}

或者

public void paint (Graphics comp)

{ Graphics2D comp2D=(Graphics2D)comp;

}

二、Graphics 类特性

Graphics 类辅助两种确定图形环境状态的表征。以下列出了一些特色:

1)Color:当前绘制颜色,它属于 java.awt.Color
类型。所有的绘图、着色和纯文本输出都拿因为指定的颜料展现。

2)Font:当前字,它属于 java.awt.Font
类型。它是拿用来所有纯文本输出的字。

3)Clip:java.awt.Shape
类型的靶子,它充当用来定义几何地样子的接口。该特性包含的形态定义了图环境的区域,绘制将功能为该区域。通常情形下,这无异形状及整图形环境一致,但为并不一定如此。

4)ClipBounds:java.awt.Rectangle 对象,它象征以包由 Clip 特性定义的
Shape 的极致小矩形。它是才读特性。

5)FontMetrics:java.awt.FontMetrics
类型的独读特性。该对象涵盖关于图形环境遭到时打功用的 Font
的音讯。如同大家拿看到底那么,获取之音的这种体制已经为 LineMetrics
类所代表

6)Paint Mode:该特性决定环境下时颜色之艺术。如若调用了
setPaintMode() 方法,那么有绘制操作都用利用时颜色。尽管调用了
setXORMode() 方法(该办法赢得一个 Color
类型的参数),那么尽管因而指定的水彩对诸如素做“XOR”操作。XOR
具有在重新绘制时回升起首位模式之特征,因此它们深受看做橡皮擦除同动画片操作。

老三、绘图的属性与骨干编程方法

1)颜色Color类:没有成形。

2)填充格局:

Paint(油漆桶)
接口有两只具体的贯彻,它们允许用纯色、渐变色或图案来填充形状。

1,纯色填充(Color类):对 java.awt.Color 类做了有的调动以实现
Paint,并且能够用于纯色填充。

2,渐变色来填充(梯度填充GradientPaint类):java.awt.GradientPaint
类允许用线性颜色渐变色来填充形状,线性颜色渐变色允许以点滴个指定的 Color
对象期间创设过渡。可以用逐步变色设置成“周期性的”,这将致渐变色图案重复出现。

3,图案填充(纹理TexturePaint类):提供了 java.awt.TexturePaint
类,它好就此由 BufferedImage 描述的图案填充形状

编程方法:

拔取Graphics2D类中之setPaint()方法并采取Paint对象作为该参数,但出于此外能够看成填充的类设GradientPaint、TexturePaint和Color都落实了Paint接口(该接口注意定义了当Graphics2D下之颜色填充形式),因而可以它当参数。如:

public void paintComponent(Graphics comp)

{ Graphics2D comp2D=(Graphics2D)comp;

GradientPaint pat=new
GradientPaint(0f,0f,Color.white,100f,45f,Color.blue);

comp2D.setPaint(pat);

}

3)设置笔的象:

Stroke 接口由 java.awt.BasicStroke
类实现。该类允许开展大气的取舍因修改线的绘图细节。可以编程指定
BasicStroke
宽度,也可指定对号称也支柱和交点的途径上端点和交点的“装饰”。现在呢足以绘制点划线了,只须安装
BasicStroke 的破折号属性即可。

于Graphics类中线条是一个点方便,而于Graphics2D中好透过BasicStoke类中的setStroke()方法来装。其构造函数是BasicStroke(float
width, int cap, int join)

中间width提示线宽(缺省时为1.0)

cap提醒线之后(大庆,在BasicStroke类中定义有三独static
类型的常量如CAP_BUTT没有赣州( )、CAP_ROUND圆包头(
)、CAP_SQUARE方包头( )的样式

join提醒线段之间的曲(在BasicStroke类中定义来两个static
类型的常量如JOIN_BEVEL( )、JOIN_MITER( )、 JOIN_ROUND(
)样式。

4)编程方法:

public void paintComponent(Graphics comp)

{ Graphics2D comp2D=(Graphics2D)comp;

BasicStroke pen

=new BasicStroke(2.0f, BasicStroke .CAP_BUTT, BasicStroke
.JOIN_ROUND);

comp2D.setStroke (pen);

}

代码示例:

float thick = 0.5f; //设置画刷的粗细为 0.5

BufferedImage bi = new BufferedImage(800, 600,
BufferedImage.TYPE_INT_RGB);

Graphics2D g = (Graphics2D)bi.getGraphics();

Stroke stroke = g.getStroke(); //拿到时之画刷

g.setStroke(new BasicStroke(thick, BasicStroke.CAP_SQUARE,
BasicStroke.JOIN_ROUND));

g.draw(new Line2D.Float(x1, y1, x2, y2)); 画线

g.setStroke( stroke ); //将画刷复原

5)成立而绘制的形态对象

于Java2D中举办绘图时,不是使对应之法来落实,而是为要促成有负形创制有相应的貌对象。这足以经过行使java.awt.geom包着之切如今定义所假诺开创的样子。如线条Line2D.Float类、距形Rectangle2D.Float或者Rectangle2D.Double类、椭圆Ellipes2D.Float、圆弧Arc2D.Float类等。

6)绘制对象:

1,能够动用Graphics2D类中之主意draw()用于绘制概况,而fill()方法用于填充。它们都因前面所创立的图样对象作为参数。

2,Java2D中之字符串的绘图依旧采用drawString()方法,但有drawString(String
s, float x, float y)和drawString(String str, int x, int y)。

3,绘制概略:draw(Shape s)其中的Shape接口在Graphics2D中为定义

初的 Java 2D Shape
类都暴发“2D”后缀。这么些新的象使用浮点值(而非是整数)来叙述其几哪样子。

Polygon类(int[] xpoints, int[] ypoints, int npoints)

RectangularShape(抽象类,其子类有Arc2D, Ellipse2D, Rectangle2D,
RoundRectangle2D), Rectangle(距形)

QuadCurve2D(二不成贝塞尔样漫长曲线,贝塞尔曲线由片单端点以及一个要零星单控制点指定。贝塞尔曲线制造了合为多数表示的曲线。)

CubicCurve2D(三软贝塞尔样长达曲线)

Area(区域)

GeneralPath(由直线、二糟各样条曲线、三糟各种条曲线所组成)

Line2D

8)基本步骤

制图的首先只步骤是出 Graphics2D 对象。
然后设定所设之状态属性。例如你想虽然针对一物件做渐层式的填色,可以设定属性
Paint为
GradientPaint。最後再调用Graphics2D所提供的办法fill或是draw,完成总体绘图的次第。

9)程序实例

例一:

立是一个极端简单易行的例证,也足以当是绘图的一个但是简便的框架。

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.awt.geom.*;

public class Map extends JFrame

{ public Map()

{ super(“Map”);

setSize(350,350);

MapPane map=new MapPane();

getContentPane().add(map);

}

public static void main(String [] arg)

{ Map frame=new Map();

frame.show();

}

}

class MapPane extends JPanel

{ public void paintComponent(Graphics comp)

{ Graphics2D comp2D=(Graphics2D)comp;

comp2D.drawString(“sbcd”,200,200);

Line2D.Float line=new Line2D.Float(1.0f,2.0f,200.0f,200.0f);

comp2D.draw(line);

}

}

例二:

脚是在Graphics2D格局下的核心绘图框架。我们好观察,利用:

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,

RenderingHints.VALUE_ANTIALIAS_ON);

通过该办法的装置,使图形去除锯齿状,可以得到多细腻之图样。

样例:

import java.awt.*;

import java.awt.event.*;

import java.awt.geom.*;

public class DrawDemo extends JFrame {

public DrawDemo(){

//设置窗口的轻重、标题

this.setSize(new Dimension(600, 400));

//创设绘制各个形态的器皿

ShapesPanel shapesPanel = new ShapesPanel();

//将拖欠容器在窗口

getContentPane().add(shapesPanel, BorderLayout.CENTER);

}

public static void main(String[] args) {

DrawDemo frame = new DrawDemo();

frame.setVisible(true);

//当窗口关闭时清空内存

frame.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {

System.exit(0);

}

});

}

}

//创设各样容器的类

class ShapesPanel extends JPanel {

final int maxCharHeight = 15;

final Color bg = Color.white; //注解背景颜色也藏粉色

final Color fg = Color.blue; //评释前景颜色为藏蓝色

public ShapesPanel() {

setBackground(bg); //设置背景颜色

setForeground(fg); //设置前景颜色

//创设组合边框

setBorder(BorderFactory.createCompoundBorder(

BorderFactory.createRaisedBevelBorder(),

BorderFactory.createLoweredBevelBorder()));

}

public void paintComponent(Graphics g1) {

super.paintComponent(g1); //清空背景颜色

float thick = 0.5f; //设置画刷的粗细为 0.5

Graphics2D g = (Graphics2D)g1;

Stroke stroke = g.getStroke(); //拿到时的画刷

g.setStroke(new BasicStroke(thick, BasicStroke.CAP_SQUARE,
BasicStroke.JOIN_ROUND));

//通过该格局要图形去除锯齿状

g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,

RenderingHints.VALUE_ANTIALIAS_ON);

String txt= “我的篇章”;

int style=2;//0普通1粗体2斜体3粗斜

g.setFont(new Font(“小篆”, 2, 15)); //15为字大小

//设置笔刷为青色

g.setPaint(Color.black);

g.drawString(txt,200,150);

g.setPaint(Color.red);

g.draw(new Line2D.Float(0,0,200,150)); //画线

g.setPaint(Color.blue);

g.draw(new Rectangle2D.Float(200,150,100,100));

g.setStroke(stroke); //将画刷复原

}

}

例三:图形灵活的呈现

当方的例子中,是采纳一个持续于JPanel的好像,覆盖其的void
paintComponent(Graphics
g1)事件方,实现绘图的,这样虽便宜,但显得灵活性不愈。

其实,通过JPanel对象直接赋值给Graphics2D对象,往往可倘诺程序有所特别死的八面玲珑。程序可以这么来形容。

JPanel contentPane= (JPanel) this.getContentPane();

public Graphics2D comp2D=(Graphics2D)contentPane .getGraphics();

样例:

package myDrawDemo;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.awt.geom.*;

public class DrawDemo1 extends JFrame

{

public JPanel contentPane; //绘图窗口

public Graphics2D comp2D; //绘图对象

JPanel jPanel1 = new JPanel();//控件容器

JButton jButton1 = new JButton();

JButton jButton2 = new JButton();

//构造函数

public DrawDemo1() {

enableEvents(AWTEvent.WINDOW_EVENT_MASK);

try {

jbInit();

}

catch(Exception e) {

e.printStackTrace();

}

}

//控件的开始化

private void jbInit() throws Exception {

contentPane = (JPanel) this.getContentPane();

contentPane.setLayout(new BorderLayout());

this.setSize(new Dimension(400, 300));

this.setTitle(“Frame Title”);

//contentPane.setSize(400,240);

jPanel1.setLayout(null);

jButton1.setBounds(new Rectangle(30, 235, 100, 31));

jButton1.setText(“画线保留”);

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton1_actionPerformed(e);

}

});

jButton2.setBounds(new Rectangle(150, 235, 100, 30));

jButton2.setText(“画线删除”);

jButton2.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton2_actionPerformed(e);

}

});

contentPane.add(jPanel1, BorderLayout.CENTER);

jPanel1.add(jButton1, null);

jPanel1.add(jButton2, null);

}

public static void main(String[] args) {

DrawDemo1 frame=new DrawDemo1();

frame.show();

frame.comp2D=(Graphics2D)frame.contentPane .getGraphics();

frame.comp2D.setBackground(Color.white);

frame.comp2D.clearRect(0,0,401,221);

}

//Overridden so we can exit when window is closed

protected void processWindowEvent(WindowEvent e) {

super.processWindowEvent(e);

if (e.getID() == WindowEvent.WINDOW_CLOSING) {

System.exit(0);

}

}

void jButton1_actionPerformed(ActionEvent e){

comp2D.setPaint(Color.red);

Line2D.Float line=new Line2D.Float(1.0f,2.0f,200.0f,220.0f);

comp2D.draw(line);

}

void jButton2_actionPerformed(ActionEvent e) {

comp2D.clearRect(0,0,401,221);

comp2D.setPaint(Color.blue);

Line2D.Float line=new Line2D.Float(1.0f,100.0f,300.0f,220.0f);

comp2D.draw(line);

}

}

例四:剪裁

图形处理问题吃,剪裁由的早晚是生不便处理的,所谓剪裁是凭借跳绘图取得内容未突显,看起就是个简单问题,但由于所有的线必须总结和边界的交点,而且边界暴发四独趋势,这即便使问题易得慌复杂。java
2D不胜好的解决了是题材,请圈下的例子。

package myDrawDemo;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.awt.geom.*;

public class DrawDemo2 extends JFrame

{

public JPanel contentPane; //绘图窗口

public Graphics2D comp2D; //绘图对象

JPanel jPanel1 = new JPanel();//控件容器

JButton jButton1 = new JButton();

JButton jButton2 = new JButton();

//构造函数

public DrawDemo2() {

enableEvents(AWTEvent.WINDOW_EVENT_MASK);

try {

jbInit();

}

catch(Exception e) {

e.printStackTrace();

}

}

//控件起头化

private void jbInit() throws Exception {

contentPane = (JPanel) this.getContentPane();

contentPane.setLayout(new BorderLayout());

this.setSize(new Dimension(400, 300));

this.setTitle(“Frame Title”);

//contentPane.setSize(400,240);

jPanel1.setLayout(null);

jButton1.setBounds(new Rectangle(30, 235, 100, 31));

jButton1.setText(“画线保留”);

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton1_actionPerformed(e);

}

});

jButton2.setBounds(new Rectangle(150, 235, 100, 30));

jButton2.setText(“画线删除”);

jButton2.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton2_actionPerformed(e);

}

});

contentPane.add(jPanel1, BorderLayout.CENTER);

jPanel1.add(jButton1, null);

jPanel1.add(jButton2, null);

}

public static void main(String[] args) {

DrawDemo2 frame=new DrawDemo2();

frame.show();

frame.comp2D=(Graphics2D)frame.contentPane .getGraphics();

frame.comp2D.setBackground(Color.white);

frame.comp2D.clearRect(0,0,401,221);

}

//Overridden so we can exit when window is closed

protected void processWindowEvent(WindowEvent e) {

super.processWindowEvent(e);

if (e.getID() == WindowEvent.WINDOW_CLOSING) {

System.exit(0);

}

}

void jButton1_actionPerformed(ActionEvent e){

comp2D.setPaint(Color.red);

Line2D.Float line=new Line2D.Float(1.0f,2.0f,200.0f,220.0f);

comp2D.draw(line);

}

void jButton2_actionPerformed(ActionEvent e) {

comp2D.clearRect(0,0,401,221);

//剪裁

comp2D.setClip(50,50,300,150);

comp2D.setPaint(Color.blue);

Line2D.Float line=new Line2D.Float(1.0f,100.0f,300.0f,220.0f);

comp2D.draw(line);

}

}

老三节 曲线问题之高档应用开发

于jdk尚未支援 2D图在此以前,只堪描绘出直的、相同粗细的线条。现在足因此2D
API绘出不同粗细的线与圆滑的曲线。在java.awt.geom包着提供了Line2D、
QuadCurve2D(二不成贝塞尔曲线)及
CubicCurve2D(五次于贝塞尔曲线)等有关的类,让程序员可以轻松地画画出想只要之线。

实在绘图的基本是画线,下边通过有实例对有题目开展浓密之座谈。

一致、直线问题深入探讨

样例:

咱通过一个事例,浓密的钻研一下绘制直线与折线需要控制怎么样内容。

package myDrawDemo;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.awt.geom.*;

public class DrawDemo1 extends JFrame

{

public JPanel contentPane; //绘图窗口

public Graphics2D comp2D; //绘图对象

JPanel jPanel1 = new JPanel();//控件容器

JButton jButton1 = new JButton();

JButton jButton2 = new JButton();

JButton jButton3 = new JButton();

//构造函数

public DrawDemo1() {

enableEvents(AWTEvent.WINDOW_EVENT_MASK);

try {

jbInit();

}

catch(Exception e) {

e.printStackTrace();

}

}

//控件开首化

private void jbInit() throws Exception {

contentPane = (JPanel) this.getContentPane();

contentPane.setLayout(new BorderLayout());

this.setSize(new Dimension(400, 300));

this.setTitle(“Frame Title”);

//contentPane.setSize(400,240);

jPanel1.setLayout(null);

jButton1.setBounds(new Rectangle(30, 235, 100, 31));

jButton1.setText(“园头”);

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton1_actionPerformed(e);

}

});

jButton2.setBounds(new Rectangle(150, 235, 100, 30));

jButton2.setText(“方头”);

jButton2.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton2_actionPerformed(e);

}

});

jButton3.setBounds(new Rectangle(270, 235, 100, 30));

jButton3.setText(“封闭”);

jButton3.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton3_actionPerformed(e);

}

});

contentPane.add(jPanel1, BorderLayout.CENTER);

jPanel1.add(jButton1, null);

jPanel1.add(jButton2, null);

jPanel1.add(jButton3, null);

}

public static void main(String[] args) {

DrawDemo1 frame=new DrawDemo1();

frame.show();

frame.comp2D=(Graphics2D)frame.contentPane .getGraphics();

frame.comp2D.setBackground(Color.white);

frame.comp2D.clearRect(0,0,401,221);

}

//Overridden so we can exit when window is closed

protected void processWindowEvent(WindowEvent e) {

super.processWindowEvent(e);

if (e.getID() == WindowEvent.WINDOW_CLOSING) {

System.exit(0);

}

}

int Xs1[]={10,60,120,200,260,340};

int Ys1[]={10,200,120,180,60,130};

void jButton1_actionPerformed(ActionEvent e){

comp2D.clearRect(0,0,401,221);

//笔宽度

float thick = 10f;

//设置笔刷

//园头园连接

comp2D.setStroke(new BasicStroke(thick,

BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));

comp2D.setPaint(Color.red);

//通过该法而图形去除锯齿状

comp2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,

RenderingHints.VALUE_ANTIALIAS_ON);

comp2D.drawPolyline(Xs1,Ys1,Xs1.length);

}

void jButton2_actionPerformed(ActionEvent e) {

comp2D.clearRect(0,0,401,221);

//笔宽度

float thick = 10f;

//设置笔刷

//方头方连接

comp2D.setStroke(new BasicStroke(thick,

BasicStroke.CAP_SQUARE, BasicStroke.CAP_SQUARE));

comp2D.setPaint(Color.blue);

//通过该法要图形去除锯齿状

//comp2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,

// RenderingHints.VALUE_ANTIALIAS_ON);

comp2D.drawPolyline(Xs1,Ys1,Xs1.length);

}

void jButton3_actionPerformed(ActionEvent e) {

comp2D.clearRect(0,0,401,221);

//笔宽度

float thick = 1f;

//设置笔刷

//方头方连接

comp2D.setStroke(new BasicStroke(thick,

BasicStroke.CAP_SQUARE, BasicStroke.CAP_SQUARE));

comp2D.setPaint(Color.blue);

//通过该法而图形去除锯齿状

//comp2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,

// RenderingHints.VALUE_ANTIALIAS_ON);

//画封闭线

comp2D.drawPolygon(Xs1,Ys1,Xs1.length);

}

}

二、贝塞尔(Bezier)曲线

java 2D资的QuadCurve2D(二糟贝塞尔曲线)及
CubicCurve2D(三赖贝塞尔曲线)等相关的接近,可以很易之打起贝赛尔曲线。

QuadCurve2D为老三单数据,中间一个也控制点。

CubicCurve2D为四单数据,中间两单吗控制点。

样例:

package myDrawDemo;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.awt.geom.*;

public class DrawDemo1 extends JFrame

{

public JPanel contentPane; //绘图窗口

public Graphics2D comp2D; //绘图对象

JPanel jPanel1 = new JPanel();//控件容器

JButton jButton1 = new JButton();

JButton jButton2 = new JButton();

//构造函数

public DrawDemo1() {

enableEvents(AWTEvent.WINDOW_EVENT_MASK);

try {

jbInit();

}

catch(Exception e) {

e.printStackTrace();

}

}

//控件开首化

private void jbInit() throws Exception {

contentPane = (JPanel) this.getContentPane();

contentPane.setLayout(new BorderLayout());

this.setSize(new Dimension(400, 300));

this.setTitle(“Frame Title”);

//contentPane.setSize(400,240);

jPanel1.setLayout(null);

jButton1.setBounds(new Rectangle(30, 235, 150, 31));

jButton1.setText(“二阶贝塞尔”);

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton1_actionPerformed(e);

}

});

jButton2.setBounds(new Rectangle(200, 235, 150, 30));

jButton2.setText(“三阶贝塞尔”);

jButton2.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton2_actionPerformed(e);

}

});

contentPane.add(jPanel1, BorderLayout.CENTER);

jPanel1.add(jButton1, null);

jPanel1.add(jButton2, null);

}

public static void main(String[] args) {

DrawDemo1 frame=new DrawDemo1();

frame.show();

frame.comp2D=(Graphics2D)frame.contentPane .getGraphics();

frame.comp2D.setBackground(Color.white);

frame.comp2D.clearRect(0,0,401,221);

}

//Overridden so we can exit when window is closed

protected void processWindowEvent(WindowEvent e) {

super.processWindowEvent(e);

if (e.getID() == WindowEvent.WINDOW_CLOSING) {

System.exit(0);

}

}

void jButton1_actionPerformed(ActionEvent e){

double[] x1={50,180,300};

double[] y1={100,190,100};

comp2D.clearRect(0,0,401,221);

//笔宽度

float thick = 1f;

comp2D.setPaint(Color.red);

QuadCurve2D.Double qc=new QuadCurve2D.Double();

qc.setCurve(x1[0],y1[0],x1[1],y1[1],x1[2],y1[2]);

comp2D.draw(qc);

comp2D.drawLine((int)x1[1]-5,(int)y1[1],(int)x1[1]+5,(int)y1[1]);

comp2D.drawLine((int)x1[1],(int)y1[1]-5,(int)x1[1],(int)y1[1]+5);

comp2D.setPaint(Color.blue);

x1[1]=180;

y1[1]=30;

qc.setCurve(x1[0],y1[0],x1[1],y1[1],x1[2],y1[2]);

comp2D.draw(qc);

comp2D.drawLine((int)x1[1]-5,(int)y1[1],(int)x1[1]+5,(int)y1[1]);

comp2D.drawLine((int)x1[1],(int)y1[1]-5,(int)x1[1],(int)y1[1]+5);

}

void jButton2_actionPerformed(ActionEvent e) {

double[] x1={50,80,200,300};

double[] y1={100,70,190,100};

comp2D.clearRect(0,0,401,221);

//笔宽度

float thick = 1f;

comp2D.setPaint(Color.red);

CubicCurve2D.Double qc=new CubicCurve2D.Double();

qc.setCurve(x1[0],y1[0],x1[1],y1[1],x1[2],y1[2],x1[3],y1[3]);

comp2D.draw(qc);

comp2D.drawLine((int)x1[1]-5,(int)y1[1],(int)x1[1]+5,(int)y1[1]);

comp2D.drawLine((int)x1[1],(int)y1[1]-5,(int)x1[1],(int)y1[1]+5);

comp2D.drawLine((int)x1[2]-5,(int)y1[2],(int)x1[2]+5,(int)y1[2]);

comp2D.drawLine((int)x1[2],(int)y1[2]-5,(int)x1[2],(int)y1[2]+5);

float dash1[] = {10.0f};

//画虚线

BasicStroke dashed = new BasicStroke(1.0f,

BasicStroke.CAP_BUTT,

BasicStroke.JOIN_MITER,

10.0f, dash1, 0.0f);

comp2D.setStroke(dashed);

comp2D.setPaint(Color.darkGray);

comp2D.drawLine((int)x1[1],(int)y1[1],(int)x1[2],(int)y1[2]);

//画实线

BasicStroke stroke = new BasicStroke(1.0f);

comp2D.setStroke(stroke);

comp2D.setPaint(Color.blue);

x1[1]=180;

y1[1]=70;

x1[2]=80;

y1[2]=190;

qc.setCurve(x1[0],y1[0],x1[1],y1[1],x1[2],y1[2],x1[3],y1[3]);

comp2D.draw(qc);

comp2D.drawLine((int)x1[1]-5,(int)y1[1],(int)x1[1]+5,(int)y1[1]);

comp2D.drawLine((int)x1[1],(int)y1[1]-5,(int)x1[1],(int)y1[1]+5);

comp2D.drawLine((int)x1[2]-5,(int)y1[2],(int)x1[2]+5,(int)y1[2]);

comp2D.drawLine((int)x1[2],(int)y1[2]-5,(int)x1[2],(int)y1[2]+5);

comp2D.setStroke(dashed);

comp2D.setPaint(Color.darkGray);

comp2D.drawLine((int)x1[1],(int)y1[1],(int)x1[2],(int)y1[2]);

comp2D.setStroke(stroke);

}

}

老三、自定义样条曲线编程

当咱们得平滑多单数据样本点的时刻,贝塞尔曲线就非克满意要求了,为是,可以利用最早由美利坚合众国“波音”飞机创建公司取出来的样条曲线来成功,这种曲线所以称之为样条,是以她套了造船业中的放样原理。

各样久曲线之数学原理请参见统计机图形学,这里叫起之是由java编写的老三不善各样条曲线之事例。曲线平滑的原则是,必须经过装有的样本点,此外,不论暴发微样本点,曲线之阶次最酷也老两回于,所以是政通人和之。

这边我们得扣押出来,程序设计的人命是什么啊?数学!那是次设计在的生所在。语言就是一模一样种植标准或是一个器,要真正写来好之主次,没有牢固的数学功底,是万万无法之。

样例:

package myDrawDemo;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import java.awt.geom.*;

public class DrawCurve extends JFrame

{

public JPanel contentPane; //绘图窗口

JPanel jPanel1 = new JPanel();//控件容器

JButton jButton1 = new JButton();

JButton jButton2 = new JButton();

JButton jButton3 = new JButton();

GraphicsCurve gracu;

//构造函数

public DrawCurve() {

enableEvents(AWTEvent.WINDOW_EVENT_MASK);

try {

jbInit();

}

catch(Exception e) {

e.printStackTrace();

}

}

//控件先导化

private void jbInit() throws Exception {

contentPane = (JPanel) this.getContentPane();

contentPane.setLayout(new BorderLayout());

this.setSize(new Dimension(500,400));

this.setTitle(“Frame Title”);

//contentPane.setSize(400,240);

jPanel1.setLayout(null);

jButton1.setBounds(new Rectangle(30, 310, 100, 31));

jButton1.setText(“直线”);

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton1_actionPerformed(e);

}

});

jButton2.setBounds(new Rectangle(150, 310, 100, 30));

jButton2.setText(“样条曲线”);

jButton2.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton2_actionPerformed(e);

}

});

jButton3.setBounds(new Rectangle(270, 310, 100, 30));

jButton3.setText(“粗线条”);

jButton3.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton3_actionPerformed(e);

}

});

contentPane.add(jPanel1, BorderLayout.CENTER);

jPanel1.add(jButton1, null);

jPanel1.add(jButton2, null);

jPanel1.add(jButton3, null);

gracu=new GraphicsCurve();

}

public static void main(String[] args) {

DrawCurve frame=new DrawCurve();

frame.show();

frame.gracu.myGraphics=(Graphics2D)frame.contentPane .getGraphics();

frame.gracu.myGraphics.setBackground(Color.white);

frame.gracu.myGraphics.clearRect(0,0,500,300);

}

//Overridden so we can exit when window is closed

protected void processWindowEvent(WindowEvent e) {

super.processWindowEvent(e);

if (e.getID() == WindowEvent.WINDOW_CLOSING) {

System.exit(0);

}

}

int Xs1[]={10,60,120,200,260,340};

int Ys1[]={10,200,120,180,60,130};

//画折线

void jButton1_actionPerformed(ActionEvent e){

gracu.myGraphics.setPaint(Color.blue);

gracu.myGraphics.drawPolyline(Xs1,Ys1,Xs1.length);

}

//画样条

void jButton2_actionPerformed(ActionEvent e) {

gracu.myGraphics.setPaint(Color.red);

gracu.DrawCurves(Xs1,Ys1);

}

//画粗线

void jButton3_actionPerformed(ActionEvent e) {

//笔宽度

float thick = 10f;

//设置笔刷

//方头园连接

//gracu.myGraphics.setStroke(new BasicStroke(thick,
BasicStroke.CAP_SQUARE, BasicStroke.JOIN_ROUND));

//园头园连接

gracu.myGraphics.setStroke(new BasicStroke(thick,
BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));

gracu.myGraphics.setPaint(Color.blue);

//通过该法要图形去除锯齿状

gracu.myGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,

RenderingHints.VALUE_ANTIALIAS_ON);

gracu.myGraphics.drawPolyline(Xs1,Ys1,Xs1.length);

}

}

class GraphicsCurve

{

//绘图对象

public Graphics2D myGraphics;

public GraphicsCurve()

{

}

public GraphicsCurve(Graphics2D graphics)

{

this.myGraphics=graphics;

}

//参数表

//x数组,y数组,笔刷

public void DrawCurves(int[] xa,int[] ya)

{

int[] x, y;

double[] a, b, c;

double[] px, py, qx, qy, tt;

double[] dx, dy;

int px1,py1,px2,py2;

x=xa;

y=ya;

px1=x[0];

py1=y[0];

int n=x.length;

a=new double[n];

b=new double[n];

c=new double[n];

px=new double[n];

py=new double[n];

qx=new double[n];

qy=new double[n];

tt=new double[n];

dx=new double[n];

dy=new double[n];

int i, t, es;

double bx3, bx4, by3, by4, cx, cy;

bx4 = 0;

by3 = 0;

es = 3;

px[0] = 1;

py[0] = 1;

px[n-1] = 1;

py[n-1] = 1;

if (n>1)

{

for (i = 1;i<n;i++)

tt[i] = Math.sqrt((x[i] – x[i – 1]) * (x[i] – x[i – 1]) +
(y[i] – y[i – 1]) * (y[i] – y[i – 1]));

switch(n)

{

case 2:

break;

case 3:

for (i = 1;i<n – 1;i++)

{

a[i] = 2 * (tt[i] + tt[i + 1]);

b[i] = tt[i + 1];

c[i] = tt[i];

dx[i] = 3 * (tt[i] * (x[i + 1] – x[i]) / tt[i + 1] + tt[i +
1] * (x[i] – x[i – 1]) / tt[i]);

dy[i] = 3 * (tt[i] * (y[i + 1] – y[i]) / tt[i + 1] + tt[i +
1] * (y[i] – y[i – 1]) / tt[i]);

}

dx[1] = dx[1] – tt[2] * px[0];

dx[n – 2] = dx[n – 2] – tt[n – 2] * px[n-1];

dy[1] = dy[1] – tt[2] * py[0];

dy[n – 2] = dy[n – 2] – tt[n – 2] * py[n-1];

//注意,这是n=3的动静专有总计

px[1] = dx[1] / a[1];

py[1] = dy[1] / a[1];

break;

default:

for (i = 1;i<n – 1;i++)

{

a[i] = 2 * (tt[i] + tt[i + 1]);

b[i] = tt[i + 1];

c[i] = tt[i];

dx[i] = 3 * (tt[i] * (x[i + 1] – x[i]) / tt[i + 1] + tt[i +
1] * (x[i] – x[i – 1]) / tt[i]);

dy[i] = 3 * (tt[i] * (y[i + 1] – y[i]) / tt[i + 1] + tt[i +
1] * (y[i] – y[i – 1]) / tt[i]);

}

dx[1] = dx[1] – tt[2] * px[0];

dx[n – 2] = dx[n – 2] – tt[n – 2] * px[n-1];

dy[1] = dy[1] – tt[2] * py[0];

dy[n – 2] = dy[n – 2] – tt[n – 2] * py[n-1];

c[1] = c[1]/ a[1];

for (i = 2 ;i< n – 1;i++)

{

a[i] = a[i] – b[i] * c[i – 1];

c[i] = c[i] / a[i];

}

qx[1] = dx[1] / a[1];

qy[1] = dy[1] / a[1];

for (i = 2 ;i< n – 1;i++)

{

qx[i] = (dx[i] – b[i] * qx[i – 1]) / a[i];

qy[i] = (dy[i] – b[i] * qy[i – 1]) / a[i];

}

px[n – 2] = qx[n – 2];

py[n – 2] = qy[n – 2];

for (i = n – 3;i>=1;i–)

{

px[i] = qx[i] – c[i] * px[i + 1];

py[i] = qy[i] – c[i] * py[i + 1];

}

break;

}

for (i = 0 ;i< n – 1;i++)

{

bx3 = (3 * (x[i + 1] – x[i]) / tt[i + 1] – 2 * px[i] – px[i +
1]) / tt[i + 1];

bx4 = ((2 * (x[i] – x[i + 1]) / tt[i + 1] + px[i] + px[i +
1]) / tt[i + 1]) / tt[i + 1];

by3 = (3 * (y[i + 1] – y[i]) / tt[i + 1] – 2 * py[i] – py[i +
1]) / tt[i + 1];

by4 = ((2 * (y[i] – y[i + 1]) / tt[i + 1] + py[i] + py[i +
1]) / tt[i + 1]) / tt[i + 1];

t = 0;

while (t < tt[i + 1])

{

t = t + es;

cx = x[i] + (px[i] + (bx3 + bx4 * t) * t) * t;

cy = y[i] + (py[i] + (by3 + by4 * t) * t) * t;

px2 = (int)cx;

py2 = (int)cy;

myGraphics.drawLine(px1,py1,px2,py2);

px1 = px2;

py1 = py2;

}

}

}

}

}

季、用户数量的曲线显得

当需要用曲线表明数据的早晚,大家则可利用由厂家提供的“图表”组件,但再一次多之抑用好编写的,请仔细啄磨下的先后,当对图片设计出双重长远之知。

下的事例,大家协会一个专门处理用户数据的好像,在这么些类里,实现了用户坐标和屏幕坐标的易,同时让有了一个机关绘制坐标的点子。我们也从来行使了端大家谈谈了的样条曲线的切近实现多少平滑。例子中的多寡好来于数据库或任何任何地方,仔细的琢磨这多少个例子,可以视要我们开动脑筋,把java强大的法力及大家对问题之接头了合在一起,就可描绘起多灵活多变的次来呀!

样例:

package myDrawDemo;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.event.*;

import java.awt.geom.*;

public class DataDrawDemo extends JFrame

{

public JPanel contentPane; //控件容器

JPanel jPanel1 = new JPanel();//绘图控件

JButton jButton1 = new JButton();

JButton jButton2 = new JButton();

JButton jButton3 = new JButton();

JButton jButton4 = new JButton();

JButton jButton5 = new JButton();

JButton jButton6 = new JButton();

JButton jButton7 = new JButton();

JButton jButton8 = new JButton();

JButton jButton9 = new JButton();

JButton jButton10 = new JButton();

JTextField jText1=new JTextField();

JTextField jText2=new JTextField();

boolean kcu=true;

//用户坐标转换对象

myGraphicsData mp=new myGraphicsData();

//曲线转换对象

GraphicsCurve gracu=new GraphicsCurve();

//窗口范围

double wx1,wx2,wy1,wy2;

//构造函数

public DataDrawDemo() {

enableEvents(AWTEvent.WINDOW_EVENT_MASK);

try {

jbInit();

}

catch(Exception e) {

e.printStackTrace();

}

}

//初阶化代码

private void jbInit() throws Exception {

contentPane = (JPanel) this.getContentPane();

contentPane.setLayout(null);

this.setSize(new Dimension(650, 500));

this.setTitle(“Frame Title”);

//contentPane.setSize(400,240);

//jPanel1.setLayout(null);

jPanel1.setBounds(0,90,650,420);

jButton1.setBounds(new Rectangle(30, 20, 80, 25));

jButton1.setText(“开始”);

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton1_actionPerformed(e);

}

});

jButton2.setBounds(new Rectangle(120, 20, 80, 25));

jButton2.setText(“左移”);

jButton2.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton2_actionPerformed(e);

}

});

jButton3.setBounds(new Rectangle(210, 20, 80, 25));

jButton3.setText(“右移”);

jButton3.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton3_actionPerformed(e);

}

});

jButton4.setBounds(new Rectangle(300, 20, 80, 25));

jButton4.setText(“上移”);

jButton4.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton4_actionPerformed(e);

}

});

jButton5.setBounds(new Rectangle(390, 20, 80, 25));

jButton5.setText(“下移”);

jButton5.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton5_actionPerformed(e);

}

});

jButton6.setBounds(new Rectangle(120, 50, 80, 25));

jButton6.setText(“X扩”);

jButton6.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton6_actionPerformed(e);

}

});

jButton7.setBounds(new Rectangle(210, 50, 80, 25));

jButton7.setText(“X缩”);

jButton7.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton7_actionPerformed(e);

}

});

jButton8.setBounds(new Rectangle(300, 50, 80, 25));

jButton8.setText(“Y扩”);

jButton8.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton8_actionPerformed(e);

}

});

jButton9.setBounds(new Rectangle(390, 50, 80, 25));

jButton9.setText(“Y缩”);

jButton9.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton9_actionPerformed(e);

}

});

//样漫漫控制

jButton10.setBounds(new Rectangle(30, 50, 80, 25));

jButton10.setText(“样条”);

jButton10.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(ActionEvent e) {

jButton10_actionPerformed(e);

}

});

jText1.setBounds(new Rectangle(490, 20, 120, 20));

jText1.setText(“”);

jText2.setBounds(new Rectangle(490, 50, 120, 20));

jText2.setText(“”);

//鼠标按下侦听器

jPanel1.addMouseListener(new java.awt.event.MouseAdapter(){

public void mousePressed(MouseEvent e) {

JPanel_mousePressed(e);

}

});

//鼠标拖动侦听器

jPanel1.addMouseMotionListener(new
java.awt.event.MouseMotionAdapter(){

public void mouseDragged(MouseEvent e){

JPanel_mouseDragged(e);

}

});

//鼠标释放侦听器

jPanel1.addMouseListener(new java.awt.event.MouseAdapter(){

public void mouseReleased(MouseEvent e) {

JPanel_mouseReleased(e);

}

});

contentPane.add(jPanel1, BorderLayout.CENTER);

contentPane.add(jButton1, null);

contentPane.add(jButton2, null);

contentPane.add(jButton3, null);

contentPane.add(jButton4, null);

contentPane.add(jButton5, null);

contentPane.add(jButton6, null);

contentPane.add(jButton7, null);

contentPane.add(jButton8, null);

contentPane.add(jButton9, null);

contentPane.add(jButton10, null);

contentPane.add(jText1, null);

contentPane.add(jText2, null);

}

public static void main(String[] args) {

DataDrawDemo frame=new DataDrawDemo();

frame.show();

frame.gracu.myGraphics=(Graphics2D)frame.jPanel1.getGraphics();

frame.mp.myGraphics=(Graphics2D)frame.jPanel1.getGraphics();

frame.mp.myGraphics.setBackground(Color.white);

frame.mp.myGraphics.clearRect(0,0,650,375);

}

//第一组数

double[] Xs1=new double[]{-2,2,4,6,8,10,12,14};

double[] Ys1=new double[]{-4,10,3,14,4,10,6,7};

//第二组数据

double[] Xs2=new double[]{-1,2,4,6,8,10,12,14,16};

double[] Ys2=new double[]{1,5,7,1,13,11,4,10,8};

//这是一个画曲线的主次

void DwData()

{

//剪裁,可以尝试没有剪裁是什么表现?

mp.myGraphics.clipRect(10,10,621,351);

//由于是为此有限个目的绘图,所以应分别剪切

gracu.myGraphics.clipRect(10,10,621,351);

//清除绘图空间

mp.myGraphics.clearRect(0,0,650,375);

//用户坐标和屏幕坐标转换

mp.truemode(10,630,10,360,wx1,wx2,wy1,wy2);

//设置颜色

mp.myGraphics.setPaint(Color.darkGray);

//画边框

mp.myGraphics.drawRect(10,10,620,350);

mp.myGraphics.setFont(new Font(“黑体”, 0, 10)); //9为字大小

//画坐标

mp.axis(2,2,2,2);

//画红线

int[] x=new int[Xs1.length];

int[] y=new int[Ys1.length];

int[] myxy;

//统一实现坐标转换

for (int i=0;i<x.length;i++)

{

myxy=mp.moxy(Xs1[i],Ys1[i]);

x[i]=myxy[0];

y[i]=myxy[1];

}

if (kcu)

{

mp.myGraphics.setPaint(Color.red);

mp.myGraphics.drawPolyline(x,y,x.length);

}

else

{

gracu.myGraphics.setPaint(Color.red);

gracu.DrawCurves(x,y);

}

//画蓝线

x=new int[Xs2.length];

y=new int[Ys2.length];

for (int i=0;i<x.length;i++)

{

myxy=mp.moxy(Xs2[i],Ys2[i]);

x[i]=myxy[0];

y[i]=myxy[1];

}

if (kcu)

{

mp.myGraphics.setPaint(Color.blue);

mp.myGraphics.drawPolyline(x,y,x.length);

}

else

{

gracu.myGraphics.setPaint(Color.blue);

gracu.DrawCurves(x,y);

}

}

//退出窗口事件

protected void processWindowEvent(WindowEvent e) {

super.processWindowEvent(e);

if (e.getID() == WindowEvent.WINDOW_CLOSING) {

System.exit(0);

}

}

//鼠标按下事件

void JPanel_mousePressed(MouseEvent e)

{

double[] zs=mp.ScrtoCon(e.getX(),e.getY());

jText1.setText(String.valueOf((float)zs[0]));

jText2.setText(String.valueOf((float)zs[1]));

}

//鼠标释放事件

void JPanel_mouseReleased(MouseEvent e)

{

double[] zs=mp.ScrtoCon(e.getX(),e.getY());

jText1.setText(“”);

jText2.setText(“”);

//画红线

mp.myGraphics.setPaint(Color.darkGray);

mp.myGraphics.drawLine(e.getX()-3,e.getY(),e.getX()+3,e.getY());

mp.myGraphics.drawLine(e.getX(),e.getY()-3,e.getX(),e.getY()+3);

mp.myGraphics.drawString(String.valueOf((float)zs[0]),e.getX()+10,e.getY());

mp.myGraphics.drawString(String.valueOf((float)zs[1]),e.getX()+10,e.getY()+12);

}

//鼠标拖动事件

void JPanel_mouseDragged(MouseEvent e)

{

double[] zs=mp.ScrtoCon(e.getX(),e.getY());

jText1.setText(String.valueOf((float)zs[0]));

jText2.setText(String.valueOf((float)zs[1]));

}

//开始

void jButton1_actionPerformed(ActionEvent e){

wx1=1000000;

wy1=1000000;

wx2=-1000000;

wy2=-1000000;

//试验中数据来一个屡组,实际中唯独自其余地点

//设置开头范围

for (int i=0;i<Xs1.length;i++)

{

if (Xs1[i]< wx1)

wx1=Xs1[i];

if (Xs1[i]> wx2)

wx2=Xs1[i];

if (Ys1[i]< wy1)

wy1=Ys1[i];

if (Ys1[i]> wy2)

wy2=Ys1[i];

}

for (int i=0;i<Xs2.length;i++)

{

if (Xs2[i]< wx1)

wx1=Xs2[i];

if (Xs2[i]> wx2)

wx2=Xs2[i];

if (Ys2[i]< wy1)

wy1=Ys2[i];

if (Ys2[i]> wy2)

wy2=Ys2[i];

}

DwData();

}

//左移

void jButton2_actionPerformed(ActionEvent e) {

wx1-=1;

wx2-=1;

DwData();

}

//右移

void jButton3_actionPerformed(ActionEvent e) {

wx1+=1;

wx2+=1;

DwData();

}

//上移

void jButton4_actionPerformed(ActionEvent e) {

wy1-=1;

wy2-=1;

DwData();

}

//下移

void jButton5_actionPerformed(ActionEvent e) {

wy1+=1;

wy2+=1;

DwData();

}

//X扩

void jButton6_actionPerformed(ActionEvent e) {

wx1-=1;

wx2+=1;

DwData();

}

//X缩

void jButton7_actionPerformed(ActionEvent e) {

wx1+=1;

wx2-=1;

DwData();

}

//Y扩

void jButton8_actionPerformed(ActionEvent e) {

wy1-=1;

wy2+=1;

DwData();

}

//Y缩

void jButton9_actionPerformed(ActionEvent e) {

wy1+=1;

wy2-=1;

DwData();

}

//样长长的控制

void jButton10_actionPerformed(ActionEvent e) {

if (kcu)

{

jButton10.setText(“直线”);

kcu=false;

}

else

{

jButton10.setText(“样条”);

kcu=true;

}

DwData();

}

}

//图形处理类

class myGraphicsData

{

//屏幕坐标

private int X11, Y11, X12, Y12; //x1,y1,x2,y2

//用户坐标

private double W1, W2, W3, W4; //x1,x2,y1,y2

//绘图对象

public Graphics2D myGraphics;

double Ax8, Ay8;

//用户窗口和屏幕窗口的换

//x1,x2,,y1,y2也屏幕坐标

//wx1,wx2,wy1,wy2为用户坐标

public void truemode(int x1, int x2, int y1,int y2, double wx1, double
wx2, double wy1, double wy2)

{

X11 = x1 ; X12 = x2;

Y11 = y1 ; Y12 = y2;

W1 = wx1 ; W2 = wx2;

W3 = wy1 ; W4 = wy2;

Ax8 = (X12 – X11) / (wx2 – wx1);

Ay8 = (Y12 – Y11) / (wy2 – wy1);

}

//把用户坐标转为屏幕坐标

public int[] moxy(double Xa, double Ya)

{

int[] myout=new int[2];

myout[0] = (int)(Ax8 * (Xa – W1) + X11);

myout[1] = (int)(Y12 – Ay8 * (Ya – W3));

return myout;

}

//把屏幕坐标转为用户坐标

public double[] ScrtoCon(int X6, int Y6)

{

double[] myout=new double[2];

myout[0] = (X6 – X11) / Ax8 + W1;

myout[1] = (Y12 – Y6) / Ay8 + W3;

return myout;

}

//画线

public void Dline(double xa, double ya, double xb, double yb)

{

try

{

int x6, y6, x7, y7;

x6 = (int)(Ax8 * (xa – W1) + X11);

y6 = (int)(Y12 – Ay8 * (ya – W3));

x7 = (int)(Ax8 * (xb – W1) + X11);

y7 = (int)(Y12 – Ay8 * (yb – W3));

myGraphics.drawLine(x6, y6, x7, y7);

}

catch(Exception e){}

}

//画坐标U,V为 X,Y轴单位,ns,nt为 x,y轴写字间隔

public void axis(double u, double v, int ns, int nt)

{

double p9, q9, s;

int n2, swx,swy;

int xk=0;

int yk=0;

double ge;

int[] showxy=new int[2];

swx = 0;

swy=4;

ge = (double)0.008 * (W2 – W1);

p9 = W1;

q9 = (double)(W3 + (W4 – W3) * 0.05);

if ((W1 < 0) && (W2 > 0)) p9 = 0;

if ((W3 < 0) && (W4 > 0)) q9 = 0;

Dline(p9, W3, p9, W4);

n2 = 0;

s = 0;

while (s < W4)

{

Dline(p9, s, p9 + ge, s);

if (n2 >= nt)

{

Dline(p9, s, p9 + ge + ge, s);

n2 = 1;

showxy=moxy(p9 + ge + ge,s);

myGraphics.drawString(String.valueOf(s),showxy[0] – swx+4, showxy[1]

  • swy+4);

}

else

{

n2++;

}

s += v;

}

//End While

s = 0;

n2 = 0;

while (s > W3)

{

Dline(p9, s, p9 + ge, s);

if (n2 >= nt)

{

Dline(p9, s, p9 + ge + ge, s);

n2 = 1;

showxy=moxy(p9 + ge + ge, s);

myGraphics.drawString(String.valueOf(s),showxy[0] – swx+4, showxy[1]

  • swy+4);

}

else

{

n2 ++;

}

s -= v; <b

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图