Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.06.2011, 01:34   #1
P.A.U.L
 
Регистрация: 11.10.2009
Сообщений: 9
По умолчанию Как правильно написать условие принадлежности точек заданной области

Парни, подскажите плиз кто в этом шарит. Язык Java, но не в этом суть.

Как правильно написать условие принадлежности точек заданной области.

Вот задана область(черным цветом выделена)



Необходимо написать условие, при котором, когда заданные точки находятся в этой области то возвращается значение "+", если вне этой области, то возвращается значение "-".

Уже есть наработки:

PHP код:
    public String valid(double x,double y){
                
                
double alpha=0.0;
        
double xa=Math.abs(Math.round(x*Math.cos(alpha/180.0*Math.PI)+y*Math.sin(alpha/180.0*Math.PI)));
        
double ya=Math.abs(Math.round(y*Math.cos(alpha/180.0*Math.PI)-x*Math.sin(alpha/180.0*Math.PI)));
        
double v=5.5;
    
        if(
xa<=&& ya<=v){    
                return 
"+";
        }
        else return 
"-";
    } 
В этой реализации рассматривается область, квадрат 5.5 x 5.5, а как добавить в рассмотрение вырезанную область по углам квадрата? (Радиус вырезанной области равен 5, цена деления графика = 30px)

Это координаты точек:

PHP код:
    public double xtable[]={1.0, -3.0, -7.07.16.01.0, -4.02.1};
    public 
double ytable[]={2.0, -3.01.0, -2.12.46.3, -1.0,-3.0}; 
А вот так вывожу принадлежность точек

PHP код:
g.drawString(valid(xtable[i],ytable[i]),220,55+i*30); 
Заранее благодарю за помощь
P.A.U.L вне форума Ответить с цитированием
Старый 16.06.2011, 07:02   #2
Serebro
FORTRAN programmer
Форумчанин
 
Регистрация: 08.12.2009
Сообщений: 153
По умолчанию

По рисунку видно, что радиус равен 2.5


Нужно дополнительно проверить принадлежность точки кругу с центром в точке
(+/- 5.5; +/- 5.5), радиус круга r=5 (или r=2.5 ?).
Serebro вне форума Ответить с цитированием
Старый 16.06.2011, 13:44   #3
P.A.U.L
 
Регистрация: 11.10.2009
Сообщений: 9
По умолчанию

Да, r=2.5, спутал немного)
P.A.U.L вне форума Ответить с цитированием
Старый 16.06.2011, 17:43   #4
Партизанин
Пользователь
 
Аватар для Партизанин
 
Регистрация: 13.06.2011
Сообщений: 16
Счастье Принадлежность заданной области

P.A.U.L, тут особо сложного ничего и нету! Область довольно простая и симметричная к тому же...

Если не ошибаюсь, то могу предложить следующий вариант решения:

Код:
        public boolean inArea(double x, double y)
	{
		if ((Math.abs(x) <= 5.5) && (Math.abs(y) <= 5.5) && // проверка на принадлежность квадрату
		    (Math.pow(x - 5.5, 2) + Math.pow(y - 5.5, 2) > Math.Pow(2.5, 2))) // проверка на НЕпринадлежность кругам
			return true; // т.е. "+"
		else return false; // т.е. "-"
	}
P.S.: Если вдруг непонятно, как проверяется принадлежит ли точка какому-либо кругу:
Уравнение круга: (x - x0) ^ 2 + (y - y0) ^ 2 = R ^ 2
Оно то и проверяется!

Последний раз редактировалось Партизанин; 17.06.2011 в 16:39. Причина: Ошибся с типом параметров: вместо int надо double
Партизанин вне форума Ответить с цитированием
Старый 17.06.2011, 01:19   #5
P.A.U.L
 
Регистрация: 11.10.2009
Сообщений: 9
По умолчанию

Спасибо большое, вы меня выручили!)

З.Ы. Проверил код, принадлежность квадрату проверяет правильно, а вот кругам нет: правильно определяет только для круга с центром (5.5;5.5), в чем может быть проблема?

З.Ы.Ы. Додумал сам)))

