0

グラフィックス 2D を使用してバッファリングされたイメージとして jpanel に線を描画しています。ポイントをペアとして、つまり開始点の x 座標と y 座標をペアとして保存し、終点の x 座標と y 座標を別のペアとして保存したいと考えています。ペア。いくつかの行があるため、これらすべてのペアをリストとして保存し (または 2 つ - 始点用と終点用に 1 つ)、行が移動してポイントが変更された場合にそれらを更新できるようにしたいと考えています。指定されたポイントはリストにあります。どうすればこれを行うことができますか?これは可能ですか?

私は Pair クラスを持つことを見てきましたが、それがどのように機能するのか、またペアのリストを持つことができるのかどうかはわかりません。また、マップと配列リストの使用を検討しましたが、探している機能を備えているようには見えません (または、知らないだけかもしれません)。

現時点では、線を描いているだけですが、ポイントは保存されていません。これはすべての描画を行うクラスです:

package floorplan;

/**
*
* @author xodkx
*/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.awt.event.MouseListener;

public class Floor extends JPanel implements MouseListener, MouseMotionListener
{


  private static final int WIDTH = Integer.parseInt(JOptionPane.showInputDialog("Please    
  enter the width of your room"));
  private static final int LENGTH = Integer.parseInt(JOptionPane.showInputDialog("Please   
  enter the width of your room"));
  private static final Color BACKGROUND = Color.WHITE;
  private static final Color INITIAL_COLOUR = Color.BLACK;
  private static final Framework INITIAL_FRAMEWORK = Framework.FLEXIBLEWALL;

  private MouseState state = MouseState.IDLE;
  private Framework frameworkType = INITIAL_FRAMEWORK;
  private Color colour = INITIAL_COLOUR;



  private Point start = null; // START POINT
  private Point end = null; // END POINT


  private BufferedImage bufImage = null;


  public Floor()
  {
    setPreferredSize(new Dimension(LENGTH,WIDTH));
    setBackground(Color.white);
    setBorder(BorderFactory.createLineBorder (Color.black, 5));

    this.addMouseListener(this);
    this.addMouseMotionListener(this);

 }

 public void setColor(Color color)
 {
    colour = color;

 }

 public void setFramework(Framework framework)
 {
    frameworkType = framework;
 }

 @Override
 public void paintComponent(Graphics g)
 {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D)g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,   
     RenderingHints.VALUE_ANTIALIAS_ON);

    if(bufImage == null)
    {
        int h = this.getHeight();
        int w = this.getWidth();
        bufImage = (BufferedImage)this.createImage(h,w);
        Graphics2D gc = bufImage.createGraphics();
        gc.setColor(BACKGROUND);
        gc.fillRect(0, 0, w, h);
    }


    g2.drawImage(bufImage,null,0,0);

    drawGrid(g2);

    if(state == MouseState.DRAGGING)
    {
        createComponent(g2);
    }
 }

 public void drawGrid(Graphics g2)
 {
    int gridDivisions = 20;
    int divisionSize = WIDTH/gridDivisions;
    int grid = WIDTH*LENGTH;

    g2.setColor(Color.lightGray);

    for(int i=1; i<grid; i++)
    {
        int x = i * divisionSize;
        g2.drawLine(x,0,x,getSize().height);
    }

    for(int i=1; i<grid; i++)
    {
        int y = i*divisionSize;
        g2.drawLine(0,y,getSize().width,y);
    }
 }


 public void createComponent(Graphics2D g2)
 {
     g2.setColor(colour);

    switch (frameworkType)
    {
        case FLEXIBLEWALL:
            g2.setStroke(new BasicStroke(5));
            g2.drawLine(start.x, start.y, end.x,end.y);
            break;

        case VERTICALWALL:
            g2.setStroke(new BasicStroke(5));
            end.x = start.x;
            g2.drawLine(start.x,start.y,end.x,end.y);
            break;

        case HORIZONTALWALL:
            g2.setStroke(new BasicStroke(5));
            end.y = start.y;
            g2.drawLine(start.x,start.y,end.x,end.y);

        case DOOR:
            g2.setStroke(new BasicStroke(5));
            g2.drawLine(start.x, start.y, end.x,end.y);
            break;

        case WINDOW:
            g2.setStroke(new BasicStroke(5));
            g2.drawLine(start.x, start.y, end.x,end.y);
            break;


        default:
            g2.drawString("test", 10, 20);
            break;
     }
 }

 public void clear() 
 {

    bufImage.flush();
    bufImage = null;
    repaint();
 }


 @Override
 public void mousePressed(MouseEvent e)
 {
    state = MouseState.DRAGGING;
    start = e.getPoint();
    end = start;
 }

 @Override

 public void mouseDragged(MouseEvent e)
 {

    state = MouseState.DRAGGING;
    end = e.getPoint();
    this.repaint();

 }

  @Override
  public void mouseReleased(MouseEvent e)
 {
    end = e.getPoint();
    if(state == MouseState.DRAGGING)
    {
        state = MouseState.IDLE;
        createComponent(bufImage.createGraphics());
        this.repaint();
    }
 }

 public void updateLocation(MouseEvent e)
 {

 }


 @Override
 public void mouseClicked(MouseEvent e)
 {

 }

 @Override
 public void mouseEntered(MouseEvent e)
 {

 }

 @Override
 public void mouseExited(MouseEvent e)
 {

 }



 @Override
 public void mouseMoved(MouseEvent e)
 {

 }

}
4

3 に答える 3

3

を使用しjava.awt.geom.Line2Dます。リストやその他のコレクションに入れることができます。と がequals()ありhashCode()ます。

Line2D.Float必要なスペースが少ない を使用することができますLine2D.Double。これは、計算に便利です。

そのような行が数十万ある場合、状況は変わります。すると居心地が悪くなります。そのため、 aint[]が最もメモリ効率が高いですが、これは別の問題です。

于 2013-02-18T12:49:49.183 に答える
0
package util;

public final class Pair<S,T> {
 public S first;
 public T second;

 public Pair(S first, T second) {
    super();
    this.first = first;
    this.second = second;
 }

 public S getFirst() {
    return first;
 }

 public T getSecond() {
    return second;
 }

 public void setFirst(S first) {
    this.first = first;
 }

 public void setSecond(T second) {
    this.second = second;
 }


 @Override
 public int hashCode() {
     final int prime = 31;
     int result = 1;
     result = prime * result + ((first == null) ? 0 : first.hashCode());
     result = prime * result + ((second == null) ? 0 : second.hashCode());
     return result;
 }

 @Override
 public boolean equals(Object obj) {
     if (this == obj)
         return true;
     if (obj == null)
         return false;
     if (getClass() != obj.getClass())
         return false;
     Pair<?,?> other = (Pair<?,?>) obj;
     if (first == null) {
         if (other.first != null)
             return false;
     } else if (!first.equals(other.first))
         return false;
     if (second == null) {
         if (other.second != null)
             return false;
     } else if (!second.equals(other.second))
         return false;
     return true;
 }

 @Override
 public String toString() {
     return "<"+first+","+second+">";
 }

}
于 2013-02-18T12:52:05.893 に答える
-1

まず、すべてのポイントを 1 つのリストに格納できるため、偶数の位置にあるポイントは線分の始点になり、奇数の位置にあるポイントは終点になります。

List <Point> points = Arrays.asList (
    new Point (100, 100), new Point (200, 100),  // First line segment
    new Point (200, 100), new Point (200, 200),  // Second line segment
    new Point (200, 200), new Point (100, 100)); // Third line segment

また、ポイントの配列をリストに格納することもできます。そのため、各配列は曲線を表し、原因曲線は 1 つのセグメントのみを含む場合があります。

List <Point []> points = Arrays.asList (
    new Point [] {new Point (100, 100), new Point (200, 100)},  // First line segment
    new Point [] {new Point (200, 100), new Point (200, 200)},  // Second line segment
    new Point [] {new Point (200, 200), new Point (200, 100), new Point (100, 100)); // Curve of third and fourth segments

そしてもちろん、次のように 2 つのポイントを格納する独自のクラスを宣言できます。

public class TwoPoints
{
    public final Point begin;
    public final Point end;

    public TwoPoints (int x1, int y1, int x2, int y2)
    {
        this (new Point (x1, y1), new Point (x2, y2));
    }

    public TwoPoints (Point begin, Point end)
    {
        this.begin = begin;
        this.end = end;
    }
}

このクラスのオブジェクトは、間違いなくリストに保存できます。

List <TwoPoints> lines = Arrays.asList (
    new TwoPoints (100, 100, 100, 200),  // First line segment
    new TwoPoints (100, 200, 200, 200),  // Second line segment
    new TwoPoints (200, 200, 100, 100)); // Third line segment
于 2013-02-18T12:56:19.553 に答える