# Trace Code
###### tags: `2D-string`
### Point
```java=
//package squaretracing;
//定義Point
public class Point {
public static final int DIR_NORTH = 0; //方向
public static final int DIR_EAST = 1;
public static final int DIR_SOUTH = 2;
public static final int DIR_WEST = 3;
private int x; //x座標
private int y; //y座標
private int direction; //往哪個方向走
//一開始的起始點, 預設方向是North
public Point(int x, int y) {
this.x = x;
this.y = y;
this.direction = DIR_NORTH;
}
//有方向的Point
public Point(int x, int y, int direction) {
this.x = x;
this.y = y;
this.direction = direction;
}
//將point重設為refpoint
public Point(Point refPoint) {
this.x = refPoint.x;
this.y = refPoint.y;
this.direction = refPoint.direction;
}
//向右轉
public void faceRight() {
direction = (direction + 1) % 4;
}
//向左轉
private void faceLeft() {
if (direction == 0) {
direction = 3; //如果方向剛好向北, 用直接指定的方式指定方向
} else {
direction--;
}
}
//走一步
private void goForward() {
if (direction == DIR_NORTH) {
y = y - 1;
}
if (direction == DIR_EAST) {
x = x + 1;
}
if (direction == DIR_SOUTH) {
y = y + 1;
}
if (direction == DIR_WEST) {
x = x - 1;
}
}
//向右走一步
public void advanceToLeft() {
faceLeft();
goForward();
}
//向左走一步
public void advanceToRight() {
faceRight();
goForward();
}
//複製point
public Point getClone() {
return new Point(this);
}
//回傳Point現在面對的方向
public int getDirection() {
return direction;
}
//回傳Point現在的x座標
public int getX() {
return x;
}
//回傳Point現在的y座標
public int getY() {
return y;
}
//判斷兩個Point是否在同一個位置
//true代表在同一個位置
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Point other = (Point) obj;
if (this.x != other.x) {
return false;
}
if (this.y != other.y) {
return false;
}
return true;
}
}
```
### SquareTracingService
```java=
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
//Point.java
public class SquareTracingService {
//getContourPoints(): 圈出有'1'的範圍
//scrImage: 12*12
//回傳List, 裡面裝被圈出的Point的x座標, y座標
public List getContourPoints(int[][] scrImage) {
int[][] image = scrImage.clone(); //複製
clearBorder(image); //清除邊界
List points = new LinkedList();//{x1, y1, x2, y2, ...}
Point startingPoint = getStartingPoint(image); //找起始點
Point currentPoint = startingPoint.getClone(); //圈出'1'(會移動)
//走
//currentPoint從startingPoint開始走,
//如果currentPoint和startingPoint不一樣, 就加到points,
//直到繞一圈走回startingPoint結束
do {
//如果該位置是1
if (image[currentPoint.getX()][currentPoint.getY()] == 1) {
points.add(currentPoint.getClone().getX());//x座標存入points
points.add(currentPoint.getClone().getY());//y座標存入points
currentPoint.advanceToLeft();
} else {
currentPoint.advanceToRight();
}
} while (!startingPoint.equals(currentPoint)); //用的是Point.equals()
return points;
}
//getStartingPoint(): 找起始點
//一開始image已經被處理成只有0和1的[][], 1代表有東西
private Point getStartingPoint(int[][] image) {
//起始點從右下角開始找
for(int y = image.length; y >= 0; y--) {
for(int x = image[y].length;x >= 0; x--) {
if(image[x][y] == 1) {
return new Point(x, y);
}
}
}
return null;
}
//clearBorder(): 清除邊界
//邊界補0
private void clearBorder(int[][] image) {
for(int y = 0; y < image.length; y++) {
for(int x = 0; x<image[y].length; x++) {
if(y == 0 || x == 0 || y == image.length -1 || x == image[y].length - 1) {
image[x][y] = 0;
}
}
}
}
}
```