Ада Лавлейс - первый программист в истории человечества. Этот факт меня всегда восхищал 🔥
С праздником, милые дамы! 🌹🌹🌹
5 гениальных женщин-программистов и их вклад в развитие IT
До 1984 года женщин-программистов было больше, чем мужчин: 6 удивительных фактов о женщинах в IT
С праздником, милые дамы! 🌹🌹🌹
5 гениальных женщин-программистов и их вклад в развитие IT
До 1984 года женщин-программистов было больше, чем мужчин: 6 удивительных фактов о женщинах в IT
🔥7
Получение повёрнутого TBitmap средствами Windows GDI
История такая. Спросили, нет ли у меня готового исходника для поворота картинки. А у меня есть куча всего понаписанного, но не опубликованного. То времени нет, то азарт кончился. Поэтому, вот модуль, который получает повёрнутый битмап двумя способами. Вдруг пригодится ещё кому-нибудь. Без экзотики, чистый Win GDI:
1) Аффинные преобразования поворота
2) Использование API функции PlgBlt.
utlRotatePicGDI.zip
История такая. Спросили, нет ли у меня готового исходника для поворота картинки. А у меня есть куча всего понаписанного, но не опубликованного. То времени нет, то азарт кончился. Поэтому, вот модуль, который получает повёрнутый битмап двумя способами. Вдруг пригодится ещё кому-нибудь. Без экзотики, чистый Win GDI:
1) Аффинные преобразования поворота
2) Использование API функции PlgBlt.
utlRotatePicGDI.zip
🔥12👍1
Дожили... Теперь 22 апреля - День Старого Программиста.
Старого, Карл! Раньше степень древности не обозначали.
Всех программистов сердечно поздравляю 🍾🤟🥳
А особенно выпускников специальности 2204.
День старого программиста — неофициальный профессиональный праздник, который отмечается ежегодно 22 апреля. Он возник среди советских и российских программистов, обучавшихся по специальности с кодом 2204 — «Программное обеспечение вычислительной техники и автоматизированных систем». Число 2204 символически интерпретируется как 22.04, то есть 22 апреля.
https://dzen.ru/a/aAeTmz3O9Q32Qz9W
Старого, Карл! Раньше степень древности не обозначали.
Всех программистов сердечно поздравляю 🍾🤟🥳
А особенно выпускников специальности 2204.
День старого программиста — неофициальный профессиональный праздник, который отмечается ежегодно 22 апреля. Он возник среди советских и российских программистов, обучавшихся по специальности с кодом 2204 — «Программное обеспечение вычислительной техники и автоматизированных систем». Число 2204 символически интерпретируется как 22.04, то есть 22 апреля.
https://dzen.ru/a/aAeTmz3O9Q32Qz9W
👍7🔥5
Подключаем DeepSeek к Delphi
Купить API Key проблематично, в списке возможных помощников Delphi этой нейронки нет, а попробовать хочется. Поэтому:
1. Надо закачать себе DeepSeek. Инструкция. Ничего не смотрим, сразу листаем на пункт "5. Продвинутый способ: скачать Дипсик на компьютер".
2. По ссылке в этом пункте качаем и ставим LM Studio. Запускаем, идём в обзор моделей и выбираем DeepSeek Coder V2 Lite (10.4 Gb 😱) и качаем. Это необязательно, можно и на базовой, но он хотя бы про Delphi знает.
3. Из tray-меню студии запускаем сервер.
4. В Delphi опциях выбираем настройки Smart CodeInsight, включаем его, выбираем ChatGPT, указываем BaseURL=http://127.0.0.1:1234/V1 и Api key = not-needed. Из списка моделей выбираем deepseek-coder-v2-lite-instruct. Остальное на свой вкус.
Помощник так себе, но, думаю, найдутся желающие поэкспериментировать.
Купить API Key проблематично, в списке возможных помощников Delphi этой нейронки нет, а попробовать хочется. Поэтому:
1. Надо закачать себе DeepSeek. Инструкция. Ничего не смотрим, сразу листаем на пункт "5. Продвинутый способ: скачать Дипсик на компьютер".
2. По ссылке в этом пункте качаем и ставим LM Studio. Запускаем, идём в обзор моделей и выбираем DeepSeek Coder V2 Lite (10.4 Gb 😱) и качаем. Это необязательно, можно и на базовой, но он хотя бы про Delphi знает.
3. Из tray-меню студии запускаем сервер.
4. В Delphi опциях выбираем настройки Smart CodeInsight, включаем его, выбираем ChatGPT, указываем BaseURL=http://127.0.0.1:1234/V1 и Api key = not-needed. Из списка моделей выбираем deepseek-coder-v2-lite-instruct. Остальное на свой вкус.
Помощник так себе, но, думаю, найдутся желающие поэкспериментировать.
🔥5👍2🤔2
This media is not supported in your browser
VIEW IN TELEGRAM
Пересечение отрезков в 2D и 3D
Небольшая статья про нахождение пересечений отрезков в 2D и 3D. Теоретическая часть начинается с векторов и внезапно уходит в метод Крамера. Для любителей острых сюжетных поворотов.
Исходники, как обычно, в комплекте.
Читать статью...
Небольшая статья про нахождение пересечений отрезков в 2D и 3D. Теоретическая часть начинается с векторов и внезапно уходит в метод Крамера. Для любителей острых сюжетных поворотов.
Исходники, как обычно, в комплекте.
Читать статью...
👍7🔥6
Вычислить расстояние от точки P до отрезка AB
Также возвращает точку на отрезке. Максимально откомментировал каждое действие. Надеюсь, пригодится
#geom_code
Также возвращает точку на отрезке. Максимально откомментировал каждое действие. Надеюсь, пригодится
function DistanceToSegment(
const P, A, B: TPointF;
out R: TPointF): Single;
var
AB, AP: TPointF;
DotProduct, Len, t: Single;
begin
// Вектор AB
AB := B-A;
// Квадрат длины отрезка AB
Len := AB.X*AB.X+AB.Y*AB.Y;
// Если отрезок вырожден (A и B совпадают)
if IsZero(Len, 1e-6) then
// То возвращаем расстояние от P до A
exit((A-P).Length);
// Вектор AP
AP := P-A;
// Вычисляем скалярное произведение
// векторов AB и AP
DotProduct := AB.DotProduct(AP);
// Вычисляем параметр t
// (нормализованная проекция)
t := DotProduct/Len;
// Ограничиваем t в пределах [0, 1]
t := EnsureRange(t, 0, 1);
// Находим ближайшую точку на отрезке
R := A + t*AB;
// Возвращаем расстояние между
// точкой P и проекцией
Result := (P-R).Length;
end;
#geom_code
🔥11
Как сделать чёрным системное меню элемента Windows
История такая. Однажды, в нашей группе прозвучала невозможность сменить цвет системного контекстного меню. Даже стилем. Но ведь это неправда, ИИ ошибается, и я рванулся было делать, как делал это когда-то давно. Но, учитывая, что с той поры приобрёл некоторый опыт, могу предложить другое решение. Собственно, статья про то, как отрисовать любое контекстное меню цветами вашей фантазии без особых знаний WinApi. И речь не идёт о подмене своими PopupMenu, работаем с тем, что есть.
Читать статью...
История такая. Однажды, в нашей группе прозвучала невозможность сменить цвет системного контекстного меню. Даже стилем. Но ведь это неправда, ИИ ошибается, и я рванулся было делать, как делал это когда-то давно. Но, учитывая, что с той поры приобрёл некоторый опыт, могу предложить другое решение. Собственно, статья про то, как отрисовать любое контекстное меню цветами вашей фантазии без особых знаний WinApi. И речь не идёт о подмене своими PopupMenu, работаем с тем, что есть.
Читать статью...
🔥8👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Кубический Сплайн Эрмита
Ещё один способ построить гладкую кривую, проходящую через все заданные точки ломаной.
Ни разу не сталкивался, решил посмотреть, что за зверь. Заодно подразобраться со сплайнами вообще. Поэтому теоретическая часть достаточно большая. В силу этого, про самого Эрмита ни слова, только про его сплайны.
Внутри исходники, как обычно. Плюс к этому: интерактивное построение сплайна (давно хотел вспомнить JS).
Читать статью...
Ещё один способ построить гладкую кривую, проходящую через все заданные точки ломаной.
Ни разу не сталкивался, решил посмотреть, что за зверь. Заодно подразобраться со сплайнами вообще. Поэтому теоретическая часть достаточно большая. В силу этого, про самого Эрмита ни слова, только про его сплайны.
Внутри исходники, как обычно. Плюс к этому: интерактивное построение сплайна (давно хотел вспомнить JS).
Читать статью...
🔥10
Д. Роджерс, Дж. Адамс
Математические основы машинной графики
Неожиданный фидбэк. Увидели, какого качества у меня представлена эта книга в статье про кубический сплайн Эрмита и прислали вот...
Очень много математики, но зато очень подробно разжёвываются про всё, что только можно. Затронуты как двумерные, так и трёхмерные преобразования. Плоскости, кривые, проекции, и т.д. и т.п.
Сейчас пробую на вкус B-Spline. Там про это почти 100 страниц, ух...
Скачать (.djvu) 7.23 Мб
Книга большая, аккуратно!
Математические основы машинной графики
Неожиданный фидбэк. Увидели, какого качества у меня представлена эта книга в статье про кубический сплайн Эрмита и прислали вот...
Очень много математики, но зато очень подробно разжёвываются про всё, что только можно. Затронуты как двумерные, так и трёхмерные преобразования. Плоскости, кривые, проекции, и т.д. и т.п.
Сейчас пробую на вкус B-Spline. Там про это почти 100 страниц, ух...
Скачать (.djvu) 7.23 Мб
Книга большая, аккуратно!
👍3🔥3
Вычислить Z-координату точки P в 3D-треугольнике ABC по X,Y. Если попадает мимо треугольника, вернёт DefaultZ:
#geom_code
function GetZInTriangle(const P: TPointF;
const A, B, C: TPoint3D;
DefaultZ: Single = -1000): Single;
const Eps = 1e-10;
var d, u, v, w: Double;
begin
// Вычисляем знаменатель для
// барицентрических координат
d := (B.Y-C.Y)*(A.X-C.X) +
(C.X-B.X)*(A.Y-C.Y);
// Проверка на вырожденный треугольник
if IsZero(d, Eps) then
Exit(DefaultZ);
// Вычисляем барицентрическую координату u
u := ((B.Y-C.Y)*(P.X-C.X) +
(C.X-B.X)*(P.Y-C.Y))/d;
// Вычисляем барицентрическую координату v
v := ((C.Y-A.Y)*(P.X-C.X) +
(A.X-C.X)*(P.Y-C.Y))/d;
// Вычисляем третью координату w
w := 1 - u - v;
// Проверка, находится ли точка
// внутри треугольника
if (u >= -Eps) and (v >= -Eps) and
(w >= -Eps) then
// Интерполяция Z-координаты
Result := u*A.Z + v*B.Z + w*C.Z
else
Result := DefaultZ;
end;
#geom_code
👍4🔥3
Инструмент цветовой матрицы
Продолжаю мучить JS. Оторвался на стилях. Наверное, переборщил...
Давно хотел сделать такой инструмент.
Помимо редактирования непосредственно матрицы, есть ряд предопределённых эффектов, с подробным описанием каждого. Если есть интересные матрицы, присылайте, добавлю.
26 предустановленных эффектов:
- Сепия
- Черно-белое
- Негатив
- Усиление красного
- Сдвиг в синий
- Ярче
- Темнее
- Зеленая матрица
- Цианотипия
- Винтаж
- Полароид
- Lomo Эффект
- Инфракрасный
- Кросс-процесс
- Сновидческий
- Янтарный монохром
- Соляризация
- Фильм-нуар
- Техниколор
- Дуплекс
- Винтаж (улучшенный)
- Зелёная матрица (другая)
- Холодный тон
- Тёплый тон
- Высокая контрастность
- Цианотипия (улучшенная)
Ознакомиться с инструментом можно тут
Продолжаю мучить JS. Оторвался на стилях. Наверное, переборщил...
Давно хотел сделать такой инструмент.
Помимо редактирования непосредственно матрицы, есть ряд предопределённых эффектов, с подробным описанием каждого. Если есть интересные матрицы, присылайте, добавлю.
26 предустановленных эффектов:
- Сепия
- Черно-белое
- Негатив
- Усиление красного
- Сдвиг в синий
- Ярче
- Темнее
- Зеленая матрица
- Цианотипия
- Винтаж
- Полароид
- Lomo Эффект
- Инфракрасный
- Кросс-процесс
- Сновидческий
- Янтарный монохром
- Соляризация
- Фильм-нуар
- Техниколор
- Дуплекс
- Винтаж (улучшенный)
- Зелёная матрица (другая)
- Холодный тон
- Тёплый тон
- Высокая контрастность
- Цианотипия (улучшенная)
Ознакомиться с инструментом можно тут
🔥7👍1
Шум Перлина: Разбор алгоритма
Разбор механики этого замечательного изобретения. Где математика становится частью естественного хаоса.
Это не просто математика — это поэзия, воплощенная в коде.
Внутри есть приятный интерактив и непременные исходники.
Приятного чтения!!!
Разбор механики этого замечательного изобретения. Где математика становится частью естественного хаоса.
Это не просто математика — это поэзия, воплощенная в коде.
Внутри есть приятный интерактив и непременные исходники.
Приятного чтения!!!
🔥10
This media is not supported in your browser
VIEW IN TELEGRAM
Перспективная трансформация онлайн
Когда-то озадачился такой вещью, как перспективная трансформация. Теперь дошли руки сделать это онлайн.
- Сохраняет в PNG, фон прозрачный.
- Сохраняет и копирует в размерах оригинального файла.
- Ограничений на размер оригинального файла нет.
Новый инструмент в коллекции - перспективная трансформация
Когда-то озадачился такой вещью, как перспективная трансформация. Теперь дошли руки сделать это онлайн.
- Сохраняет в PNG, фон прозрачный.
- Сохраняет и копирует в размерах оригинального файла.
- Ограничений на размер оригинального файла нет.
Новый инструмент в коллекции - перспективная трансформация
🔥9
Конвертер изображений в черно-белое
Сейчас совсем нет времени на полноценные статьи.
Поэтому, вот новый инструмент для преобразования исходного изображения в градации серого и истинно черно-белое. Умеет менять яркость-контраст-чёткость-резкость исходного изображения. Поддерживает количество градаций серого и дизеринг. Инструмент писать быстрее, чем статью.
Очень хотелось попробовать сделать дизеринг. Это когда в черно-белом изображении, если есть ограничения на используемые цвета (например, в истинно чёрно-белом только два цвета), имитируем градации определёнными узорами. Вот как дама справа на рисунке - там дизеринг, и там всего два цвета.
Инструмент тут...
Сейчас совсем нет времени на полноценные статьи.
Поэтому, вот новый инструмент для преобразования исходного изображения в градации серого и истинно черно-белое. Умеет менять яркость-контраст-чёткость-резкость исходного изображения. Поддерживает количество градаций серого и дизеринг. Инструмент писать быстрее, чем статью.
Очень хотелось попробовать сделать дизеринг. Это когда в черно-белом изображении, если есть ограничения на используемые цвета (например, в истинно чёрно-белом только два цвета), имитируем градации определёнными узорами. Вот как дама справа на рисунке - там дизеринг, и там всего два цвета.
Инструмент тут...
🔥11
Напоминалка: Преобразовать число в строку без SysUtils
Всем нам известны такие функции, как IntToStr, FloatToStr и т.д. Что делать, если использовать SysUtils нельзя или нежелательно? Для этого существует ядерная процедура Str. Про которую не сразу и вспомнишь.
Преобразует целое число или число с плавающей точкой X в строку, с возможностью указания необязательных настроек форматирования. Примеры и описание.
Всем нам известны такие функции, как IntToStr, FloatToStr и т.д. Что делать, если использовать SysUtils нельзя или нежелательно? Для этого существует ядерная процедура Str. Про которую не сразу и вспомнишь.
procedure Str(const X [: Width [:Decimals]]; var S: String);
Преобразует целое число или число с плавающей точкой X в строку, с возможностью указания необязательных настроек форматирования. Примеры и описание.
procedure TForm1.Button1Click(Sender: TObject);
var S: string;
begin
// '123'
Str(123, S); Label1.Caption := S;
// ' 123'
Str(123:30, S); Label2.Caption := S;
// ' 1.23456000000000E+0002'
Str(123.456, S); Label3.Caption := S;
// ' 1.23456000000000000E+0002'
Str(123.456:30, S); Label4.Caption := S;
// ' 123.4560'
Str(123.456:30:4, S); Label5.Caption := S;
end;
🔥3👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Итеративный алгоритм Рамера-Дугласа-Пекера
Дополнил статью итеративным алгоритмом. Мне конечно был милее рекурсивный вариант, но вот возникла необходимость в таком его прочтении. Заодно оптимизировал рекурсивный. Итеративный оказался медленней собрата, поэтому пришлось до кучи оптимизировать и его. Теперь у нас есть три разновидности алгоритма Рамера-Дугласа-Пекера: рекурсивный, итеративный и шустрый.
Всё детально описал. Надеюсь пригодится.
Четыре нюанса реализации...
Переход сразу на итеративный алгоритм...
Дополнил статью итеративным алгоритмом. Мне конечно был милее рекурсивный вариант, но вот возникла необходимость в таком его прочтении. Заодно оптимизировал рекурсивный. Итеративный оказался медленней собрата, поэтому пришлось до кучи оптимизировать и его. Теперь у нас есть три разновидности алгоритма Рамера-Дугласа-Пекера: рекурсивный, итеративный и шустрый.
Всё детально описал. Надеюсь пригодится.
Четыре нюанса реализации...
Переход сразу на итеративный алгоритм...
👍3🔥3
Кроссплатформенная MulDiv для Delphi
Сделал кроссплатформенную версию MulDiv для Delphi, проверил, описал.
Думал, что в 13-ой версии уже есть подобная штука, но нет.
Ради чрезвычайно шустрой Winapi-функции MulDiv приходится отказываться от всяческой кроссплатформенности. Хотелось сделать не только кроссплатформенный аналог, но и разогнать по скорости.
И вот, что у меня получилось:
Кроссплатформенная MulDiv тут...
Сделал кроссплатформенную версию MulDiv для Delphi, проверил, описал.
Думал, что в 13-ой версии уже есть подобная штука, но нет.
Ради чрезвычайно шустрой Winapi-функции MulDiv приходится отказываться от всяческой кроссплатформенности. Хотелось сделать не только кроссплатформенный аналог, но и разогнать по скорости.
И вот, что у меня получилось:
Кроссплатформенная MulDiv тут...
👍5🔥3
Разгоняем кроссплатформенный MulDiv
Теперь наш MulDiv с правильным округлением работает быстрее. А 64 битах работает быстрее оригинального! Peter, спасибо за наводку!
1) MulDiv стала быстрее за счёт небольшой оптимизации;
2) Появилась MulDiv32, более шустрая в 32 битах;
3) Появилась MulDiv64, оглушительно быстрая в 64 битах;
4) Появилась функция MulDivX, использующая преимущества двух предыдущих функций.
Исходник обновлены.
Теперь наш MulDiv с правильным округлением работает быстрее. А 64 битах работает быстрее оригинального! Peter, спасибо за наводку!
1) MulDiv стала быстрее за счёт небольшой оптимизации;
2) Появилась MulDiv32, более шустрая в 32 битах;
3) Появилась MulDiv64, оглушительно быстрая в 64 битах;
4) Появилась функция MulDivX, использующая преимущества двух предыдущих функций.
Исходник обновлены.
👍3🔥2
Эффект стекла: Как смешивать Direct2D эффекты
Пример микса D2D-эффектов: D2D1GaussianBlur + D2D1Brightness [+ D2D1Tile + D2D1ColorMatrix + D2D1Blend].
В обойме эффектов D2D шума нет (если не считать Перлина). Поэтому здесь присутствует два вида шума: рукописный (на битмапах и ScanLine'ах) и с помощью дополнительного микса эффектов D2D (которые в квадратных скобках).
- NoiseD2D переключает режимы;
- Ползунок рядом регулирует шум.
Исходник (294 Кб) Delphi XE7
Прога (x64) (1.5 Мб)
Пример микса D2D-эффектов: D2D1GaussianBlur + D2D1Brightness [+ D2D1Tile + D2D1ColorMatrix + D2D1Blend].
В обойме эффектов D2D шума нет (если не считать Перлина). Поэтому здесь присутствует два вида шума: рукописный (на битмапах и ScanLine'ах) и с помощью дополнительного микса эффектов D2D (которые в квадратных скобках).
- NoiseD2D переключает режимы;
- Ползунок рядом регулирует шум.
Исходник (294 Кб) Delphi XE7
Прога (x64) (1.5 Мб)
🔥6👍1
Друзья! С Новым 0x07EA годом!
Пусть ваши баги будут тривиальными, а тикеты — закрытыми. Желаю нулевых AV на продакшне и своевременного Free для объектов. Пусть красота begin..end не перестаёт радовать глаз, а RAD означал «Реально Адекватный Дедлайн», а не «Ручная Адская Доработка». И пусть Delphi работает стабильнее, чем ваша любовь к Ctrl+Space!
Пусть ваши баги будут тривиальными, а тикеты — закрытыми. Желаю нулевых AV на продакшне и своевременного Free для объектов. Пусть красота begin..end не перестаёт радовать глаз, а RAD означал «Реально Адекватный Дедлайн», а не «Ручная Адская Доработка». И пусть Delphi работает стабильнее, чем ваша любовь к Ctrl+Space!
👍7🔥5