Java 挥杆抽签点
我必须用java编写一个数学应用程序。这个应用程序计算向量的加法和标量乘法,我必须用向量(x,y)设置三个起点a,B和C(ABC是三角形)。该应用程序有一个函数,可以迭代一个循环,循环将运行50000次(该函数计算从起点a、B、C(随机)到新点p的半路径),在这个函数中,我想画所有点,但现在我想用Java Swing画点。现在我已经解决了图纸上的点A,B,C。这些点的计算现在也解决了 下面是我的Java代码,供其他人如何编写类似于我的程序的程序 矢量计算 点形 支点Java 挥杆抽签点,java,swing,Java,Swing,我必须用java编写一个数学应用程序。这个应用程序计算向量的加法和标量乘法,我必须用向量(x,y)设置三个起点a,B和C(ABC是三角形)。该应用程序有一个函数,可以迭代一个循环,循环将运行50000次(该函数计算从起点a、B、C(随机)到新点p的半路径),在这个函数中,我想画所有点,但现在我想用Java Swing画点。现在我已经解决了图纸上的点A,B,C。这些点的计算现在也解决了 下面是我的Java代码,供其他人如何编写类似于我的程序的程序 矢量计算 点形 支点 导入java.awt.Gra
导入java.awt.Graphics;
导入java.util.ArrayList;
导入javax.swing.JFrame;
导入javax.swing.SwingUtilities;
公共类DrawPoint扩展JFrame{
静态矢量计算vc=新矢量计算();
public ArrayList points=vc.getList();
公共支点(字符串标题){
超级(标题);
此.setDefaultCloseOperation(关闭时退出);
这个.setSize(700700);
此.setLocationRelativeTo(空);
}
@凌驾
公共空间涂料(图g){
对于(点s:点){
s、 抽签(g);
}
}
公共静态void main(字符串参数[]){
vc.setUpPoints();
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
支点d=新支点(“MLAIT矢量计算”);
d、 setVisible(真);
}
});
}
}
您从未在main应用程序中初始化veccal
在矢量计算中,您也从不初始化a
、b
、c
和g
。int px=(int)p[0];
int px = (int) p[0];
int py = (int) p[1];
//px and py never changes.
for(int i = 0; i < 50000 ; i++) {
double pABC[] = {0,0};
pABC = vc.addVectors(vc.randomVector(POINT_A,POINT_B,POINT_C),vc.multipleScalar(-1.0,p));
p = vc.addVectors(p,vc.multipleScalar(0.5,pABC));
synchronized (p) { //I don't think you need a synchronised call here.
g2d.setColor(new Color(0,0,0));
//px = (int)p[0] and py = (int)p[1];
g2d.fillOval(px, py, 6, 6);
}
}
int-py=(int)p[1];
//px和py永远不会改变。
对于(int i=0;i<50000;i++){
双pABC[]={0,0};
pABC=vc.addVectors(vc.randomVector(点A,点B,点C),vc.multipleScalar(-1.0,p));
p=vc.addVectors(p,vc.multipleScalar(0.5,pABC));
同步(p){//我想你不需要在这里进行同步通话。
g2d.setColor(新颜色(0,0,0));
//px=(int)p[0]和py=(int)p[1];
g2d.椭圆形(px,py,6,6);
}
}
您只需初始化px和py一次。所以你实际上画了50000次,但一次又一次地画同一个点。
制定一种矢量计算方法,以获取最新的点 您能将空指针异常的回溯粘贴到您的问题中吗?在更新的示例中,您从未初始化vc
。谢谢,但这不是主要问题。我只是改变了这一点,我仍然得到一个空指针,但这应该是swing代码而不是普通java代码的指针。但是我对swing还不熟悉。swing图形应该用什么初始化?@salocin将Graphics
实例留给swing。不要提供自己的,也不要使用getGraphics()
。相反,请传递由paintComponent
提供的。您也不应该缓存这些实例。通过paintComponent
调用绘画方法。我仍然没有。如何将值传递给paintComponent方法?您需要使用g2d.fillOval(px-3,py-3,6,6)
使圆以绘制的点为中心。好的,但是您现在有了吗?我可以为绘制实现更好的算法吗?我想您应该计算Vectorcalculation类中的所有点。制作一个getter方法来检索所有点的列表,并遍历它以绘制所有点。当我遍历列表时,只绘制arrayList中的一个对象。
import java.awt.Graphics;
public abstract class Point {
private int x;
private int y;
private int width;
private int height;
public Point() {
this(0, 0, 1, 1);
}
public Point(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
public abstract void draw(Graphics g);
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
}
import java.awt.Graphics;
public class PointShape extends Point {
public PointShape(int x, int y, int width, int height) {
super(x, y, width, height);
}
public PointShape() {
super();
}
@Override
public void draw(Graphics g) {
g.drawOval(getX(), getY(), getWidth(), getHeight());
}
}
import java.awt.Graphics;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class DrawPoint extends JFrame {
static Vectorcalculation vc = new Vectorcalculation();
public ArrayList<Point> points = vc.getList();
public DrawPoint(String title) {
super(title);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setSize(700, 700);
this.setLocationRelativeTo(null);
}
@Override
public void paint(Graphics g) {
for (Point s : points) {
s.draw(g);
}
}
public static void main(String args[]) {
vc.setUpPoints();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
DrawPoint d = new DrawPoint("MLAIT VectorCalculation");
d.setVisible(true);
}
});
}
}
int px = (int) p[0];
int py = (int) p[1];
//px and py never changes.
for(int i = 0; i < 50000 ; i++) {
double pABC[] = {0,0};
pABC = vc.addVectors(vc.randomVector(POINT_A,POINT_B,POINT_C),vc.multipleScalar(-1.0,p));
p = vc.addVectors(p,vc.multipleScalar(0.5,pABC));
synchronized (p) { //I don't think you need a synchronised call here.
g2d.setColor(new Color(0,0,0));
//px = (int)p[0] and py = (int)p[1];
g2d.fillOval(px, py, 6, 6);
}
}