Java 如何移动整个GPen对象?
在使用acm.graphics GPen的Java中,是否有任何方法可以移动整个绘制的直线序列?我已经彻底阅读了手册,我开始认为这是不可能的,这就引出了我的第二个问题。Java中是否有其他图形对象的工作方式与笔非常相似,也可以移动。我问这个问题的原因是因为我一直在开发一个绘图程序,该程序允许使用鼠标手势进行平移和放大缩小。在为隐式函数构建功能后,我意识到简单地清除绘图板并重新绘制所有内容将无法再切割它,因此我确实需要研究更有效的方法来处理图形的中间更改,而无需重新计算所有内容。例如,使用此代码或类似代码:Java 如何移动整个GPen对象?,java,graphics,Java,Graphics,在使用acm.graphics GPen的Java中,是否有任何方法可以移动整个绘制的直线序列?我已经彻底阅读了手册,我开始认为这是不可能的,这就引出了我的第二个问题。Java中是否有其他图形对象的工作方式与笔非常相似,也可以移动。我问这个问题的原因是因为我一直在开发一个绘图程序,该程序允许使用鼠标手势进行平移和放大缩小。在为隐式函数构建功能后,我意识到简单地清除绘图板并重新绘制所有内容将无法再切割它,因此我确实需要研究更有效的方法来处理图形的中间更改,而无需重新计算所有内容。例如,使用此代码或
GPen p = new GPen();
p.setLocation(100,100); //places the pen on the canvas at 100, 100
p.drawLine(-50,0); //draw a line left 50 pixels
p.drawLine(50,-50); //draw a line right and up 50 pixels each
p.drawLine(0,50); //draw a line down 50 pixels
这将导致一个简单的直角三角形,其右下角的最低点在特定画布上的100。我需要做的是能够将绘制的相同的线序列相对移动到另一个原点。我所希望的是一个类,它有单独的方法用于
setLocation()
和move()
,其中setLocation()
控制笔的位置和move()
将移动整个对象。好的,在这里我几乎没有得到任何关注,因此我得出结论,这样的方法只需要从头开始编写,然后继续这样做。我不完全确定发布我的专有代码会有多大帮助,但如果有人可以使用它,我会发布它的基本思想。由于笔实用程序本质上是一组行,而行是一组from和to,因此我创建了一个名为FPen(对于FunctionPen)的对象,它接受from和to的指令。在定义FPen时,无论需要多少次,都要传递它的起点和距离,仅此而已。一旦您传递了这些指令,我就创建了另一个名为returnGPen(Color c)
的方法,它将在调用时使用手头的指令并生成所需的GPen对象。当您想要移动整个GPen时,您可以创建一个名为adjustOrigin(双oX,双oY)的方法
将计算以前记录的原点和新原点之间的变化,并浏览指令列表并适当调整它们
我对这门课的需求完全是为了我的绘图程序,而且还没有完全完成,但它确实适用于大多数目的
import acm.graphics.GPen;
import java.awt.Color;
import java.util.ArrayList;
public class FPen{
private double relativeCenterX;
private double relativeCenterY;
private ArrayList<Double> fromX = new ArrayList<Double>();
private ArrayList<Double> fromY = new ArrayList<Double>();
private ArrayList<Double> distX = new ArrayList<Double>();
private ArrayList<Double> distY = new ArrayList<Double>();
public FPen(double rX, double rY, double z){
relativeCenterX = rX;
relativeCenterY = rY;
}
public void adjustOrigin(double cX, double cY){
double changeX = relativeCenterX-cX;
double changeY = relativeCenterY-cY;
for(int i = 0; i < fromX.size(); i++){
fromX.set(i,fromX.get(i)+changeX*zoom);
fromY.set(i,fromY.get(i)-changeY*zoom);
}
relativeCenterX = cX;
relativeCenterY = cY;
}
public void clear(){
fromX.clear();
fromY.clear();
distX.clear();
distY.clear();
}
public void drawLine(double fX, double fY, double tX, double tY){
fromX.add(fX);
fromY.add(fY);
distX.add(tX);
distY.add(tY);
}
public GPen returnGPen(Color c){
GPen pen = new GPen();
pen.setColor(c);
for(int i = 0; i < fromX.size(); i++){
pen.setLocation(fromX.get(i),fromY.get(i));
pen.drawLine(distX.get(i),distY.get(i));
}
return pen;
}
}
导入acm.graphics.GPen;
导入java.awt.Color;
导入java.util.ArrayList;
公共级FPen{
私人双相对中心;
私人双重相对关系;
private ArrayList fromX=new ArrayList();
private ArrayList fromY=new ArrayList();
private ArrayList distX=新的ArrayList();
private ArrayList distY=new ArrayList();
公共FPen(双rX、双rY、双z){
相对中心=rX;
相对中心=rY;
}
公共来源(双cX,双cY){
双变化x=相对中心cX;
双重变化=相对中心;
对于(int i=0;i
当然,一件意想不到的好事情是,我现在可以通过为每个绘制例程创建不同的方法并调用我感兴趣的内容,快速地对不同的绘制例程进行基准测试