Страницы

Поиск по вопросам

четверг, 6 июня 2019 г.

Проверить, принадлежит ли какая-либо точка отрезка заданной (заданным) окружностям

Привет. Прошу помощи. В общем задача: на координатной плоскости задается отрезок с началом в точке А и с концом в точке В. Также задаются круги (можно и 1 круг) с центрами в точках M1,M2,M3,...M100 и с радиусами R1,R2,R3,...,R100. Нужно проверить, принадлежит ли какая-либо точка отрезка заданной (заданным) окружностям. В общем-то это задача из олимпиады, код компилируется на сервере. Мой код: http://ideone.com/J5MJEH double xA, yA, xB, yB; int count = 0; int n;
cin >> xA >> yA >> xB >> yB; // Координаты A и B отрезка: cin >> n; // Количество окружностей
double * * Arr = new double * [3]; // Задаем массив для кругов, в каждой строчке которого будут хранится x,y,r круга for (int i = 0; i < n; i++) Arr[i] = new double[3];
for (int i = 0; i < n; i++) { for (int j = 0; j < 3; j++) { cin >> Arr[i][j]; } } double r12 = sqrt((xB - xA) * (xB - xA) + (yB - yA) * (yB - yA)); // Длина отрезка от A до B for (int i = 0; i < n; i++) { double r1 = sqrt((Arr[i][0] - xA) * (Arr[i][0] - xA) + (Arr[i][1] - yA) * (Arr[i][1] - yA)); // Длина отрезка от т. M до A double r2 = sqrt((Arr[i][0] - xB) * (Arr[i][0] - xB) + (Arr[i][1] - yB) * (Arr[i][1] - yB)); // Длина отрезка от т. M до B
if (((r12 * r12 + r1 * r1) - r2 * r2) >= 0 && ((r12 * r12 + r2 * r2) - r1 * r1) >= 0) { // Если перпендикуляр опущенный на прямую, проведенную через A u B лежит на отрезке AB, то проверяем, равен или больше ли радиус окружности double d = (abs((yB - yA) * Arr[i][0] + (xB - xA) * Arr[i][1] + (xA * yB - yA * xB))) / sqrt((yB - yA) * (yB - yA) + (xB - xA) * (xB - xA)); if ((Arr[i][2] - d) >= 0) { count++; } } else { // Иначе, если перпендикуляр опущенный на прямую лежит вне отрезка, то проверяем, равен или больше ли радиус одному из отрезков от точки М до А или В if ((Arr[i][2] - r1) >= 0 || (Arr[i][2] - r2) >= 0) { count++; } } } cout << count; В комментариях кода написал, что,где, как нахожу. То, как определить, падает ли перпендикуляр на отрезок, я взял отсюда: http://algolist.manual.ru/maths/geom/misc/perp.php, а именно неравенства: B2 <= A2 + C2, C2 <= A2 + B2. В общем-то программа работает, но, вероятно, не всегда правильно. Уже достаточно много перепробовал тестовых примером, всё правильно определяет. Но, когда отправляю решение на сервер олимпиады, сервер говорит: "Wrong Answer". Я все грешу на типы. Сможете помочь?


Ответ

Вы не проверяете случай, когда часть отрезка лежит в одной окружности, а часть - в другой. Например, A(10, 10), B(10, 20), M1(10, 10), R1(5), M2(10, 20), R2(5). тут половина отрезка лежит в первой окружности, а половина - во второй. http://ideone.com/TdMCuz Я бы предложил следующий алгоритм. Для каждой окружности проверяем, лежит ли отрезок в ней полностью (т. е. лежат ли оба конца отрезка внутри окружности). Если да, то ответ - "да", выходим. Если оба конца отрезка вне окружности, переходим к следующей окружности. Если один конец внутри, а другой - снаружи, то обезаем отрезок, оставляя только ту его часть, что снаружи, и продолжаем проверки. Если после проверки всех окружностей остался ненулевой участок отрезка, ответ - "нет".

Церковнославянская раскладка в Ubuntu

Необходимо набирать текст на церковнославянском языке. Как мне это сделать?


Ответ

Церковно-славянский в LinuxКак установить церковнославянские шрифтыМетоды реализации церковно-славянского письма в компьютерных системахДля разработчиковЦерковнославянский язык в Линуксе

Android, GridLayout для 2.3 верии системы

Добрый день, подскажите, пожалуйста, вот у меня в интерфейсе используется GridLayout, который поддерживается с API 14, а есть ли способы как-то сделать чтобы GridLayout работал и на 10-11 API? Мне говорили, что что-то нужно до установить, но я не понимаю, что и как. Заранее спасибо за помощь!


Ответ

Вам нужно подключить к проекту support library v7. После этого используйте в коде и XML-layout'ах android.support.v7.widget.GridLayout вместо android.widget.GridLayout

Как определить, нажата ли кнопка

На некоторых наушниках есть одна кнопка, обычно она принимает/завершает звонок и вызывает google поиск. Как можно программно определить, нажата ли кнопка? P.S. Андроид разработка.


Ответ

Не факт, что предложенный ниже способ сработает, но все же следует попробовать. Дело в том, что при подобных событиях система Android не обделяет ни одно приложение от получения сведений об этом и шлет широковещательный интент всем, кто хочет его принять (и сопутствующую информацию). Попробуйте отлавливать широковещательным приемником событие ACTION_MEDIA_BUTTON, которое система посылает при нажатии на одну из медийных кнопок. В экстра-полях полученного интента (намерения) будет в таком случае содержаться код нажатой медиа кнопки. Выясните, какой номер имеет кнопка на наушниках и действуйте далее. Подробнее почитайте в официальных руководствах, ссылка на которые выше.

Начать воспроизведение первого byte[], как только он сформировался

Допустим, байты приходят из какого-то источника (аудио), складываются в одинаковые по размеру byte[], и так в цикле, причем неизвестно, сколько всего байтов придет. Как начать воспроизведение первого byte[], как только он сформировался? По окончании массива подавать ему следующий и так, чтобы не было разрыва в звуке. new MediaPlayer() не принимает byte[]


Ответ

Интересный вопрос.
На ум приходят 3 варианта:
Организовать ContentProvider с кастомным Uri и подать плееру на вход Uri, но что-то подсказывает мне, что в этом случае будет очень больно и долго :) Покопаться в Android NDK, где-то краем уха слышал, что там можно организовать подачу потока в плеер (не уверен). Создать MemoryFile, над которым организовать ParcelFileDescriptor, который и подать на вход плееру. См. пост на стэке

