写在前面:

  高数下学到第二章,突发奇想要写一个程序画二元函数图像

  思路分了三层:

  ①抽象层:

    因变量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的更多相关文章

  1. Java 窗口 绘制图形 #2

    写在前面: 高考结束咧,爽到啊,好耶 完善了Java 窗口 绘制图形 #1里面的程序 加入了缩放平移功能,给代码加了注释 1 package my_package; 2 3 import java.a ...

  2. Java 窗口 绘制图形 #1

    写在前面: editplus换成eclipse了 Sketchpad要钱,买不起 自己搞(rua) by emeralddarkness 建立了一个平面直角坐标系 两个变元x,y,参数i 实现了以下功 ...

  3. C# 在窗口绘制图形(打点、画圆、画线)

    需要包含命名空间 using System.Drawing; 画图前需要先创建画板 void Display() { Graphics g = this.CreateGraphics(); //创建画 ...

  4. Java 在PPT中绘制图形

    Microsoft PowerPoint可支持在幻灯片中插入各种类型的图形并且可设置图形填充.线条颜色.图形大小.位置等.下面将通过Java编程来演示在PPT中绘制图形的方法. 工具:Free Spi ...

  5. Java 在PDF文档中绘制图形

    本篇文档将介绍通过Java编程在PDF文档中绘制图形的方法.包括绘制矩形.椭圆形.不规则多边形.线条.弧线.曲线.扇形等等.针对方法中提供的思路,也可以自行变换图形设计思路,如菱形.梯形或者组合图形等 ...

  6. Java之绘制方法

    绘制图形所用的函数类别分别为视图类.图形单元类和页面类. 对视图类,设置窗口的位置和大小: 对图形单元类,设置图形边界: 对页面类,只有当页面作为元件,该函数才起作用,设置元件边界. 一般构建窗口我们 ...

  7. python中的turtle库绘制图形

    1. 前奏: 在用turtle绘制图形时,需要安装对应python的解释器以及IDE,我安装的是pycharm,在安装完pycharm后,在pycharm安装相应库的模块,绘图可以引入turtle模块 ...

  8. 第58节:Java中的图形界面编程-GUI

    欢迎到我的简书查看我的文集 前言: GUI是图形用户界面,在Java中,图形用户界面我们用GUI表示,而GUI的完整英文为: Graphical User Interface(图形用户接口), 所谓图 ...

  9. Win32知识之窗口绘制.窗口第一讲

    Win32知识之窗口本质 一丶摘要 在学习Win32的时候. 很多操作都是窗口进行操作的.那么今天就说一下窗口的本质是什么. 窗口的本质是不断绘制.是windows通过消息机制进行绘制的. 我们知道. ...

随机推荐

  1. 2020周阳SpringCloud完整版笔记--一

    微服务架构入门 微服务 的概念最早产生于Martin Fowler在2014年的一篇论文中. 微服务架构是一种架构模式,他提倡将单一应用程序划分成一组小的服务,服务与服务之间互相协调.相互配合,为用户 ...

  2. 区间合并 C++

    #include <iostream> #include <vector> #include <algorithm> using namespace std; ty ...

  3. Kafka底层原理剖析(近万字建议收藏)

    Kafka 简介 Apache Kafka 是一个分布式发布-订阅消息系统.是大数据领域消息队列中唯一的王者.最初由 linkedin 公司使用 scala 语言开发,在2010年贡献给了Apache ...

  4. Memcached Session Manager 共享tomcat session设置

    tomcat的lib下添加jar包 修改tomcat的conf目录下的context.xml文件 新增 sessionCookiePath="/" <Manager clas ...

  5. 【Linux】vim关闭终端的时候,忘记退出vim怎么办

    有些时候经常是关闭终端,但是忘记退出vim编辑的文本,每次登陆的时候会提示这个错误 其实很简单,在该文本的路径下,有一个隐藏文件 叫.xxx.txt.swp文件(xxx就是你退出忘记关闭的文件名). ...

  6. Windows程序通用自动更新模块(C#,.NET4.5以上)

    本通用自动更新模块适合所有Windows桌面程序的自动更新,不论语言,无论Winform还是wpf. 一.工作流程:1. 主程序A调起升级程序B2. B从服务器获取更新程序列表,打印更新信息.3. B ...

  7. [Usaco2007 Feb]Cow Party

    题目描述 农场有N(1≤N≤1000)个牛棚,每个牛棚都有1只奶牛要参加在X牛棚举行的奶牛派对.共有M(1≤M≤100000)条单向路连接着牛棚,第i条踣需要Ti的时间来通过.牛们都很懒,所以不管是前 ...

  8. Linux安装Oracle数据库SQLPlus客户端

    安装 RPM包下载地址:https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html ...

  9. ovs-ofctl命令

    用于监控和管理 OpenFlow 交换机. 1. 交换机管理命令 查看交换机信息: ovs-ofctl show s1  查看交换机流表: ovs-ofctl dump-tables s1 查看端口信 ...

  10. Failed to start LSB: starts php-fpm

    跟nginx一样都是进程占用,记录下 [root@localhost pazzn]# systemctl status php-fpm.service ● php-fpm-72.service - L ...