Java 窗口 绘制图形 #3
写在前面:
高数下学到第二章,突发奇想要写一个程序画二元函数图像
思路分了三层:
①抽象层:
因变量z,自变量x、y,坐标原点x0、y0、z0
②投影实现层:
屏幕投影坐标px、py,x轴与屏幕水平方向夹角theta1,z轴与屏幕铅直方向夹角theta2,缩放变量S
分两种情况考虑了:
1)单纯以z轴为旋转轴
yp=S*z
xp=S*(-x*sintheta1 + y*costheta2)
2)以原点为定点旋转
yp=S*(z*costheta2-x*sintheta2+y*costheta2) 这个经检验是错的
xp=S*(-x*sintheta1 + y*costheta2)
③操作层:演草纸上写的和实际程序写的不一样,略
运行效果:
可以缩放、平移,但目前只能做到绕y轴旋转(因为绕原点旋转的代码挂了)
pong友建议用矩阵做投影变换,有空试试
代码如下:
1 package my_package;
2
3 import java.awt.*;
4 import java.awt.event.MouseAdapter;
5 import java.awt.event.MouseEvent;
6 import java.awt.event.MouseMotionAdapter;
7 import java.awt.event.MouseWheelEvent;
8 import java.awt.event.MouseWheelListener;
9 import java.io.*;
10 import javax.swing.JFrame;
11 import javax.swing.JPanel;
12
13 public class PonysAlgorithm2 extends JFrame
14 {
15 private static final long serialVersionUID = 1L;
16 static int pony_winx=800,pony_winy=600;//窗口的长和宽
17 static int pony_scale=2,pony_scale_tmp=4;//视图缩放变量
18 static int theta1=0,theta2=0;//水平旋转角度,铅直旋转角度
19 static int pony_square=250;//绘制xy正方形区域趋边长的一半
20 static int pony_px=pony_winx/2,pony_py=pony_winy/2;//屏幕投影变量px和py
21
22 static int pony_framex_ori,pony_framey_ori;//鼠标移动辅助变量
23 static int pony_theta1_tmp,pony_theta2_tmp;//角度随鼠标移动变化辅助变量
24 static int pony_px_tmp,pony_py_tmp;//屏幕投影量随鼠标移动变化辅助变量
25 static int pony_project_x_tmp,pony_project_y_tmp;//屏幕投影量计算辅助变量
26 static float pony_precision=40.0f;//绘制精度,但绘制点数只受pony_square影响,不受精度影响
27
28 static double pony_project_x(double x, double y){//计算在屏幕上的投影px
29 return (y*Math.cos(theta1/180.0f)-x*Math.sin(theta1/180.0f))*pony_scale;
30 }
31 static double pony_project_y(double z, double x, double y){//计算在屏幕上的投影py
32 return z*pony_scale;
33 }
34 static double pony_z(double x, double y){//计算函数值
35 return x*x/4-y*y/9;
36 }
37
38 public static void main(String[] args) throws Exception
39 {
40 JFrame ponyFrame=new JFrame("Pony's Algorithm II");
41 ponyFrame.setLayout(null);
42 JPanel ponyJPanel=new JPanel(){
43 private static final long serialVersionUID = 1L;
44 public void paint(Graphics g){
45 super.paint(g);
46 for(int y=-pony_square;y<=pony_square;++y)
47 {
48 g.setColor(Color.getHSBColor(0.54f+0.2f*(y+pony_square)/(pony_square*2.0f), 1.0f, 1.0f));
49 for(int x=-pony_square;x<=pony_square;++x)
50 {
51 pony_project_x_tmp=pony_px+(int)pony_project_x(x/pony_precision,y/pony_precision);
52 pony_project_y_tmp=pony_py+(int)pony_project_y(pony_z(x/pony_precision,y/pony_precision),x/pony_precision,y/pony_precision);
53 g.drawLine(pony_project_x_tmp, pony_project_y_tmp, pony_project_x_tmp, pony_project_y_tmp);
54 }
55 }
56 }
57 };
58
59 /*Whole*/
60 ponyFrame.setSize(pony_winx,pony_winy);
61 ponyFrame.setResizable(false);
62 ponyFrame.setLocationRelativeTo(null);
63 ponyFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
64
65 /*ICON*/
66 File directory = new File("");
67 ponyFrame.setIconImage(Toolkit.getDefaultToolkit().getImage(directory.getCanonicalPath()+"\\icons\\2.png"));
68
69 /*DRAW*/
70 ponyJPanel.setBounds(0, 0, pony_winx, pony_winy);
71 ponyFrame.add(ponyJPanel);
72
73 /*MOUSE*/
74 ponyFrame.addMouseListener(new MouseAdapter() {
75 @Override
76 public void mousePressed(MouseEvent e) {//当任意鼠标键按下时,记录变量
77 pony_framex_ori=e.getXOnScreen();
78 pony_framey_ori=e.getYOnScreen();
79 pony_theta1_tmp=theta1;
80 pony_theta2_tmp=theta2;
81 pony_px_tmp=pony_px;
82 pony_py_tmp=pony_py;
83 }
84 });
85 ponyFrame.addMouseMotionListener(new MouseMotionAdapter() {//当鼠标键按下并移动时,记录变量
86 @Override
87 public void mouseDragged(MouseEvent e) {//两个角度的改变
88 if(e.isShiftDown() && e.getButton()==0){
89 theta1=pony_theta1_tmp-(e.getXOnScreen()-pony_framex_ori)/2;
90 theta2=pony_theta2_tmp+(e.getYOnScreen()-pony_framey_ori)/2;
91 }
92 else if(e.getButton()==0){//两个投影坐标的改变
93 pony_px=pony_px_tmp+(e.getXOnScreen()-pony_framex_ori)/1;
94 pony_py=pony_py_tmp+(e.getYOnScreen()-pony_framey_ori)/1;
95 }
96 ponyJPanel.repaint();
97 }
98 });
99 ponyFrame.addMouseWheelListener(new MouseWheelListener() {//鼠标滚轮滚动时,对图像进行缩放
100 @Override
101 public void mouseWheelMoved(MouseWheelEvent e) {
102 if(e.getWheelRotation()==1) {
103 if(pony_scale_tmp>2) {
104 pony_scale_tmp-=1;
105 pony_scale=pony_scale_tmp/2;
106 ponyJPanel.repaint();
107 }
108 }
109 if(e.getWheelRotation()==-1) {
110 pony_scale_tmp+=1;
111 pony_scale=pony_scale_tmp/2;
112 ponyJPanel.repaint();
113 }
114 }
115 });
116
117 ponyFrame.setVisible(true);
118 return;
119 }
120 }
十分良心加了注释哈哈
附件:
*jar所在目录*\\icons\\
2.png
Java 窗口 绘制图形 #3的更多相关文章
- Java 窗口 绘制图形 #2
写在前面: 高考结束咧,爽到啊,好耶 完善了Java 窗口 绘制图形 #1里面的程序 加入了缩放平移功能,给代码加了注释 1 package my_package; 2 3 import java.a ...
- Java 窗口 绘制图形 #1
写在前面: editplus换成eclipse了 Sketchpad要钱,买不起 自己搞(rua) by emeralddarkness 建立了一个平面直角坐标系 两个变元x,y,参数i 实现了以下功 ...
- C# 在窗口绘制图形(打点、画圆、画线)
需要包含命名空间 using System.Drawing; 画图前需要先创建画板 void Display() { Graphics g = this.CreateGraphics(); //创建画 ...
- Java 在PPT中绘制图形
Microsoft PowerPoint可支持在幻灯片中插入各种类型的图形并且可设置图形填充.线条颜色.图形大小.位置等.下面将通过Java编程来演示在PPT中绘制图形的方法. 工具:Free Spi ...
- Java 在PDF文档中绘制图形
本篇文档将介绍通过Java编程在PDF文档中绘制图形的方法.包括绘制矩形.椭圆形.不规则多边形.线条.弧线.曲线.扇形等等.针对方法中提供的思路,也可以自行变换图形设计思路,如菱形.梯形或者组合图形等 ...
- Java之绘制方法
绘制图形所用的函数类别分别为视图类.图形单元类和页面类. 对视图类,设置窗口的位置和大小: 对图形单元类,设置图形边界: 对页面类,只有当页面作为元件,该函数才起作用,设置元件边界. 一般构建窗口我们 ...
- python中的turtle库绘制图形
1. 前奏: 在用turtle绘制图形时,需要安装对应python的解释器以及IDE,我安装的是pycharm,在安装完pycharm后,在pycharm安装相应库的模块,绘图可以引入turtle模块 ...
- 第58节:Java中的图形界面编程-GUI
欢迎到我的简书查看我的文集 前言: GUI是图形用户界面,在Java中,图形用户界面我们用GUI表示,而GUI的完整英文为: Graphical User Interface(图形用户接口), 所谓图 ...
- Win32知识之窗口绘制.窗口第一讲
Win32知识之窗口本质 一丶摘要 在学习Win32的时候. 很多操作都是窗口进行操作的.那么今天就说一下窗口的本质是什么. 窗口的本质是不断绘制.是windows通过消息机制进行绘制的. 我们知道. ...
随机推荐
- 【Flutter】可滚动组件之SingleChildScrollView
前言 SingleChildScrollView类似于Android中的ScrollView,它只能接收一个子组件. 接口描述 const SingleChildScrollView({ Key ke ...
- Docker构建Python Web环境
出于寻找Docker对Python相关项目部署的学习,找到腾讯课堂NEXT公开课中[Docker构建Python Web环境]的课程,本文对其进行内容梳理及知识点汇总. 该课程总计6小时左右,是个适合 ...
- mysql中更改字段属性实际上都做了哪些操作
mysql> set profiling=1; Query OK, 0 rows affected (0.00 sec) mysql> alter table test modify n ...
- qmake奇淫技巧之字符串宏定义
阅读本文大概需要3.3分钟 我们平时在软件开发过程中需要定义一些宏,以便在代码中调用,这样每次不需要修改代码,只需要修改外部编译命令就可以得到想要的参数,非常方便 比如我们想在软件介绍中显示软件版本, ...
- 【Linux】iptables的内核模块问题大坑!
系统环境 CentOS 6.5 今天本来可以平静的度过一天,正品味着下午茶的美好,突然接到防火墙iptables的报警. 进入到服务器中,执行下面的命令查看,结果报错 /etc/init.d/ipta ...
- oralce move和shrink释放高水位
转自:https://blog.51cto.com/fengfeng688/1955137 move和shrink的共同点: 收缩段,消除部分行迁移,消除空间碎片,使数据更紧密 shrink用法: 语 ...
- Android根据pdf模板生成pdf文件
我们需要生成一些固定格式的pdf文件或者一些报表数据,那么我们可以用 iText包去做. 需要包含的jar包:iText-5.0.6.jar iTextAsian.jar ,怎样jar包导入工程 ...
- JAVA获取当前文件路径this.getClass().getResource方法详细讲解
public class Test { public void run() { // TODO Auto-generated method stub System.out.println(" ...
- Python执行程序实可视化_heartrate
最近发现了一个Python程序执行的简单实时可视化神器,名字叫 heartrate,安装完运行可以看到下面这样的炫酷过程. 虽然很炫酷,但有点看不懂. 来解释下,左边的动态数字代表每行被触发的次数.变 ...
- Navicat 创建mysql存过、定时执行存过
创建存过: 使用Navicat for MySQL工具创建存储过程步骤: 1. 新建函数(选择函数标签 -> 点击新建函数): 2.输入函数的参数个数.参数名.参数类型等: 3.编写存储过程: ...