Что нужно сделать с приложением перед добавлением в google play?

У меня уже практически готовая версия приложения (осталось доделать маленькие штрихи), даже зарегистрировался как разработчик, но я не знаю точно, что надо сделать с приложением. Читал как-то статью об этом, но потерял её. Там говорилось,что нужно что-то в эклипсе сделать, потом в ProGuard и т.п. Подскажите, пожалуйста,что нужно сделать по пунктам или дайте ссылку на подробную статью. Заранее благодарю!


Ответ

Сгенерировать сертификат. Если приложение paid, то озаботиться защитой через License Verification Library Подписать сгенерированным сертификатом. ProGuard необязательно. Выставить в Google Play Чеклист, что надо сделать, здесь, и немного устаревшая статья

Как отсортировать массив объектов по их свойствам?

var a = {prop: 3, name: 'a'}, b = {prop: 2, name: 'b'}, c = {prop: 1, name: 'c'};
var array = [ a, b, c ], result = null;
result = array.sort(function(a, b){ var c = a.prop, d = b.prop;
if( c < b ){ return -1; }else if( c > b ){ return 1; }
return 0; });
for(var i in result){ console.log(result[i].name); // a, b, c } Так не работает... Добавлено: А в js так нельзя сортировать?? А какая разница сорту, что двигать местами?


Ответ

У вас две ошибки: Метод sort сортирует массив на месте, т.е. изменяет массив, к которому он применен. Если вы хотите сохранить исходный массив, сделайте копию перед сортировкой: result = array.slice().sort() Вы используете b в сравнениях (c < b) и (c > b), хотя хотели d. Исправленная программа работает как надо.