0

在使用 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、100 处。我需要做的是能够将相同的绘制线序列相对于彼此移动到另一个原点。我希望的是一个类,它具有单独的方法setLocation()和控制笔位置的位置,并且move()可以移动整个对象。setLocation()move()

4

1 回答 1

0

好的,所以在这里几乎没有受到关注,我得出的结论是,这种方法只需要从头开始编写并继续执行。我不完全确定发布我的专有代码会有多大帮助,但如果有人可以使用它,我会发布它的基本思想。由于 Pen 实用程序本质上是一堆线条,而线条是一堆 from 和 to,我创建了一个我称为 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;

   }

}

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

于 2013-09-20T11:37:05.547 回答