Код:
	 public boolean inArea(double x, double y)
		{
			if ((Math.abs(x) <= 5.5) && (Math.abs(y) <= 5.5) && //проверка на принадлежность квадрату
			    (Math.pow(x - 5.5, 2) + Math.pow(y - 5.5, 2) > Math.pow(6.25, 2)) &&
			    (Math.pow(x + 5.5, 2) + Math.pow(y - 5.5, 2) > Math.pow(6.25, 2)) &&
			    (Math.pow(x + 5.5, 2) + Math.pow(y + 5.5, 2) > Math.pow(6.25, 2)) &&
			    (Math.pow(x - 5.5, 2) + Math.pow(y + 5.5, 2) > Math.pow(6.25, 2)))
				return true; // т.е. "+"
			else return false; // т.е. "-"
		}

Последний раз редактировалось P.A.U.L; 17.06.2011 в 03:57.
P.A.U.L вне форума Ответить с цитированием
Старый 17.06.2011, 13:52   #6
Партизанин
Пользователь
 
Аватар для Партизанин
 
Регистрация: 13.06.2011
Сообщений: 16
Хорошо Модификация алгоритма

P.A.U.L, да, тут дал промаха... Но я исправлюсь

Один вопрос: зачем 6.25 возводить в квадрат?
Ведь при радиусе равным R = 2.5 => R ^ 2 = 6.25
Получается квадрат радиуса в квадрате? (Math.pow(6.25, 2))

P.S.: По идее ещё можно модифицировать алгоритм до такого:

Код:
        public boolean inArea(double x, double y)
	{
		if ((Math.abs(x) <= 5.5) && (Math.abs(y) <= 5.5) && // проверка на принадлежность квадрату
		    (Math.pow(Math.abs(x) - 5.5, 2) + Math.pow(Math.abs(y) - 5.5, 2) > Math.pow(2.5, 2))) // проверка на НЕпринадлежность кругам
			return true; // т.е. "+"
		else return false; // т.е. "-"
	}
Партизанин вне форума Ответить с цитированием
Старый 18.06.2011, 09:33   #7
P.A.U.L
 
Регистрация: 11.10.2009
Сообщений: 9
Радость

Партизанин, тут уже я дал промаху.
Запутался в вычислениях)

У меня еще есть один вопрос:
Закрашенной области необходимо двигаться при нажатии кнопок, это я назначил.

Что необходимо поменять в коде программы, чтобы правильно вычислялась принадлежность точек при смещении области.

Таким образом у меня назначены точки вершин области(квадрата):
PHP код:
public double xgraph[]={5.5, -5.5, -5.55.5};
public 
double ygraph[]={5.55.5, -5.5, -5.5}; 
Пробовал изменить до такого:

PHP код:
         public boolean inArea(double xdouble y){
            
         for(
int i=0;i<xgraph.length;i++){ 
             if ((
Math.abs(x) <= xgraph[i]) && (Math.abs(y) <= ygraph[i]) && //проверка на принадлежность квадрату
                
                     //проверка на НЕпринадлежность кругам
                    
(Math.pow(Math.abs(x) - 5.52) + Math.pow(Math.abs(y) - 5.52) > Math.pow(k/22)))
                    return 
true// т.е. "+"
                
else return false// т.е. "-"
            
}
            return 
false;
    } 
Но правильно работать не стало.

З.Ы. k - это диаметр круга

Последний раз редактировалось P.A.U.L; 18.06.2011 в 09:57.
P.A.U.L вне форума Ответить с цитированием
Старый 18.06.2011, 12:13   #8
Партизанин
Пользователь
 
Аватар для Партизанин
 
Регистрация: 13.06.2011
Сообщений: 16
Лампочка Поправки к реализации

P.A.U.L, а оно вообще работает?

Насколько я понимаю - модуль отрицательным быть не может, а следовательно проверки:

Код:
if (Math.abs(x) <= xgraph[i]) // ... // 
if (Math.abs(y) <= ygraph[i]) // ... //
никогда не пройдут при отрицательных значениях xgraph[i] или ygraph[i]
Например:
Код:
x = -100;
xgraph[1] = -5.5;
if (Math.abs(x) <= xgraph[1]) // ... //
Math.abs(x) = 100, что никак не может быть меньше 0 и тем более меньше -5.5

Предложенный вариант решения был рассчитан на конкретную задачу, но думаю, что теперь, если добавить нахождение модуля и для значений из xgraph и ygraph:
Код:
if ((Math.abs(x) <= Math.abs(xgraph[i])) && (Math.abs(y) <= Math.abs(ygraph[i])) // ... //
То проблема будет решена и для универсальных значений (т.е. любых)

Ну и конечно же надо добавить в качестве передаваемых параметров в функцию массивы с точками и радиус круга:

Код:
public boolean inArea(double x, double y, double x[], double y[], double r)
{
    // ... //
}
Партизанин вне форума Ответить с цитированием
Старый 18.06.2011, 15:17   #9
P.A.U.L
 
Регистрация: 11.10.2009
Сообщений: 9
По умолчанию

Партизанин, ваш алгоритм у меня почему то не захотел работать правильно. Я попробовал сделать проще, и у меня заработало)

