在学习微分方程的时候,以前也写过类似的文章,可是效果不行,前几天写了一个,感觉不错,分享之。
先看效果(x*x -y -2):
再来代码:
package com.math.slopfields;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
public class SlopFields extends JFrame {
protected static final int WIDTH = 800;
protected static final int HEIGHT = 600;
private java.awt.Dimension dimension = java.awt.Toolkit.getDefaultToolkit().
getScreenSize();
public SlopFields(String title, Grid g) {
super(title);
this.setSize(WIDTH, HEIGHT);
this.setLocation((dimension.width - WIDTH) / 2,
(dimension.height - HEIGHT) / 2);
HeartCanvas panel = new HeartCanvas(g);
this.add(panel);
}
public static void main(String[] args) {
double scale = 80;
double aa = 3;
double dd = 0.15;
Area area = new Area(Vector.build(-aa, aa), Vector.build(aa, -aa));
Vector grid = Vector.build(dd, dd);
CanCalc c = new CanCalc(){
public double doCalc(Vector v) {
return v.x*v.x - v.y - 2;
}
};
Grid g = new Grid(area, grid, c, scale);
SlopFields hart = new SlopFields("向量场", g);
hart.setVisible(true);
hart.setDefaultCloseOperation(hart.EXIT_ON_CLOSE);
}
}
class HeartCanvas extends javax.swing.JPanel {
private Grid grid;
public HeartCanvas(Grid g) {
this.grid = g;
this.grid.calcGrids();
this.grid.preDraw();
}
public void paintComponent(Graphics g) {
setBackground(Color.BLACK);
super.paintComponent(g);
g.setColor(Color.GREEN);
this.grid.draw(g);
}
}
class Grid {
public double scale = 100;
public double padding = 0.2;
public Vector offect = Vector.build(0.25, 0.25);
public Area area;
public Area[][] areas;
public Vector grid;
public int nx, ny;
private CanCalc calc;
public Grid(Area _area, Vector _grid, CanCalc _calc, double _scale) {
this.area = _area;
this.grid = _grid;
this.calc = _calc;
this.scale = _scale;
}
public void draw(Graphics g) {
int x = (int)area.ld.x;
int y = (int)area.ld.y;
Vector t = area.ru.add(area.ld.neg());
int width = (int)t.x;
int height = (int)t.y;
g.drawRect(x, y, width, height);
g.drawLine(x, (int)offect.y, x+width, (int)offect.y);
g.drawLine((int)offect.x, y, (int)offect.x, y+height);
for(Area[] al : areas) {
for(Area a : al) {
g.drawLine((int)a.ld.x, (int)a.ld.y, (int)a.ru.x, (int)a.ru.y);
}
}
}
public void preDraw() {
offect = offect.dotMul(this.scale).add(Vector.build(-area.ld.x*scale, area.ru.y*scale));
area = new Area(Vector.build(area.ld.x, -area.ru.y).dotMul(this.scale).add(offect),
Vector.build(area.ru.x, -area.ld.x).dotMul(this.scale).add(offect));
for(int i=0; i<ny; i++){
for(int j=0; j<nx; j++) {
Area tmp = areas[i][j];
Vector va = Vector.build(tmp.ld.x, -tmp.ld.y).dotMul(this.scale).add(offect);
Vector vb = Vector.build(tmp.ru.x, -tmp.ru.y).dotMul(this.scale).add(offect);
areas[i][j] = new Area(va, vb);
}
}
}
private void fixArea() {
Vector tn1 = area.ld.dotDiv(grid).intVal().abs();
area.ld = grid.dotMul(tn1).neg();
Vector tn2 = area.ru.dotDiv(grid).intVal().abs();
area.ru = grid.dotMul(tn2);
tn1 = tn1.add(tn2);
nx = (int)tn1.x;
ny = (int)tn1.y;
}
private Slop[][] initSlop(CanCalc calc) {
fixArea();
Slop[][] slops = new Slop[nx][ny];
Vector now = area.ld.clone();
now.y += grid.y/2;
for(int i=0; i<ny; i++) {
now.x = area.ld.x + grid.x/2;
for(int j=0; j<nx; j++) {
slops[i][j] = new Slop(now.clone(), calc.doCalc(now));
now.x += grid.x;
}
now.y += grid.y;
}
return slops;
}
public Area[][] calcGrids() {
Slop[][] slops = initSlop(calc);
areas = new Area[nx][ny];
for(int i=0; i<nx; i++) {
for(int j=0; j<ny; j++) {
Vector tmp = null;
Slop s = slops[i][j];
if(s.slop == grid.slop()) {
tmp = grid.dotDiv(2);
}else if(s.slop == -grid.slop()){
tmp = grid.dotDiv(2).dotMul(Vector.dr);
}else if(s.slop==0){
tmp = Vector.build(grid.x/2, 0);
}else if(s.slop<grid.slop() && s.slop>-grid.slop()) {
tmp = Vector.build(grid.x/2, (grid.x/2)*s.slop);
}else {
tmp = Vector.build((grid.y/2)/s.slop, grid.y/2);
}
tmp = tmp.dotMul(1-this.padding);
areas[i][j] = new Area(s.point.add(tmp.neg()), s.point.add(tmp));
}
}
return areas;
}
}
interface CanCalc {
public double doCalc(Vector v);
}
class Slop{
public Vector point;
public double slop;
public Slop(Vector _point, double _slop) {
this.point = _point;
this.slop = _slop;
}
public String toString() {
return String.format("{%s, %.2f}", point, slop);
}
}
class Area {
public Vector ld;
public Vector ru;
public Area(Vector _ld, Vector _ru) {
this.ld = _ld;
this.ru = _ru;
}
public String toString() {
return String.format("[%s-%s]", this.ld, this.ru);
}
public Area scale(double d) {
return new Area(this.ld.dotMul(d), this.ru.dotMul(d));
}
public Area add(Vector v) {
return new Area(this.ld.add(v), this.ru.add(v));
}
}
class Vector {
public static final double infinite = Double.MAX_VALUE;
public double x;
public double y;
public static final Vector zero = Vector.build(0, 0);
public static final Vector up = Vector.build(0, 1);
public static final Vector down = Vector.build(0, -1);
public static final Vector left = Vector.build(-1, 0);
public static final Vector right = Vector.build(1, 0);
public static final Vector ul = Vector.build(-1, 1);
public static final Vector ur = Vector.build(1, 1);
public static final Vector dl = Vector.build(-1, -1);
public static final Vector dr = Vector.build(1, -1);
public static Vector build(double x, double y) {
return new Vector(x, y);
}
public Vector clone() {
return Vector.build(this.x, this.y);
}
public double slop() {
if(this.x == 0) {
return Vector.infinite;
}
return this.y / this.x;
}
public Vector(double _x, double _y) {
this.x = _x;
this.y = _y;
}
public Vector intVal() {
return new Vector((int)this.x, (int)this.y);
}
public Vector abs() {
return Vector.build((x>=0?x:-x), (y>=0?y:-y));
}
public Vector add(Vector v) {
return new Vector(this.x+v.x, this.y+v.y);
}
public Vector neg() {
return new Vector(-this.x, -this.y);
}
public Vector mul(double m) {
return new Vector(m*this.x, m*this.y);
}
public Vector dotMul(Vector m) {
return new Vector(this.x * m.x, this.y * m.y);
}
public Vector dotMul(double m) {
return Vector.build(this.x*m, this.y*m);
}
public Vector dotDiv(Vector m) {
return new Vector(this.x/m.x, this.y/m.y);
}
public Vector dotDiv(double d) {
return Vector.build(this.x/d, this.y/d);
}
public String toString() {
return String.format("<%.2f, %.2f>", x, y);
}
}
配置代码,可以查看不同的效果:
double scale = 80;
double aa = 3;
double dd = 0.15;
Area area = new Area(Vector.build(-aa, aa), Vector.build(aa, -aa));
Vector grid = Vector.build(dd, dd);
CanCalc c = new CanCalc(){
public double doCalc(Vector v) {
return v.x*v.x - v.y - 2;
}
};
分享到:
相关推荐
特征值特征向量java源码dANN 2.x dANN 是一个人工智能和人工遗传学库,旨在采用传统算法并作为研究和开发新算法的平台。 随着新算法的开发和证明是有效的,它们将被集成到核心库中。 它目前是用 Java 编写的,并且...
例如,你可以使用一个马达来驱动一个肘的旋转。 世界(world) 一个物理世界就是物体,形状和约束相互作用的集合。Box2D 支持创建多个世界,但这通常是不必要的。 这里先给大家介绍就是让大家明白Box2d包括哪些内容,...
提出一种Java源代码和字节码都适用的剽窃检测方法并实现了支持系统,该方法以类的Java文件或class文件为比较单元,从中抽取代表程序语法和语义特征的5种特征向量,综合计算产生两个类文件之间的相似度,可用于帮助...
朴素贝叶斯算法是贝叶斯算法里面一种比较简单的分类算法,用到了一个比较重要的贝叶斯定理,用一句简单的话概括就是条件概率的相互转换推导。详细介绍链接 SVM 支持向量机算法。支持向量机算法是一种对线性和非...
该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由...
熟悉并掌握DV LS路由算法的实现过程。 java win7+eclipse 附有代码和运行截图 熟悉并掌握DV LS路由算法的实现过程。 java win7+eclipse 附有代码和运行截图 熟悉并掌握DV LS路由算法的实现过程。 java win7+...
然后,根据以上模型、课程推荐引擎和具体的业务需求为在线学 习系统设计了一个低耦合、易扩展、高可用、高性能的系统架构,并 给出了系统中各类服务器模块的设计方案。然后使用SpringBoot+SpringMVC+Mybatis+Spring...
该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由...
该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由...
该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由...
该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由...
该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由...
该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由...
该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由...
该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由...
该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由...
本项目是阿里云视觉智能开放平台的人脸1:N的开源替代,项目中使用的模型均为开源模型,项目支持opensearch(1.x版本支持milvus和proxima)向量存储库,并具有较高的自定义能力。 项目使用纯Java开发,免去使用Python...
功能多样的N维数组类,为Java和Scala设计与GPU集合可在Hadoop、Spark上实现扩缩Canova:机器学习库的通用向量化工具ND4J:线性代数库,较Numpy快一倍Deeplearning4j包括了分布式、多线程的深度学习框架,以及普通的...
该项目旨在创建一个易于使用、高效且跨平台的库,为开发者提供实现计算机视觉算法所需的基础工具。 社区与支持:随着时间的推移,OpenCV吸引了全球众多开发者和研究人员的参与,形成了活跃的社区。目前,OpenCV由...