"Все сообщения пользователя DMT"


Страницы: 1 2
Вопрос о генерации картинки
Пользователь: DMT
Сообщений: 123
Статус: Программист
Зарегистрирован:
18 октября 2007, 2:35
Был:13 ноября 2017, 4:54
DMT
smsup
Дата: 3 января 2008, 20:43 Сообщение №
Мне был очень интересен данных вопрос и я написал программу генерации подобных изображений - IEMakePictureSelInv. Вы можете найти её по адресу: http://dmtsoft.ru/cgi-bin/showcnt.php?unicname=program_iemakepictureselinv&osnt=oneaticleshablon sm sm sm
Пользователь: DMT
Сообщений: 123
Статус: Программист
Зарегистрирован:
18 октября 2007, 2:35
Был:13 ноября 2017, 4:54
DMT
smsup
Дата: 30 декабря 2007, 14:08 Сообщение №
Как нарисовать такую картинку???
Если кто не знает - Выделите её в IE и увидите абсолютно другую картину!!!


image1


Могу предположить, что при выделении картины происходит инвертирование цветов точек, т.е. более светлые точки становятся тёмными. Соответственно картина рисуется путём наложения одной картины на другую через точку - в шахмотном порядке.
Может быть у кого нибудь есть исходник, который делает подобное с любыми двумя картинками???

Пользователь: DMT
Сообщений: 123
Статус: Программист
Зарегистрирован:
18 октября 2007, 2:35
Был:13 ноября 2017, 4:54
DMT
smsup
Дата: 29 июня 2008, 15:55 Сообщение №
Пример для двухмерного массива:
Код на C++
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void main(){
  4. int n=10,n1=10,i;
  5. int **m=new int *[n];
  6. for(i=0;i<n;i++){
  7. m[i]=new int[n1];
  8. for (int j=0;j<n1;j++) m[i][j]=1;
  9. }
  10. for(i=0;i<n;i++){
  11. for (int j=0;j<n1;j++) printf(" %d",m[i][j]);
  12. printf("\n");
  13. }
  14. }
  15.  
При использовании обязательна ссылка на http://DMTSoft.ru

Пользователь: DMT
Сообщений: 123
Статус: Программист
Зарегистрирован:
18 октября 2007, 2:35
Был:13 ноября 2017, 4:54
DMT
smsup
Дата: 11 сентября 2008, 23:57 Сообщение №
Да кстате открываешь винт и ищеш имя нужного файла в MFT, переходишь на первый кластер и далее проходишь по цепочки.

В данном случае этот фрагмент не пойдёт!!! Т.к напрямую к файлу обратиться мы не можем.

DeviceIoControl нужен идентификатор файла!! Может получица каким нибуть образом его открыть, для получения идентификатора. Если это выйдет, то найдём начальный VCN экстента.

Код на C++
  1. void GetFileClusters(
  2. PCHAR lpFileName, //имя файла
  3. ULONG ClusterSize //размер кластера на диске
  4. )
  5. {
  6. HANDLE hFile; //хэндл нерезидентного файла
  7. ULONG OutSize; //размер буфера OutBuf
  8. ULONG FileSize; //размер файла
  9. ULONG Bytes, //количество байт. возвращаемых eviceIoControl
  10. ClCount, //количество кластеров в файле
  11. r, //счетчики
  12. CnCount; //количество кластеров в файле
  13. LARGE_INTEGER PrevVCN, Lcn;
  14. STARTING_VCN_INPUT_BUFFER InBuf; //номер начального виртуального кластера
  15. PRETRIEVAL_POINTERS_BUFFER OutBuf;
  16. //буфер структуры, описывающей размещение файла на диске
  17. hFile = CreateFile(lpFileName, FILE_READ_ATTRIBUTES,
  18. FILE_SHARE_READ,
  19. NULL, OPEN_EXISTING, 0, 0); //открываем нерезидентный файл
  20. if (hFile != INVALID_HANDLE_VALUE)
  21. {
  22. FileSize = GetFileSize(hFile, NULL); //определяем размер файла
  23. //определяем размер буфера OutBuf
  24. OutSize = sizeof(RETRIEVAL_POINTERS_BUFFER)
  25. + (FileSize / ClusterSize)*
  26. sizeof(OutBuf->Extents);
  27. //выделяем память для структуры
  28. OutBuf = (PRETRIEVAL_POINTERS_BUFFER)malloc(OutSize);
  29. InBuf.StartingVcn.QuadPart = 0; //номер VCN начального экстента файла
  30. //заполняем структуру, описывающую размещение файла
  31. if (DeviceIoControl(hFile,
  32. FSCTL_GET_RETRIEVAL_POINTERS,
  33. &InBuf,sizeof(InBuf), OutBuf,
  34. OutSize, &Bytes, NULL))
  35. {
  36. //количество кластеров в файле
  37. ClCount = (FileSize + ClusterSize - 1) / ClusterSize;
  38. PrevVCN = OutBuf->StartingVcn; //начальный VCN экстента (равен 0)
  39. //цикл перемещения по экстентам файла
  40. for (r = 0; r < OutBuf->ExtentCount; r++)
  41. {
  42. Lcn = OutBuf->Extents[r].Lcn; //LCN кластера начала экстента
  43. //количество кластеров в текущем экстенте:
  44. for(CnCount=OutBuf->Extents[r].NextVcn.QuadPart-PrevVCN.QuadPart;
  45. //печатаем номер кластера
  46. CnCount; CnCount--, Lcn.QuadPart++) printf("%I64x ",Lcn.QuadPart);
  47. //переходим к следующему экстенту
  48. PrevVCN = OutBuf->Extents[r].NextVcn;
  49. }
  50. }
  51. free(OutBuf);
  52. CloseHandle(hFile);
  53. }
  54. }
  55.  
