Пример Курсовой Программирование 1
.docxФедеральное агентство по образованию
ГОУ ВПО Уральский государственный горный университет
Кафедра информатики
ОТЧЁТ ПО КУРСОВОЙ РАБОТЕ по дисциплине Программирование на языках высокого уровня на тему: «Задача по обходу плоской фигуры»
Проверил: ДРУЖИНИНА Е.А.
Выполнил: ГЛАЗМАН М.В. АСУ-09-1
Екатеринбург, 2011
Формулировка задания
Фамилия: Глазман
Имя: Михаил
Отчество: Владимирович
группа АСУ-09-1
Алгоритмический язык: JAVA ECLIPSE
Необходимо обойти простую плоскую фигуру посредством запрограммированного красящего робота и максимально закрасить её. Робот умеет находить точку отсчёта, шагать, красить клетку, в которой находится.
Описание базового класса (Image)
init () – первоначальная инициализация;
paint () – метод, отвечающий за вывод графики;
findFirst () – поиск стартовой точки робота;
fill () – окраска пути.
Описание метода решения
Для решения поставленной задачи я использовал следующий алгоритм:
-
Создаём обходимую область
-
Для создания простой плоской фигуры строим прямоугольник;
-
Для усложнений плоской фигуры, достраиваем необходимое количество прямоугольников;
-
-
Запускаем робота на обход.
Примеры
Листинг программы
Класс Image
package DegWork2;import java.applet.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class Image extends Applet{
/**
*
*/
private static final long serialVersionUID = 1L;
/**Количество клеток*/
private Point dimension;
/**Размер клетки*/
private int size;
/**Смещение сетки*/
private int offset;
/**Ввод плоской фигуры*/
private int map[][];
/**Возможно ли посторить поле, возможно, при clickCount=2 */
private int clickCount;
private Point fstClick;
private FieldsManager fields;
private Robot robot;
/**Карта с номерами шагов*/
private String[][] numericMap;
/**Номер шага*/
private int nomberOfStep;
/**test variable*/
boolean flag;
int rbClickCount;
boolean stage;
public Image(){
}
public void init(){
dimension = new Point(25, 40);
size = 20;
offset = 10;
map = new int[dimension.y][dimension.x];
fields = new FieldsManager(10);
robot = new Robot(dimension.x, dimension.y, fields);
numericMap = new String[dimension.y][dimension.x];
stage = true;
flag = false;
//Инициализация карты
for (int i=0; i<dimension.y; i++)
for (int j=0; j<dimension.x; j++){
map[i][j] = -1;
numericMap[i][j] = "";
};
rbClickCount = 0;
this.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent event){
//System.out.println(getCursorPos(event));
switch (event.getButton()){
case 1: clickCount++;
switch (clickCount){//Нажата левая кнопка мыши
case 1: fstClick = getCursorPos(event);
System.out.println("fst point detected");
break;
case 2: fillField(new Field(fstClick, getCursorPos(event)), 0);
clickCount = 0;
System.out.println("snd point detected");
break;
}
break;
case 3: flag = true;
nomberOfStep = 0;
rbClickCount++;
if(rbClickCount==2){
rbClickCount=0;
for (int i=0; i<dimension.y; i++)
for (int j=0; j<dimension.x; j++){
if (map[i][j] == 1){
map[i][j] = 0;
numericMap[i][j+1] = "";
}
}
} else
findFirst();
break;
}
repaint();
}
});
}
public void paint(Graphics graphics){
//Ограничение окна
this.setSize(820,520);
for (int i=0; i<dimension.y; i++)
for (int j=0; j<dimension.x; j++){
switch (map[i][j]){
case -1:graphics.setColor(Color.RED);//Заблокированные
fillSquare(new Point(j,i), graphics);
break;
case 1: graphics.setColor(Color.GREEN);//Пройденые
fillSquare(new Point(j,i), graphics);
break;
case 2: graphics.setColor(Color.YELLOW);//Пройденые
fillSquare(new Point(j,i), graphics);
break;
}
if (numericMap[i][j]!=""){
graphics.setColor(Color.DARK_GRAY);
drawChar(numericMap[i][j].toCharArray(), i, j, graphics);
}
}
drawWeb(graphics);
graphics.setColor(Color.BLUE);
}
public void findFirst(){
int i,j; j=0;
label1:
for (i=0; i<dimension.y; i++)
for (j=0; j<dimension.x; j++)
if (map[i][j]==0){
break label1;
}
System.out.println("Start from here "+new Point(i,j));
fill(new Point(i,j));
}
public void fill(Point enter){
System.out.println("fill() was started");
Point next;
if (stage){
System.out.println("Stage is "+stage);
if (enter.y-1>=-1 || map[enter.x][enter.y-1]==-1){
System.out.println("lineDown() from "+enter);
next = lineDown(enter);//Выше некуда
if (map[next.x][next.y]==0){
stage=false;
fill(next);
} else return;
}
} else {
System.out.println("Stage is "+stage);
if (enter.y+1<=dimension.x || map[enter.x][enter.y+1]==-1){
System.out.println("lineUp() from "+enter);
next = lineUp(enter);//Ниже некуда
if (map[next.x][next.y]==0){
stage=true;
fill(next);
} else return;
}
}
}
public Point lineDown(Point fst){
int length = 0;
while (map[fst.x][fst.y+length+1]!=-1 && (fst.y+length+1<dimension.x)){
map[fst.x][fst.y+length] = 1;
numericMap[fst.x][fst.y+length+1] = String.valueOf(nomberOfStep++);
++length;
}
{
map[fst.x][fst.y+length] = 1;
numericMap[fst.x][fst.y+length+1] = String.valueOf(nomberOfStep++);
++length;
}
System.out.println("The result of lineDown() is "+new Point(fst.x, fst.y+length-1));
return new Point(fst.x+1, fst.y+length-1);
}
public Point lineUp(Point fst){
int length = 0;
while (map[fst.x][fst.y-length-1]!=-1 && (fst.y-length-1>0)){
map[fst.x][fst.y-length] = 1;
numericMap[fst.x][fst.y-length+1] = String.valueOf(nomberOfStep++);
++length;
}
{
map[fst.x][fst.y-length] = 1;
numericMap[fst.x][fst.y-length+1] = String.valueOf(nomberOfStep++);
++length;
}
System.out.println("The result of lineUp() is "+new Point(fst.x, fst.y-length+1));
return new Point(fst.x+1, fst.y-length+1);
}
/**@return Координаты, пригодные для взятия значений в массиве
* */
public Point getCursorPos(MouseEvent event){
Point pos = event.getPoint();
if (pos.x>offset && pos.x<offset+size*dimension.y){
if (pos.y>offset && pos.y<offset+size*dimension.x){
pos = new Point(pos.x-offset, pos.y-offset);
return new Point((int)pos.x/size, (int)pos.y/size);
}
}
return new Point(0,0);
}
/**Изменить значения в map и добавить в fields*/
public void fillField(Field field, int color){
Point fst, snd;
fst = field.getFst();
snd = field.getSnd();
for (int i=fst.x; i<=snd.x; i++)
for (int j=fst.y; j<=snd.y; j++)
map[i][j] = color;
fields.push(new Field (fst, snd));
}
/**Закрасить клетку*/
public void fillSquare(Point coord, Graphics graphics){
graphics.fillRect(offset+size*coord.y, offset+size*coord.x, size, size);
}
/**Нарисовать сетку*/
public void drawWeb(Graphics graphics){
//Горизонтальные линии сетки
for (int i=0; i<=dimension.x; i++){
graphics.setColor(Color.LIGHT_GRAY);
graphics.drawLine(offset, offset+i*size, size*dimension.y+offset, offset+i*size);
}
//Вертикальные линии сетки
for(int i=0; i<=dimension.y; i++){
graphics.setColor(Color.LIGHT_GRAY);
graphics.drawLine(offset+i*size, offset, offset+i*size, size*dimension.x+offset);
}
}
/**Совершить роботом обход указанного поля
* @param Поле, которое необходимо обойти
* */
public void drawPass(Field field){
Point[] pass = robot.getPass(field);
Point curPoint;
for (int i=0; i<pass.length; i++){
curPoint = pass[i];//Принять точку
map[curPoint.x][curPoint.y-1] = 1;
numericMap[curPoint.x][curPoint.y] = String.valueOf(nomberOfStep++);
}
}
public void drawChar(char chr[], int i , int j, Graphics graphics){
graphics.drawChars(chr, 0, chr.length, offset+i*size+1, offset+j*size);
}
public void drawRect(Field field, Graphics graphics){
graphics.drawRect(offset+size*field.getFst().x, offset+size*field.getFst().y, size*field.getSnd().x, size*field.getSnd().y);
}
}
Класс Field
package DegWork2;
import java.awt.Point;
public class Field {
private Point fst;
private Point snd;
private Point[][] points;
public Field(Point fst, Point snd){
this.fst = fst;
this.snd = snd;
//Инвертируем вершины, если они заданы не по диагонали слева направо и вниз
int temp;
if (fst.x>snd.x){
temp = fst.x; fst.x = snd.x; snd.x = temp;
}
if (fst.y>snd.y){
temp = fst.y; fst.y = snd.y; snd.y = temp;
}
//Заполняем поле объектами Point - его экранными координатами
Point dim = getDimension();
points = new Point[dim.x][dim.y];
for (int i=0; i<dim.x; i++)
for (int j=0; j<dim.y; j++)
points[i][j] = new Point(fst.x+i, fst.y+j+1);
}
public Point getDimension(){
return new Point(Math.abs(fst.x-snd.x-1), Math.abs(fst.y-snd.y-1));
}
/**@return координаты для поля на экране по заданным координатам для данного поля*/
public Point getWindowCoord(int i, int j){
return points[i][j];
}
public Point getFst(){
return fst;
}
public Point getSnd(){
return snd;
}
}
Класс FieldsManager
package DegWork2;
public class FieldsManager {
private Field fields[];
public int countEl;//Доступно из вне, количество полей
private int maxCount;
FieldsManager(int maxCount){
fields = new Field[maxCount];
this.maxCount = maxCount;
countEl = 0;
}
public void push(Field field){
if (countEl+1<maxCount){
fields[countEl++] = field;
}
}
public Field get(int nom){
return fields[nom];
}
}