Рассмотрим процесс разработки несложного приложение на android c использование этой системы для проектирования интерфейса и применением математических функций Java.
Приложение должно делать следующее: мы подаем исходную информацию программе в виде набора точек с известными координатами(они должны отображаться списком), а программа должна рассчитывать:
-расстояние между двумя точками по из названиям
-угол 1-2-3, где 1,2,3 - введенные названия точек
Очевидно, что расстояние между двумя точками несложно найти по теореме Пифагора: S=корень((X2-X1)^2+(Y2-Y1)^2)
Сложнее дело с нахождением угла между тремя точками по их координатам. Пусть эти 3 точки образуют треугольник, который мы будем решать.
Сначала найдем все 3 стороны треугольника по теорем Пифагора и решим треугольник по трем сторонам, применив теорему косинусов:
Алгоритм решения треугольника по 3 сторонам:
Запишем теорему косинусов для стороны с:
с^2=a^2+b^2-2*a*b*cos(C)
Преобразуем:
-2*a*b*cos(C)=c^2-a^2-b^2
cos(C)=(c^2-a^2-b^2)/(-2*a*b)
C=arccos( (c^2-a^2-b^2)/(-2*a*b) )
Мы нашли угол C по теореме косинусов. Точно также можно найти остальные 2 угла:
B=arccos( (b^2-a^2-c^2)/(-2*a*c) )
A=arccos( (a^2-c^2-b^2)/(-2*c*b) )
Разместим в string.xml в строке gui описание интерфейса приложения. Тут находится документация системы проектирования интерфейса, которую мы используем.
Создадим переменную для учета количества пунктов для обработки и массив, содержащий объекты класса Point(не более 100 штук), который мы опишем немного позднее. Проинициализируем в onCreate() наш интерфейс:
public class CheckerActivity extends GUIActivity { private int count=0; private Point[] array = new Point[100]; public void onCreate(Bundle savedInstanceState) { try{ requestWindowFeature(Window.FEATURE_NO_TITLE); //Убираем верхнюю панель с названием приложения super.onCreate(savedInstanceState); super.Init(getString(R.string.gui)); } catch(Exception e) { e.printStackTrace(); } }
Создадим и опишем прозрачный класс Point:
package com.checker; public class Point { double x; double y; String name; public Point(double _x, double _y, String _name) { x=_x; y=_y; name=_name; } public String toString() { return name+" "+x+" "+y; } }
Теперь запрограммируем кнопку, по нажатию на который в массив должна добавляться новая точка:
public void onClick(View arg0) { if(arg0.getTag().equals("add")) {//Вот таким образом мы проверяем, на какую кнопку нажал пользователь - сравнивая идентификатор с тегом нажатой кнопки. try { //Конструкция gui.getText(<имя поля>) считывает текст из поля с идентификатором <имя поля>. Что такое имя поля (мы его определяем при описании интерфейса в XML, читать тут) array[count]=new Point(Double.parseDouble(gui.getText("field2")),Double.parseDouble(gui.getText("field3")),gui.getText("field1"));//Вызовем конструктор созданного нами класса. count++; Output(); gui.setText("","field1");//Аналогично методу getText(). Первый аргумент - записывамый текст gui.setText("","field2"); gui.setText("","field3"); } catch(Exception e) { Toast.makeText(this, "Неккоректные данные", Toast.LENGTH_LONG).show();//Если возникла ошибка - например, юзер ввел в поля для координат что-то, что не является числом, следует вывести сообщение и больше ничего не делать } } //Здесь будут обработчики событий нажатия на другие кнопки }Напишем метод Output(), которые будет выводить список точек с известными координатами в текстовое поле:
private void Output() { String output=""; for (int i=0;i<count;i++) { output+=array[i].toString()+"\n"; } gui.setText(output,"info"); }Повесим обработчик на кнопку Reset - он должен сбрасывать все:
if(arg0.getTag().equals("clear")) { count=0; Output(); }
Переходим к самому главному - программной логике. Напишем метод, который будет находить расстояние между двумя точками - по названиям:
private double Dist(String name1, String name2) { try { //Определим переменные для координта пунктов double x1=0; double x2=0; double y1=0; double y2=0; for (int i=0;i<count;i++) {//Сейчас мы будем искать в массиве наши пункты - если из названия совпадут с данными, найдено if(array[i].name.equals(name1)) { //Нашли)) x1=array[i].x; y1=array[i].y; } //Аналогично if(array[i].name.equals(name2)) { x2=array[i].x; y2=array[i].y; } } double res=Math.round(Math.pow((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1), 0.5)*1000000)/(double)(1000000);//Посчитаем по теореме Пифагора и округлим return res; } catch(Exception e) { Toast.makeText(this, "Ошибка", Toast.LENGTH_LONG).show(); } return 0; }
Отлично, теперь можем оживить кнопку, отвечающую за расчет расстояния между двумя пунктами:
if(arg0.getTag().equals("s")) { String name1=gui.getText("n1"); String name2=gui.getText("n2"); String res=Dist(name1, name2)+""; gui.setText(res,"res"); }Алгоритм решения треугольника по трем сторонам достаточно примитивен, поэтому можно поместить его прямо в обработчик кнопки(вообще, этого стоит избегать, если код алгоритма превышает 10 строк):
if(arg0.getTag().equals("an")) { //Взяли углы String name1=gui.getText("an1"); String name2=gui.getText("an2"); String name3=gui.getText("an3"); //Посчитали стороны double c=Dist(name1, name3); double a=Dist(name1, name2); double b=Dist(name2, name3); //Нашли угол при центальнойц точке по теореме косинусов double angle=Math.round(Math.acos((c*c-b*b-a*a)/(-2*b*a))*180/Math.PI*1000000)/(double)(1000000); String res=angle+""; gui.setText(res,"res"); }
Комментариев нет:
Отправить комментарий