Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 488
от 07.08.2006, 15:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 348, Экспертов: 45
В номере:Вопросов: 4, Ответов: 8


Вопрос № 50817: Уважаемые эксперты! У меня очень необычный вопрос. Как лучше всего хранить данные об областях с кривыми краями (в двухмерном пространстве) если нужно кроме всего прочего эти области пересекать или удалять одну из другой. Также полезно было бы име...
Вопрос № 50850: Здравствуйте, эксперты! Есть строка (массив сhar) приблизительно следующего содержания: char string[] = "Line_1 Line_2 Line_3 Line_4"; Каким образом можно текст между (т.е. Line_1, Line_2, и т.д.) поместить построчно в TListBo...
Вопрос № 50865: Уважаемые эксперты! У меня есть следующая задача: Есть некоторое количество (ок. 1000-5000) массивов, в каждом ок. 1000 элементов. Элементы массива - некоторые объекты, имеющие X,Y,Z-координаты; в элементах можно заводить дополнительные поля. Необход...
Вопрос № 50871: Добрый день подскажите пожалуйста, где мне можно взять хорошие книги по программированию на С/С++ для начинающих желательно с уроками, а то облазил пол нета скачалал штук 10 книг по С но все они расчитаны на то что человек уже знает язык С. А я к про...

Вопрос № 50.817
Уважаемые эксперты!
У меня очень необычный вопрос. Как лучше всего хранить данные об областях с кривыми краями (в двухмерном пространстве) если нужно кроме всего прочего эти области пересекать или удалять одну из другой. Также полезно было бы иметь возможность проверить, находится ли точка в какой-либо области. Вообще это нужно для многооконной системы (Ненавижу Windows :-)). Если кто знает, подскажите плз.
Отправлен: 01.08.2006, 19:39
Вопрос задал: C4tnt (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: EPDSota
Здравствуйте, C4tnt!

Тут 2 варианта:
1. ЕСли края "не очень кривые" то можно просто хранить их в виде массива линий (прямых, частей окружностей или эллипсов). Принадлежность точки окну придется вычислять...
2. Хранить в виде картинки с использованием фонового-прозрачного цвета. Проверка принадлежности точки окна другому, просто сравнением точки окна с фоновым цветом.
---------
Открыть глаза навстречу солнцу
Ответ отправил: EPDSota (статус: Специалист)
Ответ отправлен: 02.08.2006, 08:39
Оценка за ответ: 5

Отвечает: Sergijj
Здравствуйте, C4tnt!

Я бы предложил такой вариант: сделал бы битовую карту (грубо говоря - одномерный массив битов, где нужный бит вычисляется по формуле: банк_бита = (Y_пикселя_относительно_объекта * ширину_объекта + X_пикселя_относительно_объекта) / размерность_банка; смещение_бита_в_банке = <то_же_самое_но> % размерность_банка) принадлежности пикселя непрозрачному (фоновому) цвету с размером прямоугольной области, необходимой для полного покрытия соответствующего образа. При выводе пикселя - сравнивать его по "И" с соответствующим битом и если результат НЕ нуль - выводить его.
Это бы мне дало:
1. Образы с формой _любой_ сложности (в т.ч. и с "дырками" посередине и с совершенно умопомрачительной конфигурацией краёв)
2. Лёгкость объединения образов, вычитания одного из другого и проверку на принадлежность пикселя одному или нескольким образам (для этого будет достаточно просто пройтись по битмапу и сделать соответствующую операцию ("И", "ИЛИ" или "Исключающее_ИЛИ") над соответствующими битами).

Всё вышесказанное относится к образам типа "лассо" (совершенно непрямоугольная область памяти).

Если же брать именно _оконный_ интерфейс, то я бы посоветовал сделать так:
Хранить в памяти эталонный образ экрана (т.е. то, что сейчас _должно_быть_на_чистом_экране_ (без нарисованных окон)) и при "наезжании окошек" друг на друга, брать пиксели именно из этого образа.
Это мне бы дало:
1. Отсутствие дублирования информации "под_окном" в памяти.
2. Отсутствие необходимости при изменении одного окна обрабатывать образы всех других окон (на предмет изменения фоновой информации).
3. Возможность изменять фон по своему усмотрению (например при динамическом фоне и полупрозрачных окошках).

Для скорости обработки множества окон можно, опять же, применить механизм битовых карт (см.выше).

Рад, если помог.
При реализации можете вставить комментарий об источнике идеи...:)

Удачи!
---------
Стучитесь! И Вас откопают...
Ответ отправил: Sergijj (статус: 4-ый класс)
Ответ отправлен: 02.08.2006, 09:39
Оценка за ответ: 5


