在Java中,使用acm.graphics GPen有任何方法来移动整个绘制的线条序列吗?我已经彻底阅读了手册,我开始认为这是不可能的,这就引出了我的第二个问题。在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,100。我需要做的是能够移动这个相同的绘制线序列相对于另一个起源。我希望的是一个为setLocation()和move()提供独立方法的类,其中setLocation()控制笔位置,move()可以移动整个对象。
发布于 2013-09-20 11:37:05
好的,在这里我几乎没有受到任何关注,所以我得出这样的结论,这种方法只需要从头开始编写,然后就这样做了。我不完全确定发布我的专有代码会有多大帮助,但如果有人可以使用它,我会发布它的基本想法。由于Pen实用程序本质上是一堆行,行是一堆往返行,所以我创建了一个名为FPen (用于FunctionPen)的对象,它接受from和to的指令。在定义FPen时,您可以传递它从何处开始,以及无论您需要多少次都要走多远,仅此而已。一旦您传递了这些指令,我就创建了另一个名为returnGPen(Color c)的方法,它将随时使用手头的指令,并生成所需的GPen对象。当您想要移动整个GPen时,您可以创建一个名为adjustOrigin(double oX, double 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;
}
}当然,由此产生的一个意想不到的好处是,我现在可以通过为每个程序创建不同的方法并调用我感兴趣的东西来快速测试不同的绘图例程。
https://stackoverflow.com/questions/18761471
复制相似问题