При использовании обязательна ссылка на http://DMTSoft.ru


Можно конечно и просканить всё дерево, предварительно конечно расшифровать структуру файловой системы.

Просканить напрямую можно примерно так:
Код на Pascal
  1. var
  2. hFile:LongWord;
  3. i,c,r:integer;
  4. buff:parraybyte;
  5. bytesread:LongWord;
  6. f:file;
  7. begin
  8. //GetMem(bytesread,sizeof(LongWord));
  9. hFile:=CreateFile(drive_name,GENERIC_READ,FILE_SHARE_READ
  10. or FILE_SHARE_WRITE, nil,OPEN_EXISTING,0,0);
  11. if(hFile=INVALID_HANDLE_VALUE) then begin
  12. MessageBox(0,'Открыть устройство НЕ удалось',nil,
  13. MB_OK or MB_ICONSTOP);
  14. exit;
  15. end;
  16. GetMem(buff,512);
  17. //ReadFile(hFile,buff,numberofsectors*512,bytesread, nil);
  18. AssignFile(f,FileName);
  19. rewrite(f,1);
  20. for i:=0 to numberofsectors-1 do begin
  21. SetFilePointer(hFile, 512*sector+512*i, nil, FILE_BEGIN);
  22. if( not ReadFile(hFile,buff^,512,bytesread, nil)) then begin
  23. freeMem(buff,512);
  24. MessageBox(0,'Чтение данных НЕ удалось', nil,
  25. MB_OK or MB_ICONSTOP);
  26. exit;
  27. end;
  28. BlockWrite(f,buff^,512);
  29. end;
  30. closefile(f);
  31. CloseHandle(hFile);
  32. FreeMem(buff,512);
  33.  
При использовании обязательна ссылка на http://DMTSoft.ru

Пользователь: DMT
Сообщений: 123
Статус: Программист
Зарегистрирован:
18 октября 2007, 2:35
Был:13 ноября 2017, 4:54
DMT
smsup
Дата: 1 октября 2008, 22:33 Сообщение №
Обычное выделение места под матрицу определённого размера:
Код на C++
  1. int matrix[10][10];
  2.  
При использовании обязательна ссылка на http://DMTSoft.ru


Динамическое выделения места под матрицу
Код на C++
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void main(){
  4. int n=10,n1=10,i;
  5. int **m=new int *[n];
  6. //заполнение Матрицы единицами
  7. for(i=0;i<n;i++){
  8. m[i]=new int[n1];
  9. for (int j=0;j<n1;j++) m[i][j]=1;
  10. }
  11. //печать Матрицы
  12. for(i=0;i<n;i++){
  13. for (int j=0;j<n1;j++) printf(" %d",m[i][j]);
  14. printf("\n");
  15. }
  16. }
  17.  
При использовании обязательна ссылка на http://DMTSoft.ru