Вопрос № 50.850
Здравствуйте, эксперты! Есть строка (массив сhar) приблизительно следующего содержания:
char string[] = "Line_1 Line_2 Line_3 Line_4";
Каким образом можно текст между (т.е. Line_1, Line_2, и т.д.) поместить построчно в TListBox в C++ Builder'е? Т.е. нужно разбить строку на массив подстрок с разделителем Знаю, что в PHP и в JavaScript есть такая функция, а это си-подобные языки. Может и в C++ такая функция тоже есть? Заранее спасибо за помощь!
Отправлен: 02.08.2006, 01:46
Вопрос задал: Васильков Вадим (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Santana
Здравствуйте, Васильков Вадим!
Мне кажется Вам поможет функция strtok

пример
char string[] = "Line_1 Line_2 Line_3 Line_4", *p;
p = strtok(string, " ");

ну а дальше

p = strtok(NULL, " ");
Ответ отправил: Santana (статус: 4-ый класс)
Ответ отправлен: 02.08.2006, 10:27

Отвечает: AndyC
Здравствуйте, Васильков Вадим!

Если не изобретать велосипед, то примерно так:
#include <string>
#include <vector>

#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>

using namespace boost;

{
std::string str("Line_1 Line_2 Line_3 Line_4");

std::vector<std::string> rezult;//Вектор строк порезанных
boost::split(rezult, str, boost::is_any_of(""));
}

Или там же см. tokenizer.

Если изобретать:

AnsiString str("Line_1 Line_2 Line_3 Line_4");

int e;
while(1)
{
e=str.Pos(" ");//Ищем
if(!e && !str.Length()) \Если не нашли и есть остаток, добавить его
{
ListBox1->AddItem(str,NULL);
break;
}
ListBox1->AddItem(str.SubString(0,e-1),NULL); //Добавляем кусок до разделителя
str=str.SubString(e+1,str.Length()); //Вырезаем кусок + разделитель
}
Ответ отправил: AndyC (статус: 1-ый класс)
Ответ отправлен: 02.08.2006, 18:21


Вопрос № 50.865
Уважаемые эксперты! У меня есть следующая задача: Есть некоторое количество (ок. 1000-5000) массивов, в каждом ок. 1000 элементов. Элементы массива - некоторые объекты, имеющие X,Y,Z-координаты; в элементах можно заводить дополнительные поля. Необходимо для каждого объекта-точки идентифицировать все объекты-точки из всех массивов, которые находятся от нее на расстоянии не более заданного. Вопрос в том, как сделать это максимально быстро, желательно библиотечными алгоритмами. И совсем желательно, если это будет компилироваться под MS VC6.0. Обычные STL-ные алгоритмы сортировки и поиска кажутся слишком медленными; может быть, есть что-то более специализированное. Буду признателен за любые наводки. Спасибо.
Отправлен: 02.08.2006, 07:53
Вопрос задал: Бутин Олег Владимирович (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Шинтяков Дмитрий Васильевич / Ratson
Ой, сильно сомневаюсь, что есть стандартные библиотеки для решения такой задачи...
Разве что какие-нибудь специализированные библиотеки математического моделирования, но мне видеть не приходилось.

Для ускорения, ИМХО, имеет смысл поступиь так: разбить пространство на блоки (проще всего кубы), которые полностью помещаются в сферу заданного радиуса. После чего определить, какая точка в каком блоке находится (Причём, если точки будут перемещаться, можно воспользоваться тем, что они будут перемещаться в один из соседних блоков).

Затем, для решения исходной задачи (определения точек на расстоянии не больше заданного) можно выбирать точки только из нескольких блоков (а не перебирать все).

Но это всё непросто ^_^

Я читал про какой-то вариант подобного алгоритма, использовавшегося для можелирования галактик (тоже масса точек-звёзд), там размер блоков менялся в звисимости от плотности, это позволяло ещё эффективнее решать задачу... Но готовы решения у меня нет, ещё раз повторю.
Ответ отправил: Шинтяков Дмитрий Васильевич / Ratson (статус: 1-ый класс)
Ответ отправлен: 02.08.2006, 19:24
Оценка за ответ: 5
Комментарий оценки:
Спасибо! См. также мой комментарий


Вопрос № 50.871
Добрый день подскажите пожалуйста, где мне можно взять хорошие книги по программированию на С/С++ для начинающих желательно с уроками, а то облазил пол нета скачалал штук 10 книг по С но все они расчитаны на то что человек уже знает язык С. А я к программированию ни какого отношения не имел до 29.07.2006.
Я захотел научиться программированнию.
И еще нашел урок в нем есть программа на С и она не работает. может я что делаю не так.
Писил в C++Builder 6.
Зарание спасибо.

Приложение:

Отправлен: 02.08.2006, 09:32
Вопрос задал: Dh05 (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: D3rp
Здравствуйте, Dh05!
В электронном виде не знаю, а в бумажном Г.Шилд "Полный справочник по С++. Четвертое издание." В приложении правильная версия вашей программы для MS Visual C++.

Приложение:

Ответ отправил: D3rp (статус: 4-ый класс)
Ответ отправлен: 02.08.2006, 09:49

Отвечает: AndyC
Здравствуйте, Dh05!

Отлично работает. Дефект только в "... клавишу %с ",ch);

Ошибка из-за неправильных параметров сборки.
Не ругается на отсутствие файла stdio.h?

Как создаёте проект?
Ответ отправил: AndyC (статус: 1-ый класс)
Ответ отправлен: 02.08.2006, 18:33

Отвечает: Иванов Игорь Михайлович
Здравствуйте, Dh05!во первых вы не определили main()это встроеная функция,она бывает либо int main()
{
операторы.....

return 0;
}
в этом случае вы должны возвратить функции нулевое значение, или же
void main(void)
{
операторы.....
}
здесь ничего возвращать не надо так как тип функции void ничего не возваращяет .
А вообще для учебы програмирования вам следует приобрести например С++ BuilderX - этот выпуск поддерживает как С++ старого типа так и VisualC++, или же Microsoft DEVstudio,
а насчет литературы,зайдите в библиотеку rusfaq там вы найдете RARфайлы по С++ для начинающих не имеющих опыта.А что касается Borland C++ Builder 6 то эта версия расчитана на быструю разработку програм там все уже почти готово функции,операторы,и т д. одним словом RAD-версия,для новичков трудно но когда вы приобретете опыт то использовать эту версию просто одно удовольствие.УДАЧИ!!
Ответ отправил: Иванов Игорь Михайлович (статус: 1-ый класс)
Ответ отправлен: 02.08.2006, 18:40


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.35 от 27.07.2006
Яндекс Rambler's Top100

В избранное