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通过消息机制进行绘制的. 我们知道. ...
随机推荐
- MySQL的CURD 增删改查
添加 insert 语法: 单条:insert into 表名('字段1', '字段2', ...) values('值1', '值2', ...) 多条:insert into 表名('字段1', ...
- MyBatis初级实战之四:druid多数据源
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 1.5V升5V芯片,1.5V升5V电路图规格书
常用的 5号,7号等 1.5V 干电池满电电压在 1.6V 左右,干电池输出耗电电压在 1V.适用PW5100,在 0.9V 时还能输出,彻底榨干干电池的电量. 1.5V 升5V 的芯片:PW5100 ...
- Python设计模式面向对象编程
前言 本篇文章是基于极客时间王争的<设计模式之美>做的总结和自己的理解. 说到面向对象编程,作为一个合格的Pythoner,可以说信手拈来.毕竟在Python里"万物都是对 ...
- 关于java并发场景下,HttpServletRequst中session丢失问题
使用场景: 在list数据进来之后使用安全数组 Lists.newCopyOnWriteArrayList() 进行了 parallelStream 并行处理,在接口中进行了登录者信息接口 ...
- 离线安装docker-ce
1.用一台可以连外网的虚拟机把docker-ce安装包下载下来,vim /tmp/docker-download.sh #!/bin/bash set -e mkdir -p /apps/docker ...
- Bitter ORM NETCORE ORM 全网最粗暴简单易用高性能的 NETCore ORM 开源了
开源的来了,懒人程序员的福音,.NET 生态闭环太缺开源精神了, 拥抱开源! 前言: 本人不是不喜欢现有ORM的轮子,而是发现现有的ORM 的都不太符合开发人员的一些习惯.现有的ORM 要么功能太冗余 ...
- Dubbo 最基本的几个需求
需求 http://dubbo.apache.org/zh-cn/docs/user/preface/requirements.html 在大规模服务化之前,应用可能只是通过 RMI 或 Hessia ...
- Nginx配置代理gRPC的方法
Nginx配置代理gRPC的方法_nginx_脚本之家 https://www.jb51.net/article/137330.htm
- Convert a string into an ArrayBuffer
https://github.com/mdn/dom-examples/blob/master/web-crypto/import-key/spki.js How to convert ArrayBu ...