Пользователь: DMT
Сообщений: 123
Статус: Программист
Зарегистрирован:
18 октября 2007, 2:35
Был:13 ноября 2017, 4:54
DMT
smsup
Дата: 18 декабря 2008, 20:21 Сообщение №
На bildere для UG ничего не писал :((
Пишите на VS 2003-5 могу помоч

Пользователь: DMT
Сообщений: 123
Статус: Программист
Зарегистрирован:
18 октября 2007, 2:35
Был:13 ноября 2017, 4:54
DMT
smsup
Дата: 19 декабря 2008, 19:06 Сообщение №
На чём Вы пишите или в какой среде??
Пользователь: DMT
Сообщений: 123
Статус: Программист
Зарегистрирован:
18 октября 2007, 2:35
Был:13 ноября 2017, 4:54
DMT
smsup
Дата: 24 декабря 2008, 22:40 Сообщение №
Для консоли можно пробелов понаставить или перенести курсор на нужную позицию. Для текстовых полей в винде есть специальные сообщения к элементу.

Пользователь: DMT
Сообщений: 123
Статус: Программист
Зарегистрирован:
18 октября 2007, 2:35
Был:13 ноября 2017, 4:54
DMT
smsup
Дата: 19 декабря 2008, 10:31 Сообщение №
Ну дак Вы строку не печатаете!!!
перед return 0; напишите:
sprintf("%s",str);

Попробуйте так, щас точно проверить не могу, но должно что нить вывести:
#include <string.h>
#include <stdio.h>
int main()
{
char str[10] = "abcdef";
int slen = strlen(str);
for(int i=0;i<slen/2;i++)
{
str[i] = str[i] + str[slen-i-1];
str[slen-i-1] = str[i] - str[slen-i-1];
str[i] = str[i] - str[slen-i-1];
}
sprintf("%s",str);
return 0;
}

Пользователь: DMT
Сообщений: 123
Статус: Программист
Зарегистрирован:
18 октября 2007, 2:35
Был:13 ноября 2017, 4:54
DMT
smsup
Дата: 15 января 2009, 20:37 Сообщение №
Код на C++
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #define EPS 0.001
  5. #define N 1000
  6. int n; // число точек всего
  7. double x[N][2]; // массив с координатами точек
  8. /*
  9. текущий центр координат (для вычисления вектороного произведения в функции cmp)
  10. */
  11. double *xt;
  12. double xtstatic[2];
  13. /*
  14. Находит знак векторного произведения векторов, проведеденных из
  15. точки xt в точки a и b
  16. */
  17. int
  18. cmp (const void *a, const void *b)
  19. {
  20. double *p1, *p2;
  21. double s;
  22. p1 = (double *) a;
  23. p2 = (double *) b;
  24. s = (p1[0] - xt[0]) * (p2[1] - xt[1]) - (p2[0] - xt[0]) * (p1[1] - xt[1]);
  25. if (fabs (s) < EPS)
  26. {
  27. s =
  28. (p1[0] - xt[0]) * (p1[0] - xt[0]) + (p1[1] - xt[1]) * (p1[1] - xt[1]);
  29. s -=
  30. (p2[0] - xt[0]) * (p2[0] - xt[0]) + (p2[1] - xt[1]) * (p2[1] - xt[1]);
  31. if (fabs (s) < EPS)
  32. return 0;
  33. if (s < 0)
  34. return 1;
  35. return -1;
  36. };
  37. if (s < 0)
  38. return 1;
  39. return -1;
  40. }
  41. /*
  42. Для точек из глобального массива x находит выпуклую оболочку и кладёт
  43. индексы точек выпуклой оболочки в массив stack
  44. */
  45. int
  46. convexhull (int *stack)
  47. {
  48. int i,i_ymin; // индек точки с минимальной координатой y
  49. int sp; // индекс последнего элемента в стеке; в конце
  50. // — число точек в выпуклой оболочке
  51. i_ymin=0;
  52. for (i = 0; i < n; i++){
  53. if (x[i][1] < x[i_ymin][1]) i_ymin = i;
  54. }
  55. xt = xtstatic;
  56. xt[0] = x[i_ymin][0];
  57. xt[1] = x[i_ymin][1];
  58. x[i_ymin][0] = x[0][0];
  59. x[i_ymin][1] = x[0][1];
  60. x[0][0] = xt[0];
  61. x[0][1] = xt[1];
  62. qsort (&x[1], n, 2 * sizeof (double), cmp);
  63. stack[0] = 0;
  64. stack[1] = 1;
  65. stack[2] = 2;
  66. sp = 2;
  67. i = 2;
  68. while (i < n + 1)
  69. {
  70. xt = x[stack[sp - 1]];
  71. if (cmp (&x[stack[sp]][0], &x[(i + 1) % n][0]) < 0)
  72. {
  73. stack[++sp] = (++i) % n;
  74. } else {
  75. sp--;
  76. }
  77. }
  78. return sp;
  79. }
  80. int
  81. main ()
  82. {
  83. int stack[N*2];
  84. scanf ("%d", &n);
  85. for (int i = 0; i < n; i++) scanf ("%lf %lf", &x[i][0], &x[i][1]);
  86. int length = convexhull (stack);
  87. for (int i = 0; i < length; i++) printf ("%f %f\n", x[stack[i]][0], x[stack[i]][1]);
  88. return 0;
  89. }
  90.  
При использовании обязательна ссылка на http://DMTSoft.ru
Пользователь: DMT
Сообщений: 123
Статус: Программист
Зарегистрирован:
18 октября 2007, 2:35
Был:13 ноября 2017, 4:54
DMT
smsup
Дата: 15 января 2009, 20:51 Сообщение №
Вот этот исходник вполне корректно работает!

Пользователь: DMT
Сообщений: 123
Статус: Программист
Зарегистрирован:
18 октября 2007, 2:35
Был:13 ноября 2017, 4:54
DMT
smsup
Дата: 27 января 2011, 17:26 Сообщение №
Создавать для каждого слоя свой Bitmap
Для получения одного рисунка объединить все в зависимости от позиции рисунка на общей канве с помощью:
Bitmap.Canvas.CopyRect в режиме
Bitmap.Canvas.CopyMode=SRCAND;
Где
SRCAND = $008800C6;

Это по крайней мере на delphi так.

на си++
Код на C++
  1. BitBlt(handle, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND);
  2.  
При использовании обязательна ссылка на http://DMTSoft.ru



Так создавать битмапы:
Код на C++
  1. CBitmap b; //пока не имеет размеров
  2. Bitmap имеет смысл создавать такой же, как область экрана, т.е. bitmap должен быть совместим с данным экраном, точнее с данным типом отображения.
  3. b.CreateCompatibleBitmap( pDC, //указатель на CDC
  4. w, //ширина
  5. h ) ; //высота
  6. Не существует битовых образов для обычных контекстов отображения (pDC - обычный контекст).
  7. CBitmap b ;
  8. CClientDC dc ( this ) ;
  9. b.CreateCompatibleBitmap ( &dc, 1024, 768 ) ;
  10. Для того, чтобы рисовать на bitmap, нужно завести специальный контекст, называемый контекстом памяти, и выбрать этот bitmap в контекст памяти.
  11. CDC memDC ; //оболочка MFC над объектом Windows.
  12. //Сам объект создается по Create.
  13. memDC.CreateCompatibleDC(&dc);
  14. //Выберем bitmap в контекст
  15. memDC.SelectObject( &b ) ;
  16. //Теперь можно рисовать на bitmap. Хотя сейчас bitmap заполнен чем
  17. //попало, поэтому если вы не будете заполнять полностью часть bitmap,
  18. //выводимую на экран, то сначала bitmap нужно очистить, например
  19. //с помощью FillRect.
  20. memDC.Rectangle ( 10, 10, 100, 100 ) ;
  21.  
При использовании обязательна ссылка на http://DMTSoft.ru


Пользователь: DMT
Сообщений: 123
Статус: Программист
Зарегистрирован:
18 октября 2007, 2:35
Был:13 ноября 2017, 4:54
DMT
smsup
Дата: 31 января 2011, 16:16 Сообщение №
Программа работает, только необходимо зайти в "Кабинет HandWriter". Тут Вы сможете создать свой шрифт, либо выбрать существующий и перевести печатный текст в рукописный.

Пользователь: DMT
Сообщений: 123
Статус: Программист
Зарегистрирован:
18 октября 2007, 2:35
Был:13 ноября 2017, 4:54
DMT
smsup
Дата: 31 января 2011, 16:19 Сообщение №
Ничего присылать ненадо! Достаточно зайти в "Кабинет HandWriter" -> Шрифт.
Выбрать шрифт "Шрифты HW:" и нажать использовать!
Далее перейти на вкладку редактор и попробовать преобразовать текст.

Пользователь: DMT
Сообщений: 123
Статус: Программист
Зарегистрирован:
18 октября 2007, 2:35
Был:13 ноября 2017, 4:54
DMT
smsup
Дата: 31 января 2012, 20:58 Сообщение №
Есть возможность только сохранения всех страниц - а дальше уже можно пользоваться специальными средствами для распечатки. В ОС Windows такие так-же имеются.

Страницы: 1 2