关于Frame考古器物绘图的问题问题

一个简单的绘图框架 - elvalad - 博客园
随笔 - 116
在里提到我想要实现一个分形软件,晚上用Java写了一个简单的绘图框架来方便我实现各种分形算法,有了这个框架我就可以很容易的将实现的各种分形绘图算法集成进这个软件。
这个框架主要包含以下几个类:
FractalMain类继承自JFrame,用于整个Frame的布局,这里通过用户选择的不同的MenuItem来执行不同的绘图功能,使用FractalPanel类提供的setPaintStype方法来控制调用不同的绘图算法;
FractalPanel类继承自JPanel,用于调用不同的绘图算法,这里主要通过用户从FractalMain类设置过来的ShapeStyle来调用不同的绘图算法,绘图主要由paintComponent方法实现,此方法继承自JComponent,当用户从FractalMain选择不同的绘图算法时通过调用repaint方法实现;
ShapeStyle是一个枚举,主要用于表示用户当前选择的绘图算法,通过这个枚举最终判断该调用那个类提供的draw方法;
Cantor类是一个Cantor三分集的绘图算法实现;
当前这个框架已经基本满足现阶段的需求,只需要向这个框架中添加各种不同的绘图算法即可,每个绘图算法以一个新的类的形式出现,后续需要在这个框架中加入分形动画,还可能会加入自己制作分形图案的功能。
这个框架还需要完善的功能包括:
添加设置绘图颜色;
添加设置绘图的size;
增加用户配置文件保存;
增加分形图案保存功能;
FractalMain.java
package com.
import javax.swing.*;
import java.awt.event.ActionE
import java.awt.event.ActionL
public class FractalMain extends JFrame implements ActionListener {
private JMenuBar menuB
private JMenu fractalM
private JMenuItem blankI
private JMenuItem cantorI
private ShapeS
private FractalPanel fractalPanel = new FractalPanel();
* FractalMain类的构造函数
public FractalMain() {
/* JFrame继承自awt Frame类的方法,设置窗体标题 */
this.setTitle("Fractal");
/* 设置JFrame的初始大小 */
this.setSize();
/* 设置用户在此窗体上发起 "close" 时默认执行的操作 */
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
/* 设置窗口相对于指定组件的位置,当为null时在正中央 */
this.setLocationRelativeTo(null);
/* 建立menu */
this.buildMenuBar();
/* 设置此窗体的菜单栏 */
this.setJMenuBar(this.menuBar);
/* 添加fractalPanel到JFrame中央 */
this.add(this.fractalPanel, "Center");
/* 继承自Window类,根据参数显示或隐藏组件 */
this.setVisible(true);
* 创建MenuBar
* MenuBar: menuBar
* Menu: fractalMenu
MenuItem: blankItem
MenuItem: cantorItem
private void buildMenuBar() {
this.menuBar = new JMenuBar();
this.fractalMenu = new JMenu("Fractal");
this.blankItem = new JMenuItem("Blank");
this.blankItem.addActionListener(this);
this.cantorItem = new JMenuItem("Cantor");
this.cantorItem.addActionListener(this);
this.menuBar.add(this.fractalMenu);
this.fractalMenu.add(this.blankItem);
this.fractalMenu.add(this.cantorItem);
* 通过设置PaintStyle来绘制不同的图案
* 清空Panel上的图案
private void drawBlankOnPanel() {
this.style = ShapeStyle.BLANK;
this.fractalPanel.setPaintStype(this.style);
this.repaint();
* 通过设置PaintStyle来绘制不同的图案
* 绘制Cantor三分集
private void drawCantorOnPanel() {
this.style = ShapeStyle.CANTOR;
this.fractalPanel.setPaintStype(this.style);
this.repaint();
* @param e awt事件接口,用于判断此时是哪种事件来选择执行不同的方法
public void actionPerformed(ActionEvent e) {
if (e.getSource() == this.blankItem) {
this.drawBlankOnPanel();
} else if (e.getSource() == this.cantorItem) {
this.drawCantorOnPanel();
public static void main(String[] args) {
new FractalMain();
FractalPanel.java
package com.
import javax.swing.*;
import java.awt.*;
* Created by elvalad on .
public class FractalPanel extends JPanel {
private Cantor cantor = new Cantor(100, 100, 800, 100, new Color(108, 187, 219));
private ShapeS
public FractalPanel() {
this.style = ShapeStyle.BLANK;
public void setPaintStype(ShapeStyle s) {
this.style =
public void paintComponent(Graphics g) {
super.paintComponent(g);
switch (this.style) {
case CANTOR: {
this.drawCantor(g);
case BLANK: {
private void drawCantor(Graphics g) {
this.cantor.draw(g);
ShapeStyle.java
package com.
* Created by elvalad on .
public enum ShapeStyle {
BLANK, CANTOR
Cantor.java
package com.
import java.awt.*;
* Created by elvalad on .
public class Cantor {
private double x1;
private double y1;
private double x2;
private double y2;
private Color color = new Color(108, 187, 219);
* Cantor的构造函数
* @param x1 Cantor起始点的横坐标
* @param y1 Cantor起始点的纵坐标
* @param x2 Cantor终止点的横坐标
* @param y2 Cantor终止点的纵坐标
public Cantor(int x1, int y1, int x2, int y2, Color color) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
this.color =
public void draw(Graphics g) {
g.setColor(this.color);
this.drawShape(g, this.x1, this.y1, this.x2, this.y2);
* @param g
* @param x1
* @param y1
* @param x2
* @param y2
private void drawShape(Graphics g, double x1, double y1, double x2, double y2) {
g.setColor(this.color);
double c = 1.0;
if ((x2 - x1) & c) {
g.drawLine((int)x1, (int)y1, (int)x2, (int)y2);
double x3 = 0;
double y3 = 0;
double x4 = 0;
double y4 = 0;
g.drawLine((int)x1, (int)y1, (int)x2, (int)y2);
x3 = x1 + (x2 - x1) / 3;
y3 = y1 + 50;
x4 = x2 - (x2 - x1) / 3;
y4 = y2 + 50;
y1 = y1 + 50;
y2 = y2 + 50;
drawShape(g, x1, y1, x3, y3);
drawShape(g, x4, y4, x2, y2);framebuffer - weiweishuo - 博客园
随笔 - 103, 文章 - 0, 评论 - 0, 引用 - 0
& 放弃了在flash player上继续做bway3d,决定把3D引擎的工作都转移到linux下来。现只是刚入门径,就已經尝到了甜头。
& 选择引擎的渲染方式经过一段时间,最开始想用GKT,QT之类的,发现它们都是对xlib的封装(我厌倦用封装过很多很多层的东西),就转而去学xlib,学x协议。看了x协议就明白它的绘图效率是起不来的的:照我狭隘理解,普通的绘图程序会调用系统提供的API,例如GDI模型就是:绘图程序向内核发送绘图请求(通过API)-&内核调用相关模块完成绘图。但经典的x-window模型是:工作站上的绘图程序(client)发送绘图请求给server-&运行在瘦客户机上的xserver调用相关模块完成绘图。这个模型初衷是基于网络的【远程工作站+瘦客户机】,相当于远程桌面,它比腾讯的远程操控快很多,但若是运行在pc上,xserver就是累赘了。为什么绘图程序不能直接跟内核打交道,而要xserver代理?于是就想到直接获得对显卡的操纵,此时svgalib映入眼帘...但折腾了好久,源码编译过不了,国内几乎没有资料。大概是在google svgalib的时候知道了framebuffer。
& 已经想好用framebuffer来做光栅化渲染,log some tips as following:
1,FrameBuffer 只是一个提供显示内存和显示芯片寄存器从物理内存映射到进程地址空间中的设备。所以,对于应用程序而言,如果希望在 FrameBuffer 之上进行图形编程,还需要自己动手完成其他许多工作。
2,LCD会定期(通常60HZ)扫描framebuffer到屏幕上,因此写入framebuffer的pixelVlaue会在一个扫描周期内被显示到屏幕上。
3,linux的framebuffer刚好够一个屏幕用,看资料上说andriod的framebuffer就两倍于屏幕大小。如此做双buffer方便的多。不知道linux怎么想的。
3,framebuffer的试验在tty下做才有效果,如果想在xwidnow下做,得设置xwindow使用framebuffer驱动。我是从这篇帖子上学到的:
---------------------
Linux下的显卡驱动有两层,&一个是kernel层的也就是framebuffer驱动,&另一个是Xserver层驱动,&在进入X- windows之前是由framebuffer来驱动,&进入X-windows之后由XSERVER层的驱动作用(/etc/X11 /xorg.conf中可以设置显卡等驱动),&当然如果你想要在X-WINDOWS上用framebuffer驱动也可以,&可以使用Xserver中 的fbdev驱动,&这个驱动可以指定你要使用kernel层的framebuffer,&比如在xorg.conf中这样写
Section "Device"
Identifier
"Videocard0"
VendorName
"Videocard vendor"
"VESA driver (generic)"
"PCI:0:14:0"
"fbdev" "/dev/fb1" #使用/dev/fb1这个framebuffer驱动
EndSection
&----------------------
& 本人linux没有/etc/X11/xorg.conf文件,我是在/usr/share/X11/xorg.conf.d下新建一个00-screen.conf文件,把上面的内容复制进去的。& 重启电脑后我的framebuffer测试程序就可以在x桌面上绘图了。此模式下鼠标有些闪。
4,发现往framebuffer里写数据比往普通内存里写慢的多,因此我在内存里开出一块后台绘制区,绘制完成了再拷贝到framebuffer,一是防闪,二就是减少写开销。现在还不知道是什么原因。
5,framebuffer的line_length是硬件决定的,不要用xres_virtual*bits_per_pixel/8去算。pandas之DataFrame绘图
我们知道Pandas库中有两种数据结构一种是Series结构类型的数据,还有一个种就是DataFrame类型的数据,那么今天我们就来聊一聊DataFrame结构类型的数据绘图。我们先来看一个最简单的例子。试试我们的小心脏会不会跳动,哈哈。直接上干货,代码如下:如果您对DataFrame有点陌生,啊哈,去百度一下了。解释一下第5行,里面用到了numpy库中的randint函数,这是函数用来随机生成一些整数。randint(1,10,40)意思是随机生成40个[1,10)之间的整数。那后面的reshape函数是干嘛的呢?这个函数的意思是将生成的40个整数从一维的数据(1行40列)变成二维的数据(10行4列)。columns就是列名。然后我们调用dataframe内置的plot方法。最后调用matplotlib库中的show方法,就这样很简单。我们来看一下效果如下图所示:Dataframe是将每一列画一条线。默认带图例。plot方法其实可有很多参数以来帮助我们画图。比如我们想画一个柱状图,怎么办?修改第7行代码:然后效果图如下:比如我们想画一个堆叠的柱状图,怎么办?修改第7行代码:效果图如下:比如我们想画一个填充的线性图,怎么办?修改第7行代码:效果图如下:一口气给大家演示不同类型的图,其实实现起来很简单啊,就是给plot方法传入不同的参数以及相应的参数值。如果大家还有其他的需求可以去查看官方文档,还有更精彩的demo以及更炫的用法等着大家去挖掘去尝试。这里做一个抛砖引玉,哈哈,感觉自己好有文采。
对于DataFrame,每一行可以看做一个Series,每一列也可以看做一个Series。我们接下来可以做一个实验。l
将每一行看做一个Series。我在这里创建的DataFrame更简便。Column和index的默认值分别是:column=[0,1,2,3],index=[0,1,2,3,4,5,67,8,9],对于这种结构我们在头脑里要有一个大致的框架。iloc方法是获取DataFrame的第几行数据。在这里我获取了3行数据,然后画在了一张图上。效果图如下:做一个小小的说明:上图中的x轴,对应的是DataFrame的column。l
将每一列看做一个Series。df[0],df[1]是获取DataFrame的第一列和第二列数据。然后将这两列数据画到一张图上。效果图如下:做一个小小的说明:上图中的x轴,对应的是DataFrame的index。总结,对于DataFrame,大家在脑子里要有一个结构哈,不然的话在我们做数据分析的时候,很多变化我们就有点懵了。关于dataframe的画图就写到这里吧,欢迎大家吐槽哦。
没有更多推荐了,java 绘图机制代码疑问? - 知乎有问题,上知乎。知乎作为中文互联网最大的知识分享平台,以「知识连接一切」为愿景,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。3被浏览98分享邀请回答赞同 添加评论分享收藏感谢收起写回答OpenGL ES2.0在onDrawFrame用线程画图可以吗_百度知道
OpenGL ES2.0在onDrawFrame用线程画图可以吗
我有更好的答案
在android中,要实现动画效果,要么通过循环调用canvas.draw系统方法,要么通过调用opengl es中的GLSurfaceView.Renderer实现方法onDrawFrame方法。 这个方法大体的原理是开起一个线程,在此线程内不断的调用onDrawFrame,实现效果。
采纳率:97%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 手机绘图解锁忘了怎么办 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信