如何移动整个GPen对象?

时间:2013-09-12 10:14:14

标签: java graphics

在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()将移动整个对象。

1 个答案:

答案 0 :(得分:0)

好的,所以在这里几乎没有受到关注,我得出的结论是,这样的方法只需要从头开始编写并继续执行。我不完全确定发布我的专有代码会有多大帮助,但如果有人可以使用它,我会发布它的基本概念。由于Pen实用程序基本上是一堆行和行,所以我创建了一个对象,我称之为FPen(对于FunctionPen)接受from和to的指令。在定义FPen的同时,你可以将它传递到何处,以及你需要多长时间才能完成它,就是这样。一旦你通过了这些指令,我就创建了另一个名为returnGPen(Color c)的方法,它将在电话中使用它手头的指令并生成所需的GPen对象。当你想移动整个GPen时,你可以创建一个名为adjustOrigin(double oX, double oY);的方法,它将计算以前记录的原点和这个新原点的变化,并浏览指令列表并适当调整它们。

我对这个类的需求严格来说是我的Graphing程序,并没有完全完成,但它确实适用于大多数用途。

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;

   }

}

当然,由此产生的一个意想不到的好处是,我现在可以通过为每个绘制例程创建不同的方法并调用我感兴趣的内容来快速对不同的绘图例程进行基准测试。