Код:
	public boolean inArea(double x, double y){ 
	    
		//Проверка на принадлежность квадрату
	if ((x <= xgraph[0]) && (y <= ygraph[0]) && 
	    (x >= xgraph[1]) && (y <= ygraph[1]) &&
	    (x >= xgraph[2]) && (y >= ygraph[2]) &&
	    (x <= xgraph[3]) && (y >= ygraph[3]) &&
	    	
		//проверка на НЕпринадлежность кругам
	    (Math.pow(x - xgraph[0], 2) + Math.pow(y - ygraph[0], 2) > Math.pow(k/2, 2)) &&
		(Math.pow(x - xgraph[1], 2) + Math.pow(y - ygraph[1], 2) > Math.pow(k/2, 2)) &&
		(Math.pow(x - xgraph[2], 2) + Math.pow(y - ygraph[2], 2) > Math.pow(k/2, 2)) &&
		(Math.pow(x - xgraph[3], 2) + Math.pow(y - ygraph[3], 2) > Math.pow(k/2, 2)))
		return true; // т.е. "+"
			else return false; // т.е. "-"
	 }
А координаты вершин области, массива xgraph[] меняются отдельной функцией.

Последний раз редактировалось P.A.U.L; 18.06.2011 в 16:52.
P.A.U.L вне форума Ответить с цитированием
Старый 18.06.2011, 15:50   #10
Партизанин
Пользователь
 
Аватар для Партизанин
 
Регистрация: 13.06.2011
Сообщений: 16
Лампочка Реализация алгоритма

Похвально - что заработало!

Цитата:
Сообщение от P.A.U.L Посмотреть сообщение
Партизанин, твой алгоритм у меня почему то не захотел работать правильно.
Вот довёл до конца идею:
Код:
public class Area {
	double[] xgraph={5.5, -5.5, -5.5, 5.5};
	double[] ygraph={5.5, 5.5, -5.5, -5.5};
	double k = 2.5;
	
	public boolean inArea(double x, double y)
	{
		for (int i = 0; i < xgraph.length; i++)
			// проверка на принадлежность квадрату
			if ((Math.abs(x) <= Math.abs(xgraph[i])) && (Math.abs(y) <= Math.abs(Math.abs(ygraph[i]))))
			// проверка на НЕпринадлежность кругам
				if (Math.pow(Math.abs(x) - Math.abs(xgraph[i]), 2) +
					Math.pow(Math.abs(y) - Math.abs(ygraph[i]), 2) > 
				 	Math.pow(k, 2))
					return true;
		return false;
	}
	
	public static void main(String[] args) {
	    double[] xtable={1.0, -3.0, -7.0, 7.1, 6.0, 1.0, -4.0, 2.1, 5.0,  5.0, -5.0, -5.0}; 
	    double[] ytable={2.0, -3.0, 1.0, -2.1, 2.4, 6.3, -1.0,-3.0, 5.0, -5.0, -5.0,  5.0}; 
	    
		Area area = new Area();
		for (int i = 0; i < xtable.length; i++)
		{
			System.out.println("x[" + i + "] = " + xtable[i]);
			System.out.println("y[" + i + "] = " + ytable[i]);
			
			if (area.inArea(xtable[i], ytable[i])) System.out.println(" inArea");
			else System.out.println(" outArea");
		}
	}
Потестировал немного - вроде всё правильно! Если есть желание - можете потестировать на своих значениях

P.S.: Извините, что не отформатировал текст, как раньше - поднадоело бороться с "кривой" работой тега "COLOR"

Последний раз редактировалось Партизанин; 18.06.2011 в 15:55. Причина: Отредактировал текст
Партизанин вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль Принадлежность точки заданной области Unikummm Помощь студентам 18 28.11.2010 16:04
правильно написать условие в паскаль Александр1991 Помощь студентам 1 31.10.2010 11:14
Как правильно поставить условиЕ. 89legend89 Microsoft Office Excel 5 07.10.2010 00:09
Поиск принадлежности точки области CrazyN00b Win Api 3 13.04.2010 00:19
как правильно поставить условие ГОСЕАН Помощь студентам 5 27.04.2009 10:52